注意問題 , 當對interface變量進行判斷是否爲nil時 , 只有當動態類型和動態值都是nil , 這個變量纔是nilide
下面這種狀況不是nil函數
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之間進行比較也要注意 blog
當兩個變量的動態類型同樣 , 動態值存的是指針地址 , 這個地址若是不是同樣的 , 那兩個值也是不一樣的內存
w1 := errors.New("ERR") w2 := errors.New("ERR") fmt.Println(w1 == w2) // 輸出false
因爲 w1.value 和 w2.value 都是指針類型,它們又分別保存着不一樣的內存地址,因此他們的比較是得出 falseit
也正是這種實現,每一個New函數的調用都分配了一個獨特的和其餘錯誤不相同的實例io