为了账号安全,请及时绑定邮箱和手机立即绑定

在 go 例程中更新后未返回更新值

在 go 例程中更新后未返回更新值

Go
慕码人8056858 2023-04-17 15:00:35
我遇到了一个问题,即返回的整数值与一组相同,即使在 go 子例程中更新了值之后也是如此。我似乎无法弄清楚出了什么问题。//HostUptimeReporter - structtype HostUptimeReporter struct {    updateInterval int    uptime int    shutdownSignal chan bool}//NewHostUpTimeReporter - create reporter instancefunc NewHostUpTimeReporter(updateIntervalInSeconds int) HostUptimeReporter {    instance := HostUptimeReporter{updateInterval: updateIntervalInSeconds, shutdownSignal: make(chan bool), uptime:59}    ticker := time.NewTicker(time.Duration(updateIntervalInSeconds) * time.Second)    go func() {        for {            select {            case <-ticker.C:                instance.uptime += updateIntervalInSeconds                          fmt.Printf("updated uptime:%v\n", instance.uptime)            case <-instance.shutdownSignal:                ticker.Stop()                return            }        }    }()    return instance}//Shutdown - shuts down the go routinefunc (hupr *HostUptimeReporter) Shutdown(){    hupr.shutdownSignal <- true}func main() {    hurp := NewHostUpTimeReporter(2)    defer hurp.Shutdown()    fmt.Printf("current uptime:%v\n", hurp.uptime)    time.Sleep(3*time.Second)    fmt.Printf("new uptime:%v\n", hurp.uptime)}https://play.golang.org/p/ODjSBb0YugK任何指针表示赞赏。
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

启动 goroutine 的函数返回一个HostUptimeReporter:


func NewHostUpTimeReporter(updateIntervalInSeconds int) HostUptimeReporter {

像这样返回一个完整的结构会返回该结构的副本,因此 goroutine 和调用NewHostUpTimeReporter者正在查看不同的东西。你想返回一个指针以便他们共享数据:


// -----------------------------------------------------v

func NewHostUpTimeReporter(updateIntervalInSeconds int) *HostUptimeReporter {

    instance := &HostUptimeReporter{updateInterval: updateIntervalInSeconds, shutdownSignal: make(chan bool), uptime:59}

    // ---------^

    ...


查看完整回答
反对 回复 2023-04-17
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信