Pengendalian Tatasusunan dalam Go
Dalam Go, tatasusunan ialah jenis nilai dan menugaskan satu tatasusunan kepada tatasusunan yang lain menghasilkan salinan semua elemennya. Ini berlaku walaupun apabila menghantar tatasusunan kepada fungsi, kerana ia akan menerima salinan dan bukannya rujukan memori.
Soalan Asal
Pertanyaan telah dibangkitkan mengenai kod berikut:
<code class="go">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) } }</code>
Pengarang menyatakan kekeliruan mengapa arr2 terjejas oleh fungsi shuffle, walaupun jangkaan mereka arr2 dan arr adalah entiti yang berbeza.
Penjelasan
Isu ini berpunca daripada salah faham antara tatasusunan dan hirisan.
Arrays vs Slices
Arrays ialah koleksi nilai dengan panjang tetap, manakala hirisan ialah rujukan dinamik kepada tatasusunan asas. Dalam contoh kod yang disediakan, tiada tatasusunan digunakan.
Manipulasi Slice
Baris arr := []int{1, 2, 3, 4, 5} mencipta kepingan merujuk tatasusunan asas tanpa nama. Baris arr2 := arr seterusnya hanya menduplikasi rujukan ini, menghasilkan kedua-dua arr dan arr2 menunjuk ke tatasusunan asas yang sama.
Gelagat Fungsi
Apabila menghantar arr ke fungsi shuffle, salinan kepingan dibuat, bukan tatasusunan asas. Salinan ini diubah suai oleh fungsi, itulah sebabnya arr2 turut terjejas apabila arr diubah suai.
Kesimpulan
Dalam Go, kepingan berfungsi sebagai rujukan kepada tatasusunan asas. Menugaskan satu kepingan kepada yang lain menyalin rujukan, bukan tatasusunan asas. Konsep ini penting untuk memahami manipulasi kepingan dalam Go.
Atas ialah kandungan terperinci Mengapakah merombak kepingan menjejaskan kepingan yang ditetapkan padanya dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!