登录
首页 >  Golang >  Go问答

在 Go 切片中不可更改结构体变量

来源:stackoverflow

时间:2024-03-14 11:36:23 188浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《在 Go 切片中不可更改结构体变量》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我的代码已运行,但是当我尝试将 slice 的值更改为属性 count 时,该值不会改变。

我更改了 ip 值,因为它们是内部的。我怎么说这段代码是运行的,他还有更多其他功能可以发送电子邮件,但它们不会产生问题。

func testeLink() {
    naves := []nave{
        nave{"SC", "111.11.11.111", 0},
        nave{"MA", "222.2.222.2", 0},
        nave{"PE", "333.33.33.33", 0}}

    sliceLength := len(naves)

    var wg sync.WaitGroup
    wg.Add(sliceLength)

    for i := range naves {
        go func(nave nave) {

            out, _ := exec.Command("ping", nave.ip, "-c 1 -w 1").Output()
            //out, _ := exec.Command("ping", "192.168.0.111", "-c 1", "-i 3", "-w 10").Output()
            if strings.Contains(string(out), "0 received") || strings.Contains(string(out), "Received = 0") {
                fmt.Print(naves[i].count)
                nave.count++

                fmt.Print(nave.count)
                fmt.Printf("A nave <%s> está OFFline \n", nave.name)

                if nave.count >= 3 {
                    enviarEmail(nave.name)
                }
            } else {
                nave.count = 0
                fmt.Printf("A nave <%s> está ONline \n", nave.name)

            }
            defer wg.Done()
        }(naves[i])

    }
    wg.Wait()
}

func main() {

    for {
        testeLink()
        fmt.Println("Aguardando o tempo ...")
        time.Sleep(5 * time.Second)
    }
}

解决方案


您的 goroutine 正在按值获取 naves[i],因此它的副本将传递给它。传递对其的引用:

go func(nave *nave) {...} (&naves[i])

或者,您可以简单地传递 i

go func(i int) { // use naves[i] in the goroutine } (i)

理论要掌握,实操不能落!以上关于《在 Go 切片中不可更改结构体变量》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

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