Данные в struct не обновляются
Пишу простую программу на Go в рамках обучения и столкнулся с проблемой с указателями. У меня есть struct-ы следующего вида:
type Worker struct {
name string
skills []Skill
tasks []Task
}
type Team struct {
specialization string
members []*Worker
unasignedTasks []Task
}
Суть программы довольно проста - есть определенная команда, в которой у разных её членов разный уровень загруженности. Команда должна автоматически распределять задачи наименее нагруженным сотрудникам. Для добавления задач в список задач сотрудника у меня есть метод assignTask(), который выглядит так:
func (w *Worker) assignTask(task Task) {
w.tasks = append(w.tasks, task)
}
При работе индивидуально с работниками добавление тасков идет как по маслу, однако когда я пытаюсь сделать метод для команды distributeTask():
func (t Team) distributeTask(task Task) {
busyMap := make(map[*Worker]int)
for _, member := range t.members {
busyMap[member] = len(member.tasks)
}
var keySlice []int
for _, value := range busyMap {
keySlice = append(keySlice, value)
}
least := min(keySlice)
for _, member := range t.members {
if len(member.tasks) == least {
member.assignTask(task)
break
}
}
}
То новая задача внутри метода заносится в список, а вне - нет. Не очень понимаю, с чем это могло быть связано, так как я создал примерно идентичный тестовый код и там добавление элементов в словарь прошло без проблем. Может быть кто-то может подсказать, как решить эту проблему?
Всем заранее спасибо
Ответы (1 шт):
Помимо указанной в комментарии проблемы с передачей ресивера по значению есть еще одна - при итерировании по слайсу во второй переменной лежит копия элемента, а не сам элемент, то есть менять его бесполезно - https://go.dev/tour/moretypes/16
В вашем случае надо переписать последний цикл чтобы он работал с элементом по индексу, вот так:
for i := range t.members {
if len(t.members[i]) == least {
t.members[i].assignTask(task)
break
}
}