Я немного изменил пример обновленной игровой площадки здесь .
Вы не хотите указатель на слайса, вы просто хотите передать сам слайс , Передавать указатель по своей сути не неправильно, здесь просто нет необходимости. Срез означает: «Я (main
) даю вам (validate
) доступ к массиву, который я создал». Заголовок слайса предоставляет пользователю user-of-slice:
- доступ к массиву (посредством индексации:
bRes[i]
является i -ым элементом массива); - длина массива:
len(bRes)
- циклы for
используют это неявно; и - емкость массива (в данном примере не используется).
Записав в bRes[i]
, мы можем обновить любое или все поля одного из Product
s в базовом массиве. Это то, что делает второй l oop, который я добавил к validate
.
Примечание: строки 47-48, которые читают:
var products []Product
products = append(products, pr1, pr2)
использует append
немного странно: поскольку у нас есть только два продукта, мы можем построить срез непосредственно с помощью:
products := []Product{pr1, pr2}
Значение products
будет изначально nil
. Заголовок нулевого среза фактически говорит о том, что длина и емкость равны нулю, и, в конце концов, базовый массив отсутствует. При добавлении к срезу nil
всегда append
выделяет новый базовый массив. Функция append
возвращает новый фрагмент, который использует новый массив. 1 Так что при настройке этого нулевого среза требуется немало усилий, только чтобы его выбросить. Опять же, это не неправильно , это просто не нужно.
(Между тем, вы получаете +1 балл за проверку на ошибку с json.Unmarshal
, но -1 балл, или, может быть, минус половина точка, для не проверка на ошибку от json.Marshal
. ?)
1 append
всегда создает новый заголовок среза В некоторых случаях новый заголовок может повторно использовать старый массив. или он может использовать новый массив. Операция append
будет повторно использовать старый, уже существующий массив тогда и только тогда, когда добавленные элементы вписываются в существующий массив на основе емкости, указанной в исходном заголовке слайса. Поскольку заголовок nil
имеет нулевую емкость, его существующий массив не может быть использован здесь.