如何在 Go 中通过指针接收器方法修改简单类型的值
在基于基本类型使用自定义类型时,您可能想要使用指针接收函数修改它们的值。但是,当您尝试这样做时,您可能会遇到更改似乎无效的情况。这里有详细的解释:
问题
考虑以下代码:
package main import "fmt" type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp // Attempting to modify the pointer } func main() { var fi *FooInt fi.FromString("5") fmt.Println(fi) // Prints nil }
当你运行这个程序时,你会注意到尽管 FromString 方法尝试更改 fi 的值,但它仍然为零。
说明
在 Go 中,所有函数参数(包括接收者)都是按值传递的。这意味着在 FromString 方法内部,fi 指针是 main 中声明的实际指针的副本。当您在方法中修改 fi 时,您只是修改了副本,而不是原始指针。
要解决此问题,您有两个选择:
1。返回修改后的指针
您可以从 FromString 方法返回修改后的指针并将其分配回原始指针:
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.Println(fi) // Prints the address of the modified pointer }
2.确保接收器为非零
或者,您可以在尝试修改指向的值之前确保接收器不为零:
func (fi *FooInt) FromString(i string) { if fi == nil { fi = new(FooInt) // Initialize fi if it's nil } num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { var fi *FooInt fi.FromString("5") fmt.Println(fi) // Prints the address of the modified pointer }
这可确保接收器为
综上所述,在 Go 中通过指针接收者方法修改值时,请记住接收者是副本,你必须返回修改后的指针或确保接收者是非零以避免意外行为。
以上是为什么Go中通过指针接收器方法修改简单类型没有达到预期效果?的详细内容。更多信息请关注PHP中文网其他相关文章!