本博文主要記錄一些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<<3
,18^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
效果是一樣的。