首页 > 后端开发 > Golang > 为什么Go中通过指针接收器方法修改简单类型没有达到预期效果?

为什么Go中通过指针接收器方法修改简单类型没有达到预期效果?

Patricia Arquette
发布: 2024-11-16 12:29:03
原创
258 人浏览过

Why Does Modifying a Simple Type Through a Pointer Receiver Method in Go Not Work as Expected?

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

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