Массив в 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 Sarama: настройка Partitioner
20.03.2024