gpt4 book ai didi

pointers - 如何在Go中通过指针接收器方法修改简单类型的值?

转载 作者:行者123 更新时间:2023-12-01 20:23:12 25 4
gpt4 key购买 nike

我希望有一个基于基本类型的自定义类型,并能够通过调用指针接收器来设置其值。

当我运行以下程序时:

package main

import (
"fmt"
"strconv"
)

type FooInt int
func (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的地址?

这是一个 Go playground link

最佳答案

所有参数(包括接收器)都是函数/方法中的副本。您只能修改副本。

这也适用于指针:接收器值(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指针传递给您要更改的内容,在这种情况下,其类型为 **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上尝试这个。

关于pointers - 如何在Go中通过指针接收器方法修改简单类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61761945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com