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

Mengapakah merombak kepingan menjejaskan kepingan yang ditetapkan padanya dalam Go?

Patricia Arquette
Lepaskan: 2024-10-27 03:57:03
asal
1131 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan