Go排坑小記

本博文主要記錄一些go學習中一些小坑。但是不會一個系統性的文章。、

1. import後面的最後一個元素是包名。這一說法是否正確。

答案:這是錯的。import後面的最後一個元素應該是路徑,就是目錄,並非包名。
爲此我專門寫了一個包試一下。我將包的文件夾名字命名爲tested然後把包名定義爲foo。然後在main進行調用。發現並不能根據路徑名tested調用,而只能使用foo調用。

// GOPTAH/src/tested
package foo

import "fmt"

func Foo()  {
	fmt.Println("in tested file")
}

測試代碼:

package main

import (
	"tested"
)

func main()  {
	//tested.Foo()  // 錯誤編譯器會提醒
	foo.Foo()
	
}
2. map一定要使用make分配內存後才能使用。
var list []int
list = append(list, 0)

var m map[string]int
m["one"] = 1 // 錯誤的,沒有使用make

當然兩者都可以用make

3. 對於常量賦值,絕對不能使用函數或者方法來初始化。

常量初始化的時候,其右值必須是一個常量表達式,而不應該是函數調用。比如1<<318^9這種就是常量表達式。而像math.Sin(math.Pi/4)這種是函數調用,其值是在程序運行時纔會得到,而不是在編譯時。itoa自動推導不屬於函數調用,是由編譯器實現的,因此也能用於常量的初始化。

ps:這一點在《Effective Go》中也有提到。經典的書還是要常翻常新啊

4. 指針對象也能夠被JSON格式化。

這個主要利用到了Go能夠對指針隱式轉換。
對於隱式轉換的使用,最常見的就是方法的接受者可以是指針也可以不是。如果一個對象是不是指針對象,但它有指針接受者的方法,那麼其也可以使用該方法。
一句話總結就是無論什麼的變量是普通的類型還是指針類型,或者實現的方法的接收器是普通類型還是指針類型,都可以通過點.來訪問定義的方法

type MyInt int

// 接受器i是一個指針類型
func (i *MyInt) pAdd(x int) MyInt {
	// 因爲x和i雖然底層變量是一樣的,但是其實是兩種不同的變量了,所以不能直接相加,詳見2.5類型
	return *i + MyInt(x)
}

// 接收器i只是一個普通類型
func (i MyInt) Add(x int) MyInt {
	return i + MyInt(x)
}

func main() {
	i := MyInt(20)
	pi := &i
	// 以下都正確
	fmt.Println(i.Add(1))		// 21
	fmt.Println(i.pAdd(2))		// 22
	fmt.Println(pi.Add(3))		// 23
	fmt.Println(pi.pAdd(4))		// 24
}
4. nil只能賦值給指針、channel、func、interface、map或slice類型的變量。如果將nil賦值給其他變量的時候將會引發panic。
5. 使用聲明語句聲明空切片
var num1 []int      	
m2 := make([]int, 0)

對上面的兩種變量使用append,len,cap效果是一樣的。

6. key value := range slice中的value的地址是保持不變的,也就是說value是對slice中元素的拷貝,而不是引用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章