2 回答

TA貢獻1836條經(jīng)驗 獲得超5個贊
Go語言規(guī)范(地址運算符)不允許獲取數(shù)字常量的地址(不是無類型的常量,也不是類型常量的地址)。
操作數(shù)必須是可尋址的,即,變量,指針間接或切片索引操作; 或可尋址結(jié)構(gòu)操作數(shù)的字段選擇器; 或者可尋址數(shù)組的數(shù)組索引操作。作為可尋址性要求的一個例外,
x
[在表達式中&x
]也可以是(可能帶括號的)復(fù)合文字。
為了推理為什么不允許這樣做,請參閱相關(guān)問題:在go中查找常量的地址。一個類似的問題(同樣不允許取其地址):如何在Go中存儲對操作結(jié)果的引用?
您的選擇(在Go Playground嘗試所有):
1)有 new()
您可以簡單地使用內(nèi)置new()
函數(shù)來分配新的零值int64
并獲取其地址:
instance := SomeType{ SomeField: new(int64),}
但請注意,這只能用于分配和獲取指向任何類型的零值的指針。
2)使用輔助變量
對于非零元素,最簡單和推薦的是使用可以獲取其地址的輔助變量:
helper := int64(2)instance2 := SomeType{ SomeField: &helper,}
3)具有輔助功能
或者如果你需要這么多次,你可以創(chuàng)建一個輔助函數(shù),它分配并返回一個*int64
:
func create(x int64) *int64 { return &x}
并使用它:
instance3 := SomeType{ SomeField: create(3),}
請注意,我們實際上沒有分配任何東西,當我們返回函數(shù)參數(shù)的地址時,Go編譯器會這樣做。Go編譯器執(zhí)行轉(zhuǎn)義分析,并在堆(而不是堆棧)上分配局部變量(如果它們可能會轉(zhuǎn)義函數(shù))。有關(guān)詳細信息,請參閱在Go函數(shù)中返回一個本地數(shù)組的片段是否安全?
4)具有單行匿名功能
instance4 := SomeType{ SomeField: func() *int64 { i := int64(4); return &i }(),}
或者作為(較短的)替代方案:
instance4 := SomeType{ SomeField: func(i int64) *int64 { return &i }(4),}
5)使用切片文字,索引和獲取地址
如果你想要*SomeField
不是0
,那么你需要一些可尋址的東西。
你仍然可以這樣做,但那很難看:
instance5 := SomeType{ SomeField: &[]int64{5}[0],}fmt.Println(*instance2.SomeField) // Prints 5
這里發(fā)生的是一個[]int64
切片用文字創(chuàng)建,有一個元素(5
)。并且它被索引(第0個元素)并且取第0個元素的地址。在后臺,[1]int64
還將分配一個數(shù)組并將其用作切片的后備數(shù)組。所以這里有很多樣板。
6)使用輔助結(jié)構(gòu)文字
讓我們檢查可尋址性要求的例外情況:
作為可尋址性要求的一個例外,
x
[在表達式中&x
]也可以是(可能帶括號的)復(fù)合文字。
這意味著獲取復(fù)合文字的地址,例如結(jié)構(gòu)文字是可以的。如果我們這樣做,我們將分配結(jié)構(gòu)值并獲得指針。但如果是這樣,我們將可以使用另一個要求:“可尋址結(jié)構(gòu)操作數(shù)的字段選擇器”。因此,如果struct literal包含一個類型的字段int64
,我們也可以獲取該字段的地址!
讓我們看看這個選項的實際效果。我們將使用這個包裝結(jié)構(gòu)類型:
type intwrapper struct { x int64}
現(xiàn)在我們可以做到:
instance6 := SomeType{ SomeField: &(&intwrapper{6}).x,}
請注意這一點
&(&intwrapper{6}).x
表示以下內(nèi)容:
& ( (&intwrapper{6}).x )
但是我們可以省略“外部”括號,因為地址運算符&
應(yīng)用于選擇器表達式的結(jié)果。
另請注意,在后臺會發(fā)生以下情況(這也是一種有效的語法):
&(*(&intwrapper{6})).x
7)使用幫助程序匿名struct literal
原理與案例#6相同,但我們也可以使用匿名struct literal,因此不需要helper / wrapper struct type定義:
instance7 := SomeType{ SomeField: &(&struct{ x int64 }{7}).x,}

TA貢獻1111條經(jīng)驗 獲得超0個贊
使用返回int64變量地址的函數(shù)將解決問題。
在下面的代碼中,我們使用函數(shù)f接受整數(shù)并返回一個保存整數(shù)地址的指針值。通過使用這種方法,我們可以輕松地解決上述問題。
type myStr struct { url *int64 } func main() { f := func(s int64) *int64 { return &s } myStr{ url: f(12345), } }
添加回答
舉報