Аргументы функций: передача по значению и по ссылке в GO
НАВИГАЦИЯ ПО СТРАНИЦЕ
В GO аргументы функций передаются по значению, но некоторые типы, такие как указатели и срезы, могут создавать впечатление передачи по ссылке.
Передача по значению
При передаче аргумента по значению функции получают копию значения аргумента. Это означает, что если функция изменяет значение параметра, это не влияет на оригинальный аргумент.
Пример:
func modifyValue(x int) {
x = x * 2
}
func main() {
value := 10
modifyValue(value)
fmt.Println(value) // Вывод: 10
}
Здесь modifyValue удваивает значение x, но так как аргумент передается по значению, оригинальная переменная value остается неизменной.
Передача по ссылке (указатели)
Если вы хотите, чтобы функция могла изменить значение переменной в вызывающем коде, используйте указатели. Указатели передаются по значению, но они содержат адрес памяти, по которому можно изменить значение переменной.
Пример:
func modifyValueByReference(x *int) {
*x = *x * 2
}
func main() {
value := 10
modifyValueByReference(&value)
fmt.Println(value) // Вывод: 20
}
В этом примере modifyValueByReference принимает указатель на int и удваивает значение, на которое указывает указатель. Таким образом, значение переменной value изменяется в вызывающем коде.
Передача по ссылке (срезы)
Срезы в GO также предоставляют впечатление передачи по ссылке, потому что они содержат указатель на массив данных. Если вы изменяете элементы среза внутри функции, эти изменения будут видны в вызывающем коде.
Пример:
func modifySlice(s []int) {
s[0] = 100
}
func main() {
numbers := []int{1, 2, 3}
modifySlice(numbers)
fmt.Println(numbers) // Вывод: [100, 2, 3]
}
В этом примере modifySlice изменяет первый элемент среза, и эти изменения отражаются в вызывающем коде.
Таким образом, в GO, в основном, происходит передача по значению, но с указателями и срезами можно создать впечатление передачи по ссылке.