В Go передача аргументов в функции осуществляется по значению, то есть любые изменения, внесенные в аргумент внутри функции не отражаются в исходной переменной. Это может стать проблематичным при работе с изменяемыми типами данных, такими как срезы, поскольку добавление к срезу внутри функции не повлияет на исходный срез за пределами области действия функции.
Рассмотрим следующий пример:
nums := []int{1, 2, 3} func addToNumbs(nums []int) []int { nums = append(nums, 4) fmt.Println(nums) // []int{1, 2, 3, 4} } fmt.Println(nums) // []int{1, 2, 3}
В этом примере функция AddToNumbs берет копию среза nums и добавляет значение 4. Это изменяет только копию внутри функцию, а исходный срез чисел остается неизменным вне функции.
Чтобы решить эту проблему, необходимо передать срез по ссылке. Один из способов сделать это — передать указатель на срез:
func myAppend(list *[]string, value string) { *list = append(*list, value) }
При передаче указателя на срез любые изменения, внесенные внутри функции, напрямую отражаются в исходном срезе. Однако передача указателя также означает, что функция может изменить срез способами, которые вы не ожидаете, поэтому важно использовать указатели осторожно.
Другая альтернатива — вернуть измененный срез из функции, как показано ниже. в следующем примере:
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { // Append to the accumulator and return it directly messages = append(messages, message) return messages }
В этом случае функция проверки возвращает измененный срез сообщений, устраняя необходимость передачи указателя на срез.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3