«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу изменить срез, переданный как аргумент функции в Go?

Как я могу изменить срез, переданный как аргумент функции в Go?

Опубликовано 20 декабря 2024 г.
Просматривать:928

How Can I Modify a Slice Passed as a Function Argument in Go?

Передача среза в качестве аргумента функции и изменение исходного среза

В 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