go - Go中应该如何设置单例状态? (或者,为什么这不起作用?)

标签 go singleton state

<分区>

除了关于是否应该使用单例的任何讨论(是的,我知道,反模式,我已经选择不使用它),我很困惑为什么这不起作用。我尝试在单例实例中设置状态,但我的方法实际上并未修改主实例。

保留的是我在实例化单例时传递的任何初始化。

起初我以为这是一个嵌套的结构问题,因为我从 foo 中的 bar 开始,但后来发现它对原始 val

在偶然的情况下,我在 Mac OS Mojave 上运行 Go 1.12.7。

package main

import (
    "fmt"
    "sync"
)

type foo struct {
    val   int
    state bar
}

type bar struct {
    inner int
}

var singleton *foo
var once sync.Once

func GetFoo() *foo {
    once.Do(func() {
        singleton = &foo{
            state: bar{inner: 0},
        }
    })
    return singleton
}

func (f foo) SetState() {
    f.val = 1
    f.state.inner = 1
}

func main() {

    f := GetFoo()
    fmt.Println(f)
    f.SetState()
    fmt.Println(f)

}

我希望这个输出:

&{0 {0}}
&{1 {1}}

相反,我得到:

&{0 {0}}
&{0 {0}}

最佳答案

Cerise 立即发现了它。我没有意识到方法接收器在 Go 中本质上是按值传递的。因此,要修复此示例,只需将 SetState 签名更改为 (f *foo) SetState()

关于go - Go中应该如何设置单例状态? (或者,为什么这不起作用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57564929/

相关文章:

java - 使用公共(public)构造函数在java中创建一个单例类

docker - docker是无状态的吗?

go - 想要选择一个随机数并且在所有数字都通过之前不要再次选择它

api - 如何为 Kubernetes 准入 Controller 编写响应

java - 对于这种情况,是单例,工厂还是其他更好的东西?

c# - 单例是否通过不同的应用程序共享?

java - 如何正确设计具有内部条件转换的游戏状态机

javascript - 使用本地静态站点维护状态

go - Terraform Schema Elem 支持多种类型吗?

string - 在golang中使用==符号和使用循环比较字符串a是否等于字符串b,哪个性能更好?