当前位置:  开发笔记 > 编程语言 > 正文

为什么Go函数字段设置器不保留功能?

如何解决《为什么Go函数字段设置器不保留功能?》经验,为你挑选了1个好方法。

鉴于这个简短的计划:

package main

import "fmt"

type Foo struct {
    doer func()
}

func (f Foo) SetDoer(doer func()) {
    f.doer = doer
}

func main() {
    foo := Foo{func() { fmt.Println("original") }}
    foo.doer()
    foo.SetDoer(func() { fmt.Println("replacement") })
    foo.doer()
}

输出是:

original
original

我原以为是:

original
replacement

为什么不呢?请注意,如果我foo.doer直接设置,输出是预期的main().如果我使用这种SetDoer方法就不行.



1> evanmcdonnal..:

在Go中,函数名左侧的项是接收类型.这是可以调用函数的类型.但是,接收器既可以是指针,也可以是值类型.在这种情况下,它是一个值.接收器纯粹是为了组织的目的,在封面下,它像任何其他参数一样传递给函数.您正在传递值,因此foo传入一个副本,SetDoer修改该值,然后设置器返回,该值超出范围,并且在调用范围内您正在使用原始值.

试试这个;

// make the receiver a pointer
func (f *Foo) SetDoer(doer func()) {
    f.doer = doer
}
// instantiate as pointer
foo := &Foo{func() { fmt.Println("original") }}
foo.SetDoer(func() { fmt.Println("replacement") })
// now the version of doer on foo has been updated.

游乐场示例; https://play.golang.org/p/ZQlvKiluu3


注意,实例化为指针是不必要的.`foo:= Foo {...}`也可以.重要的是使用指针接收器.
请记住,更改状态的方法必须接收指针.如果它没有改变状态,接收值就更清楚了.
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有