Вы не берете значение массива, и, следовательно, переданный в функцию фрагмент может обновляться или не обновляться правильно.
strToInt(employeeDataString, employeeDataInt)
// should be
employeeDataInt = strToInt(employeeDataString, employeeDataInt)
И при этом вы никогда не назначаете playerData2
.Так что fmt.Println(playerData2)
всегда будет []
.
Но кроме этого, здесь есть некоторые тонкие проблемы с использованием массивов / кусочков:
Во-первых, разница между Slices
и Arrays
:
Go не позволяет напрямую работать с массивами.Если они не имеют фиксированной длины ([3]int{}
или []int{1,2,3]
), вы на самом деле смотрите не на массив, а на Slice
([]int
).
Срез - это просто указатель на массив (вместе с его емкостью и некоторой другой информацией), и он, по сути, позволяет Go безопасно работать с массивами, потому что вы никогда не увеличиваете существующий массив (размер массива равенисправлено при инициализации).Таким образом, вы никогда не можете добавить в массив.
То, что Go делает, чтобы создать иллюзию добавления массива, заключается в том, что базовый массив больше, чем требуется, и Slice
контролирует доступ к этому массиву.Таким образом, если базовый массив имеет емкость 5 и вы уже сохранили в нем 3 элемента, вы можете выполнять 2 append
операций без необходимости выделять новый массив и копировать существующие элементы массива в новую ячейку памяти.
Таким образом, когда вы передаете []int
, вы фактически передаете указатель массива (по значению).
Это приводит к следующему уловке в вашем коде: использование append
.Как упоминалось выше, append
берет Slice, просматривает базовый массив и сколько фактически осталось места, а затем добавляет к нему или выделяет новый массив.Если выделен новый массив, append
возвращает новый срез, который указывает на новый массив.
Так что вызов:
foo := []{1,2,3}
append(foo, 4)
append(foo, 5)
append(foo, 6)
fmt.Print(foo)
// => might return 1,2,3,4,5
Вы всегда должны взятьвозвращаемое значение append
в противном случае вы рискуете по-прежнему ссылаться на «старый» фрагмент, к которому не добавлены новые элементы.
Таким образом, правильный способ выращивания фрагмента или работы со слайсами в целом - это сохранитьпомните, что: Срезы передаются по значению , поэтому всегда продолжайте обновлять переменные, возвращая значения функций модификации Slice.