Установка поля на структуру теряется? - PullRequest
0 голосов
/ 07 октября 2019
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
}

Как настроить проект на коммиты?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

По вашему описанию, похоже commits имеет тип []Commit. Если это так, то commit в цикле for является копией элемента массива, и изменение, которое изменит копию, а не Commit в массиве. Итак, используйте индексированный доступ и измените коммит в массиве:

for i, _ := range commits {
    commits[i].SetProject(project)
}
0 голосов
/ 07 октября 2019

Если у вас есть тип, для которого требуется приемник указателя, лучше всегда обрабатывать значения этого типа через указатель, чтобы предотвратить неожиданные копии. Даже если бы вы вызывали метод непосредственно для значения в срезе через индекс, у вас всегда будет шанс, что значения нужно будет использовать где-то еще в вашем коде, требуя от вас убедиться, что вы изменяете правильное значение. стоимость.

В этом случае рекомендуется использовать часть указателей для commits, чтобы вообще избежать этой проблемы:

var commits []*Commit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...