<分区>
除了关于是否应该使用单例的任何讨论(是的,我知道,反模式,我已经选择不使用它),我很困惑为什么这不起作用。我尝试在单例实例中设置状态,但我的方法实际上并未修改主实例。
保留的是我在实例化单例时传递的任何初始化。
起初我以为这是一个嵌套的结构问题,因为我从 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}}