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

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

為什么變量的內聯實例化需要顯式取它的地址來調用指針方法,而對于現有的變量,它的隱含

為什么變量的內聯實例化需要顯式取它的地址來調用指針方法,而對于現有的變量,它的隱含

Go
慕娘9325324 2021-08-16 15:20:25
這種行為有原因嗎?我想知道內存級別有什么不同。編譯器返回“無法獲取復合文字的地址”,而我可以明確要求它這樣做。u := User{"john"}fmt.Println(u.Name()) //implicit//fmt.Println(User{"john"}.Name()) //Error: cannot call pointer method on composite literal, cannot take the address of composite literalfmt.Println((&User{"jim"}).Name()) //explicittype User struct {    name string}func (u *User) Name() string {    return u.name}
查看完整描述

2 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

因為復合文字在被分配給變量之前是不可尋址的:


操作數必須是可尋址的,即變量、指針間接或切片索引操作;或可尋址結構操作數的字段選擇器;或可尋址數組的數組索引操作。

作為可尋址性要求的一個例外,x 也可以是(可能帶括號的)復合文字。


您可以將地址帶到User{"jim"}:((&User{"jim"})字面指針)。

但是你不能直接使用User{"jim"}(literal value,直到它被分配給一個變量) 的值。

在此線程中查看更多信息。


此線程增加了“表達式無法解決”問題:


取某個東西的地址,直到這個假設點是不可尋址的(一個不碰巧根植于標識符的表達式),在語義上與設置目標指針的解引用值沒有什么不同。

換句話說,以下內容是等效的:


var x *int

*x = (2 * 3) + 4


var x *int

x = &((2 * 3) + 4)

由于表達式一使用就被丟棄,其值的地址(通常完全是寄存器駐留的,因此實際上沒有地址)在任何情況下都是完全沒有意義的,而使用它的唯一好處是address 是變量聲明中類型推斷的語法便利(最多保存一行):


x := &((2 * 3) + 4)

使任意表達式可尋址的問題:


m := map[int]int{1:2}

x := &m[1]

x = 3

fmt.Println("x is", x, "while m[1] is", m[1])

// will print `x is 3 while m[1] is 2`

簡而言之:不清楚(并且幾乎不可能調試)您是否正在獲取您期望可尋址的地址,或者當您獲取隱式中間變量的地址(這通常是您不想)。


查看完整回答
反對 回復 2021-08-16
  • 2 回答
  • 0 關注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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