Rumah >pembangunan bahagian belakang >Golang >Mengapakah mengubah suai tatasusunan di dalam fungsi dalam Go juga mengubah pembolehubah yang diberikan kepada tatasusunan yang sama di luar fungsi?
Rawatan Tatasusunan dalam Go
Dalam Go, tatasusunan ialah nilai, bukan rujukan. Oleh itu, memberikan satu tatasusunan kepada yang lain akan menyalin semua elemen. Selain itu, menghantar tatasusunan kepada fungsi akan memberikan salinan, bukan penunjuk.
Contoh Penjelasan Kod
Pertimbangkan contoh kod berikut:
package main import ( "fmt" "rand" "time" ) func shuffle(arr []int) { rand.Seed(time.Nanoseconds()) for i := len(arr) - 1; i > 0; i-- { j := rand.Intn(i) arr[i], arr[j] = arr[j], arr[i] } } func main() { arr := []int{1, 2, 3, 4, 5} arr2 := arr shuffle(arr) for _, i := range arr2 { fmt.Printf("%d ", i) } }
Dalam kod ini, fungsi shuffle mengambil tatasusunan sebagai input dan mengocok elemennya. Walau bagaimanapun, walaupun kami menetapkan tatasusunan asal kepada pembolehubah baharu arr2 sebelum memanggil shuffle, perubahan yang dibuat kepada arr dalam fungsi ditunjukkan dalam arr2.
Slices vs. Arrays
Pergi membezakan antara kepingan dan tatasusunan. Walaupun tatasusunan ialah senarai nilai panjang tetap, kepingan ialah rujukan kepada tatasusunan asas. Dalam contoh kod, kedua-dua arr dan arr2 merujuk kepada tatasusunan asas yang sama. Akibatnya, sebarang pengubahsuaian yang dibuat pada arr juga digunakan pada arr2. Untuk mencipta salinan tatasusunan yang berbeza, hirisan mesti diperuntukkan menggunakan make:
arr := []int{1, 2, 3, 4, 5} arr2 := make([]int, len(arr)) copy(arr2, arr)
Dalam versi yang dikemas kini ini, arr2 bukan lagi rujukan kepada tatasusunan asal, jadi pengubahsuaian yang dibuat kepada arr tidak akan menjejaskan arr2.
Atas ialah kandungan terperinci Mengapakah mengubah suai tatasusunan di dalam fungsi dalam Go juga mengubah pembolehubah yang diberikan kepada tatasusunan yang sama di luar fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!