注意問題 , 當對interface變量進行判斷是否爲nil時 , 只有當動態類型和動態值都是nil , 這個變量纔是nil函數
下面這種狀況不是nilspa
func f(out io.Writer) { // ...do something... if out != nil { out.Write([]byte("done!\n")) } } var buf *bytes.Buffer f(buf)
上面的狀況 , 動態類型部分不是nil , 所以 out就不是nil指針
動態類型爲指針的interface之間進行比較也要注意 code
當兩個變量的動態類型同樣 , 動態值存的是指針地址 , 這個地址若是不是同樣的 , 那兩個值也是不一樣的blog
w1 := errors.New("ERR")
w2 := errors.New("ERR") fmt.Println(w1 == w2) // 輸出false
因爲 w1.value 和 w2.value 都是指針類型,它們又分別保存着不一樣的內存地址,因此他們的比較是得出 false內存
也正是這種實現,每一個New函數的調用都分配了一個獨特的和其餘錯誤不相同的實例it