[Go] golang中接口值(interface)與nil比較或指針類型之間比較的注意問題

注意問題 , 當對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函數的調用都分配了一個獨特的和其他錯誤不相同的實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章