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

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

如何通過 Go 中的指針接收器方法修改簡單類型的值?

如何通過 Go 中的指針接收器方法修改簡單類型的值?

Go
SMILET 2022-06-01 18:01:27
我想有一個基于基本類型的自定義類型,并能夠通過調(diào)用指針接收器來設置它的值。當我運行以下程序時:package mainimport (    "fmt"    "strconv")type FooInt intfunc (fi *FooInt) FromString(i string) {    num, _ := strconv.Atoi(i)    tmp := FooInt(num)    fi = &tmp}func main() {    var fi *FooInt    fi.FromString("5")    fmt.Printf("%v\n", fi)}我收到<nil>。為什么聲明的指針不將main()其值更改為的地址tmp?
查看完整描述

2 回答

?
婷婷同學_

TA貢獻1844條經(jīng)驗 獲得超8個贊

所有參數(shù)(包括接收者)都是函數(shù)/方法內(nèi)部的副本。您只能修改副本。


這也適用于指針:接收器值(fi指針)是副本,因此您不能修改原始指針,只能修改副本。


通常接收者是一個非nil指針,而你修改了指向的值——這會導致原來的指向值改變。


在您的情況下,您要么必須返回指針并分配返回值:


func (fi *FooInt) FromString(i string) *FooInt {

    num, _ := strconv.Atoi(i)

    tmp := FooInt(num)

    return &tmp

}


func main() {

    var fi *FooInt

    fi = fi.FromString("5")

    fmt.Printf("%v %v\n", fi, *fi)

}

這將輸出(在Go Playground上嘗試):


0xc0000b4020 5

或者將非nil指針傳遞給您要更改的內(nèi)容,在您的情況下,它將是類型**FooInt


func (fi *FooInt) FromString(i string, p **FooInt) {

    num, _ := strconv.Atoi(i)

    tmp := FooInt(num)

    *p = &tmp

}


func main() {

    var fi *FooInt

    fi.FromString("5", &fi)

    fmt.Printf("%v %v\n", fi, *fi)

}

這輸出相同。在Go Playground上嘗試一下。


但最簡單的方法是確保接收器不是nil,因此可以簡單地修改指向的值:


func (fi *FooInt) FromString(i string) {

    num, _ := strconv.Atoi(i)

    *fi = FooInt(num)

}


func main() {

    var fi *FooInt

    fi = new(FooInt)

    fi.FromString("5")

    fmt.Printf("%v %v\n", fi, *fi)

}

輸出是一樣的。在Go Playground上試試這個。



查看完整回答
反對 回復 2022-06-01
?
慕的地8271018

TA貢獻1796條經(jīng)驗 獲得超4個贊

語法:


func (fi *FooInt) FromString(i string) {

    // ...

}

部分是語法糖:


func FromString(fi *fooInt, i string) {

    // ...

}

也就是fi這里的參數(shù)是一個普通的局部變量。如果分配給它,則替換調(diào)用者提供的指針值,而不是通過調(diào)用者提供的指針值寫入。因此,您需要使用:


    *fi = FooInt(num)

在函數(shù)體中。但是,現(xiàn)在調(diào)用者必須傳遞一個非零指針:


var fi FooInt

fi.FromString("5")

例如。


這是一個完整的示例,包括一個可以調(diào)用FromString函數(shù)并傳遞顯式指針的方法。


(我說部分語法糖,因為它定義FromString為接收器函數(shù)或方法,只能使用這種語法來完成。所以語法是必需的——它不是其他語法的替代品,正如人們有時在使用短語“語法”時所說的那樣糖”。)


查看完整回答
反對 回復 2022-06-01
  • 2 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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