首页 > 后端开发 > Golang > 正文

Go中如何通过指针接收器方法修改值?

Mary-Kate Olsen
发布: 2024-11-14 21:52:02
原创
936 人浏览过

How to Modify Values Through Pointer Receiver Methods in Go?

Go 中的指针接收器方法和值修改

Go 中,指针接收器函数允许您修改接收器对象的值。然而,理解指针在 Go 中的工作原理对于成功实现至关重要。

问题解决

当尝试通过指针接收器方法修改简单类型的值时,可能会遇到以下情况:更改不会在方法之外持续存在。这是因为所有方法参数(包括接收者)都会在方法执行期间本地复制。

方法参数复制

在提供的示例中:

func (fi *FooInt) FromString(i string) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    fi = &tmp
}
登录后复制

fi指针参数是 main 中原始 fi 指针的副本。因此,在 FromString 方法中对复制的 fi 指针所做的更改只会影响本地副本,而不影响原始指针。

解决方案

要解决此问题,有几个选项:

  1. 返回更新后的指针:

创建一个 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
}
登录后复制
  1. 传递一个非零指针:

将目标类型的非零指针作为参数传递给方法。

// 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
}
登录后复制
  1. 确保接收者非零:

修改前检查接收者指针是否为非零。

// 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板