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上試試這個。

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ù)或方法,只能使用這種語法來完成。所以語法是必需的——它不是其他語法的替代品,正如人們有時在使用短語“語法”時所說的那樣糖”。)
- 2 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報