Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah merombak kepingan menjejaskan kepingan yang ditetapkan padanya dalam Go?

Mengapakah merombak kepingan menjejaskan kepingan yang ditetapkan padanya dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-10-27 03:57:03987semak imbas

Why does shuffling a slice affect a slice assigned to it in Go?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn