Rumah >pembangunan bahagian belakang >Golang >Mengapakah Penambahan pada Go Slice Tidak Mempengaruhi Slice Lain yang Menunjuk pada Tatasusunan Dasar yang Sama?

Mengapakah Penambahan pada Go Slice Tidak Mempengaruhi Slice Lain yang Menunjuk pada Tatasusunan Dasar yang Sama?

Patricia Arquette
Patricia Arquetteasal
2024-11-15 00:43:02682semak imbas

Why Doesn't Appending to a Go Slice Affect Other Slices Pointing to the Same Underlying Array?

Memahami Gelagat Append pada Slices

Penerangan Masalah:

Pertimbangkan kod Go berikut:

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slice1 := slice
    slice1[0] = 10000
    fmt.Println(slice)

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}

Keluaran awal adalah seperti yang dijangkakan: kedua-dua slice dan slice1 menunjukkan nilai yang sama. Walau bagaimanapun, selepas operasi tambah pada slice1, nilai slice kekal tidak berubah. Tingkah laku ini kelihatan berlawanan dengan intuisi, memandangkan andaian bahawa kepingan adalah penunjuk.

Penjelasan:

Fungsi tambah tidak mengubah suai kepingan1. Go melepasi semua nilai mengikut nilai, jadi slice1 menerima salinan slice. Operasi tambah mencipta tatasusunan baharu, memandangkan tatasusunan asal telah mencapai kapasitinya. Ia kemudian menyalin kandungan tatasusunan lama ke dalam tatasusunan baharu dan mengembalikan pengepala hirisan baharu yang menghala ke tatasusunan baharu.

Penugasan nilai pulangan kepada slice1 mengubah slice1. Walau bagaimanapun, slice kekal tidak terjejas kerana ia adalah pembolehubah berasingan yang menunjuk kepada tatasusunan asal. Oleh itu, sebarang perubahan yang dibuat pada elemen slice1 atau slice selepas operasi tambah tidak akan ditunjukkan dalam yang lain.

Ringkasnya, kepingan dalam Go ialah nilai pas-demi-dan tambah mencipta kepingan baharu dengan baharu tatasusunan asas apabila perlu. Ini bermakna perubahan yang dibuat pada satu kepingan tidak ditunjukkan dalam kepingan lain yang menunjuk kepada tatasusunan asal.

Atas ialah kandungan terperinci Mengapakah Penambahan pada Go Slice Tidak Mempengaruhi Slice Lain yang Menunjuk pada Tatasusunan Dasar yang Sama?. 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