Массив в Golang ведет себя как ссылка?
В Go массивы ведут себя как значения, а не как ссылки. Это означает, что при передаче массива в функцию или присвоении его другой переменной создается копия всего массива.
Поведение массивов в Go
- Передача по значению: Когда вы передаете массив в функцию, передается его копия, и любые изменения, внесенные в массив внутри функции, не затрагивают оригинальный массив.
Пример:
1234567891011121314package mainimport "fmt"func modifyArray(arr [3]int) { // Принимаем массивarr[0] = 99 // Изменяем копию}func main() {original := [3]int{1, 2, 3}modifyArray(original) // Передаем массивfmt.Println(original) // Выводит: [1 2 3]} - Копирование массивов: При присвоении одного массива другому массиву создается новая копия данных.
Пример:
123456789101112package mainimport "fmt"func main() {a := [3]int{1, 2, 3}b := a // Создается копияb[0] = 99 // Изменяем копиюfmt.Println(a) // Выводит: [1 2 3]fmt.Println(b) // Выводит: [99 2 3]} 
Варианты использования
Если вам нужно работать с массивами так, чтобы изменения отражались на оригинале, вы можете использовать срезы (slices) или указатели.
1. Срезы
Срезы в Go ведут себя как ссылки на массивы. Когда вы передаете срез в функцию, фактически передается ссылка на исходный массив, и изменения будут видны за пределами функции.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
						package main import "fmt" func modifySlice(s []int) { // Принимаем срез     s[0] = 99 // Изменяем элемент среза } func main() {     original := []int{1, 2, 3}     modifySlice(original) // Передаем срез     fmt.Println(original)  // Выводит: [99 2 3] }  | 
					
2. Указатели
Вы также можете передавать массив по указателю, чтобы изменения отражались на оригинале.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14  | 
						package main import "fmt" func modifyArray(arr *[3]int) { // Принимаем указатель на массив     (*arr)[0] = 99 // Изменяем оригинальный массив через указатель } func main() {     original := [3]int{1, 2, 3}     modifyArray(&original) // Передаем указатель на массив     fmt.Println(original)   // Выводит: [99 2 3] }  | 
					
Заключение
В Go массивы ведут себя как значения, и при передаче массива в функцию создается его копия. Если вы хотите, чтобы изменения в массиве были видны за пределами функции, лучше использовать срезы или указатели. Срезы являются более гибким и удобным способом работы с массивами, так как они представляют собой «обертку» над массивами и ведут себя как ссылки.
Recommended Posts
Golang map и Swiss Table
16.03.2025
