登录
首页 >  Golang >  Go问答

如何通过 Go 中的指针接收器方法修改简单类型的值?

来源:Golang技术栈

时间:2023-04-11 19:16:55 474浏览 收藏

积累知识,胜过积蓄金银!毕竟在##column_title##开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何通过 Go 中的指针接收器方法修改简单类型的值?》,就带大家讲解一下golang知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我想有一个基于基本类型的自定义类型,并能够通过调用指针接收器来设置它的值。

当我运行以下程序时:

package main

import (
    "fmt"
    "strconv"
)

type FooInt int
func (fi *FooInt) FromString(i string) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    fi = &tmp
}

func main() {
    var fi *FooInt
    fi.FromString("5")
    fmt.Printf("%v\n", fi)
}

我收到。为什么声明的指针不将main()其值更改为的地址tmp

这是一个Go 游乐场链接。

正确答案

所有参数——包括接收者——都是函数/方法内的副本。您只能修改副本。

这也适用于指针:接收器值(fi指针)是副本,因此您不能修改原始指针,只能修改副本。

通常接收者是一个非nil指针,而你修改了 指向 的值——这会导致原来的指向值改变。

在您的情况下,您要么必须返回指针并分配返回值:

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.Printf("%v %v\n", fi, *fi)
}

这将输出(在Go Playground上尝试):

0xc0000b4020 5

或者将非nil指针传递给您要更改的内容,在您的情况下,它将是类型**FooInt

func (fi *FooInt) FromString(i string, p **FooInt) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    *p = &tmp
}

func main() {
    var fi *FooInt
    fi.FromString("5", &fi)
    fmt.Printf("%v %v\n", fi, *fi)
}

这输出相同。在Go Playground上尝试一下。

但最简单的方法是确保接收器不是nil,因此可以简单地修改指向的值:

func (fi *FooInt) FromString(i string) {
    num, _ := strconv.Atoi(i)
    *fi = FooInt(num)
}

func main() {
    var fi *FooInt
    fi = new(FooInt)
    fi.FromString("5")
    fmt.Printf("%v %v\n", fi, *fi)
}

输出是一样的。在Go Playground上试试这个。

终于介绍完啦!小伙伴们,这篇关于《如何通过 Go 中的指针接收器方法修改简单类型的值?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表