第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

如何在Go中使用文字* int64?我有一個帶*int64字段的結(jié)構(gòu)類型。type SomeType struct {     SomeField *int64}在我的代碼中的某個時刻,我想聲明一個這樣的文字(比如,當我知道所述值應(yīng)為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。這可以在構(gòu)造函數(shù)中使用,或者用于表示文字結(jié)構(gòu)值,或者甚至作為其他函數(shù)的參數(shù)。但幫助函數(shù)或使用不同的類型不是我正在尋找的解決方案。
查看完整描述

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,}


查看完整回答
反對 回復(fù) 2019-08-27
?
catspeake

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),
        }
    }


查看完整回答
反對 回復(fù) 2019-08-27
  • 2 回答
  • 0 關(guān)注
  • 2072 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號