登录
首页 >  Golang >  Go问答

关于结构体的更新操作

来源:stackoverflow

时间:2024-03-18 14:36:29 319浏览 收藏

在Go语言中,结构体作为值传递,因此对结构体成员的修改仅限于局部作用域。例如,在一个循环中递增结构体成员的值时,该值在循环结束后会重置为初始值。这是因为循环中对结构体的操作实际上是在操作结构体的副本,而不是对原始结构体进行修改。

问题内容

这是我尝试在程序中使用的一段代码的示例:

package main

import (
    "fmt"
    "time"
)

type code struct {
    name   string
    alias  string
    number int
}

func main() {

    test := code{
        name:   "test",
        alias:  "test",
        number: 0,
    }
    codes := []code{test}

    for {
        //other instructions
        for _, code := range codes {
            code.number++ // code.number is incremented but just inside this loop
            test.number++

            fmt.println(code.number)
            fmt.println(test.number) // test.number is incremented
        }
        fmt.println(test.number) // test.number is incremented
        //other instructions
        time.sleep(5 * time.second)
    }
}

但是,每次我回来时都会按照我的指示

for _, code := range codes

code.number 返回到 0,而 test.number 即使在此循环之外也会很好地递增。

我想更新循环中结构的值,并在每次循环时获取新值。


解决方案


指令 codes := []Code{test}codes 中创建 test副本。此副本在 Number 中的值为 0。

在 for 循环中,range 指令将 codes[0] 结构体的另一个副本复制到 code 中。您递增 code.Number,但 codes[0].Number 保持不变。增加 test.Number 不会影响 codescode

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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