Go 中,指针接收器函数允许您修改接收器对象的值。然而,理解指针在 Go 中的工作原理对于成功实现至关重要。
当尝试通过指针接收器方法修改简单类型的值时,可能会遇到以下情况:更改不会在方法之外持续存在。这是因为所有方法参数(包括接收者)都会在方法执行期间本地复制。
在提供的示例中:
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp }
fi指针参数是 main 中原始 fi 指针的副本。因此,在 FromString 方法中对复制的 fi 指针所做的更改只会影响本地副本,而不影响原始指针。
要解决此问题,有几个选项:
创建一个 return 语句,将更新后的指针分配给接收者,然后在 main 中重新分配返回的指针。
// Return the updated pointer and reassign it in main func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } // Reassign the updated pointer in main func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
将目标类型的非零指针作为参数传递给方法。
// Pass a non-nil pointer as an argument func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } // Create a non-nil pointer and pass it to the method in main func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
修改前检查接收者指针是否为非零。
// Check if the receiver is non-nil before modifying func (fi *FooInt) FromString(i string) { if fi == nil { return } num, _ := strconv.Atoi(i) *fi = FooInt(num) } // Create a non-nil receiver in main func main() { fi := new(FooInt) fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
以上是Go中如何通过指针接收器方法修改值?的详细内容。更多信息请关注PHP中文网其他相关文章!