亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有 nil 的指針函數接收器是否安全?

帶有 nil 的指針函數接收器是否安全?

Go
慕田峪7331174 2022-06-06 15:02:02
懸停在 上時t1.Print(),我的 IDE 抱怨:接聽者“t”可能在通話中“無”更詳細地說:使用“nil”接收器的方法調用可能導致“nil 指針取消引用”但是在玩弄了代碼之后,我似乎無法獲得nil pointer dereference error. 我錯過了什么?我怎樣才能導致該錯誤?type T []stringfunc (t *T) Print() {    log.Print(t)    log.Print(*t)    log.Print(&t)    log.Print(&(*t))}func main() {    var t1 T    t1.Print()}
查看完整描述

1 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

您沒有收到 nil 指針取消引用錯誤,因為此程序中沒有 nil 指針。

var t1 T初始化 type 的值T,它不是指針類型。因為 Print 方法有一個指針接收器,所以方法調用t1.Print()會自動重寫為(&t1).Print()

如果 x 的(類型)的方法集包含 m 并且參數列表可以分配給 m 的參數列表,則方法調用 xm() 是有效的。如果 x 是可尋址的并且 &x 的方法集包含 m,則 xm() 是 (&x).m() 的簡寫

https://golang.org/ref/spec#Calls

&t1是*T類型,是指針類型,但指針不是nil。乍一看,這可能令人困惑,因為 t1 實際上是 nil(一個 nil 切片),但尋址一個 nil 切片是完全合法的:

type T []string


func main() {

    var t1 T


    fmt.Println(t1 == nil)  // true (nil slice)

    fmt.Println(&t1 == nil) // false (non-nil pointer to nil slice)

}

https://play.golang.org/p/i-I0PYsjLew


為了引起恐慌,接收者本身必須為 nil(而不是指向某個 nil 值):


type T []string


func (t *T) Print() {

    log.Print(t)

    log.Print(*t) // panic: runtime error: invalid memory address or nil pointer dereference

}


func main() {

    var t1 *T // nil pointer

    t1.Print()

}

https://play.golang.org/p/9whVZgeAGnI


請注意,恐慌發生在方法內部,而不是調用方法的地方。這與 Java、C++、C# 等其他語言不同,在這些語言中,方法調用構成指針取消引用。在 Go 中情況并非如此。


查看完整回答
反對 回復 2022-06-06
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號