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