登录
首页 >  Golang >  Go问答

结构体中的字段设置遗失了吗?

来源:stackoverflow

时间:2024-03-03 14:00:26 278浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《结构体中的字段设置遗失了吗?》,涉及到,有需要的可以收藏一下

问题内容

type project struct {
    id   int    `json:"id"`
    name string `json:"name"`
}

type commit struct {
    id            string `json:"id"`
    message       string `json:"message"`
    committername string `json:"committer_name"`
    committeddate string `json:"committed_date"`
    project       project
}

func (c *commit) setproject(project project) {
    c.project = project
}
var commits []Commit // pre-populated list of commits

// goroutine 1
for _, commit := range commits {
  fmt.Println(project) // this prints out with the expected result
  commit.SetProject(project)
  fmt.Println(commit) // this prints out with the expected result
}
ch <- commits

// goroutine 2
for commits := range ch {
  fmt.Println(commits[0].Project) // => {0 }, project is not there
}

如何在提交上设置项目?


解决方案


根据您的描述,commits 的类型为 []commit。如果是这种情况,则 for 循环中的 commit 是数组元素的副本,更改它会更改副本,而不是数组中的 commit。因此,使用索引访问并修改数组中的提交:

for i, _ := range commits {
    commits[i].setproject(project)
}

如果您的类型需要指针接收器,则最好始终通过指针处理该类型的值,以防止意外复制。即使您要通过索引直接对切片中的值调用该方法,您也始终有可能需要在代码中的其他地方使用这些值,这要求您确保更改正确的值价值。

在这种情况下,建议使用 commits 的指针片段来完全避免该问题:

var commits []*Commit

今天关于《结构体中的字段设置遗失了吗?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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