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

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

如何在Go中使用文字* int64?

如何在Go中使用文字* int64?

如何在Go中使用文字* int64?我有一個帶*int64字段的結構類型。type SomeType struct {     SomeField *int64}在我的代碼中的某個時刻,我想聲明一個這樣的文字(比如,當我知道所述值應為0,或者指向0時,你知道我的意思)instance := SomeType{     SomeField: &0,}...除了這不起作用./main.go:xx: cannot use &0 (type *int) as type *int64 in field value所以我試試這個instance := SomeType{     SomeField: &int64(0),}......但這也行不通./main.go:xx: cannot take the address of int64(0)我該怎么做呢?我能想出的唯一解決方案是使用占位符變量var placeholder int64 placeholder = 0instance := SomeType{     SomeField: &placeholder,}注意:當它是* int而不是a時,&0語法工作正常*int64。編輯:不,不。為此表示歉意。編輯:顯然,我的問題含糊不清。我正在尋找一種方法來說明一個*int64。這可以在構造函數中使用,或者用于表示文字結構值,或者甚至作為其他函數的參數。但幫助函數或使用不同的類型不是我正在尋找的解決方案。
查看完整描述

2 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

Go語言規范(地址運算符)不允許獲取數字常量的地址(不是類型的常量,也不是類型常量的地址)。

操作數必須是可尋址的,即,變量,指針間接或切片索引操作; 或可尋址結構操作數的字段選擇器; 或者可尋址數組的數組索引操作。作為可尋址性要求的一個例外,x[在表達式中&x]也可以是(可能帶括號的)復合文字。

為了推理為什么不允許這樣做,請參閱相關問題:在go中查找常量的地址。一個類似的問題(同樣不允許取其地址):如何在Go中存儲對操作結果的引用?

您的選擇(在Go Playground嘗試所有):

1)有 new()

您可以簡單地使用內置new()函數來分配新的零值int64并獲取其地址:

instance := SomeType{
    SomeField: new(int64),}

但請注意,這只能用于分配和獲取指向任何類型的零值的指針。

2)使用輔助變量

對于非零元素,最簡單和推薦的是使用可以獲取其地址的輔助變量:

helper := int64(2)instance2 := SomeType{
    SomeField: &helper,}

3)具有輔助功能

或者如果你需要這么多次,你可以創建一個輔助函數,它分配并返回一個*int64

func create(x int64) *int64 {
    return &x}

并使用它:

instance3 := SomeType{
    SomeField: create(3),}

請注意,我們實際上沒有分配任何東西,當我們返回函數參數的地址時,Go編譯器會這樣做。Go編譯器執行轉義分析,并在堆(而不是堆棧)上分配局部變量(如果它們可能會轉義函數)。有關詳細信息,請參閱在Go函數中返回一個本地數組的片段是否安全?

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

這里發生的是一個[]int64切片用文字創建,有一個元素(5)。并且它被索引(第0個元素)并且取第0個元素的地址。在后臺,[1]int64還將分配一個數組并將其用作切片的后備數組。所以這里有很多樣板。

6)使用輔助結構文字

讓我們檢查可尋址性要求的例外情況:

作為可尋址性要求的一個例外,x[在表達式中&x]也可以是(可能帶括號的)復合文字。

這意味著獲取復合文字的地址,例如結構文字是可以的。如果我們這樣做,我們將分配結構值并獲得指針。但如果是這樣,我們將可以使用另一個要求:“可尋址結構操作數的字段選擇器”。因此,如果struct literal包含一個類型的字段int64,我們也可以獲取該字段的地址!

讓我們看看這個選項的實際效果。我們將使用這個包裝結構類型:

type intwrapper struct {
    x int64}

現在我們可以做到:

instance6 := SomeType{
    SomeField: &(&intwrapper{6}).x,}

請注意這一點

&(&intwrapper{6}).x

表示以下內容:

& ( (&intwrapper{6}).x )

但是我們可以省略“外部”括號,因為地址運算符&應用于選擇器表達式的結果。

另請注意,在后臺會發生以下情況(這也是一種有效的語法):

&(*(&intwrapper{6})).x

7)使用幫助程序匿名struct literal

原理與案例#6相同,但我們也可以使用匿名struct literal,因此不需要helper / wrapper struct type定義:

instance7 := SomeType{
    SomeField: &(&struct{ x int64 }{7}).x,}


查看完整回答
反對 回復 2019-08-27
?
catspeake

TA貢獻1111條經驗 獲得超0個贊

使用返回int64變量地址的函數將解決問題。

在下面的代碼中,我們使用函數f接受整數并返回一個保存整數地址的指針值。通過使用這種方法,我們可以輕松地解決上述問題。

 type myStr struct {
        url *int64    }

    func main() {

        f := func(s int64) *int64 {
            return &s        }
        myStr{
            url: f(12345),
        }
    }


查看完整回答
反對 回復 2019-08-27
  • 2 回答
  • 0 關注
  • 2092 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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