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`
簡而言之:不清楚(并且幾乎不可能調試)您是否正在獲取您期望可尋址的地址,或者當您獲取隱式中間變量的地址(這通常是您不想)。
- 2 回答
- 0 關注
- 248 瀏覽
添加回答
舉報