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

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

Patricia Arquette
Patricia Arquette原创
2024-11-16 12:29:03237浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn