Bilakah Append() dalam Go Mencipta Slice Baharu?
Konteks:
Fungsi Go append() digunakan untuk menambahkan satu atau lebih elemen pada kepingan dan ia didokumenkan untuk mencipta kepingan baharu apabila kapasiti kepingan asal tidak mencukupi. Walau bagaimanapun, penyiasatan terhadap algoritma rekursif yang menambah elemen pada kepingan telah menunjukkan bahawa kepingan yang dihantar melalui saluran nampaknya diubah suai selepas ia dihantar.
Kekeliruan:
Pemerhatian ini bercanggah dengan dokumentasi, yang menunjukkan bahawa append() harus mengembalikan kepingan baharu. Kekeliruan ini timbul kerana dokumentasi append() merujuk kepada jenis data slice, manakala pelaksanaan sebenar berfungsi dengan deskriptor slice.
Resolusi:
Deskriptor slice terdiri daripada tiga komponen: panjang, kapasiti dan penunjuk kepada data asas. Apabila append() dipanggil, ia mengembalikan deskriptor kepingan baharu dengan panjang dan kapasiti yang dikemas kini. Walau bagaimanapun, penunjuk kepada data asas kekal sama.
Penjelasan:
Oleh itu, sementara append() mengembalikan deskriptor kepingan baharu, data sebenar masih dikongsi antara kepingan lama dan baru. Ini kerana data asas disimpan dalam lokasi memori berasingan yang ditunjuk oleh deskriptor hirisan.
Contoh:
Kod berikut menggambarkan tingkah laku ini:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) s = append(s, []int{1, 2, 3, 4}...) a := append(s, 5) fmt.Println(a) b := append(s, 6) fmt.Println(b) fmt.Println(a) }</code>
Output menunjukkan bahawa dua kepingan yang diubah suai, a dan b, berkongsi data asas yang sama seperti kepingan asal s, walaupun ia mempunyai panjang dan kapasiti yang berbeza.
Atas ialah kandungan terperinci Adakah Fungsi `append()` Go Sentiasa Mencipta Slice Baharu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!