Данные в 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 шт):

Автор решения: Bearded Beaver

Помимо указанной в комментарии проблемы с передачей ресивера по значению есть еще одна - при итерировании по слайсу во второй переменной лежит копия элемента, а не сам элемент, то есть менять его бесполезно - https://go.dev/tour/moretypes/16

В вашем случае надо переписать последний цикл чтобы он работал с элементом по индексу, вот так:

for i := range t.members {
    if len(t.members[i]) == least {
        t.members[i].assignTask(task)
        break
    }
}

→ Ссылка