Apakah Misteri Di Sebalik Gelagat Slice dalam Operasi append() dalam Go?

Barbara Streisand
Lepaskan: 2024-10-23 13:45:02
asal
1058 orang telah melayarinya

What's the Mystery Behind Slice Behavior in append() Operations in Go?

Menyahmistikan Gelagat append() pada Slices

Dalam Go, adalah amalan biasa untuk menemui kod seperti ini:

<code class="go">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)
}</code>
Salin selepas log masuk

Setelah dijalankan kod ini, anda akan melihat sesuatu yang pelik:

[10000 1 0 0 0 0 0 0 0 0]
[10000 1 0 0 0 0 0 0 0 0]
Salin selepas log masuk

Secara intuitif, seseorang mungkin menganggap bahawa slice dan slice1 adalah rujukan kepada tatasusunan asas yang sama. Walau bagaimanapun, pemerhatian ini menimbulkan persoalan: mengapa slice kekal tidak berubah selepas operasi tambah pada slice1?

Memahami Sifat Kepingan

Untuk membongkar misteri ini, adalah penting untuk memahami sifat asas kepingan dalam Go. Kepingan bukan penunjuk; ia adalah enkapsulasi tatasusunan. Khususnya, sekeping terdiri daripada tiga elemen:

  • Tuding ke permulaan tatasusunan yang mendasari
  • Saiz hirisan
  • Kapasiti hirisan (saiz maksimum tanpa pengagihan semula )

Apabila menetapkan slice1 untuk slice, anda sedang mencipta pengepala slice baharu yang menghala ke tatasusunan asas yang sama seperti slice. Akibatnya, sebarang pengubahsuaian yang dibuat pada slice1 dicerminkan secara langsung dalam slice.

Kesan append()

Sekarang, mari kita analisa kesan append() pada keping1. Fungsi append() mengambil kepingan sebagai hujah dan mengembalikan kepingan baharu. Potongan baharu ini mungkin atau mungkin tidak merujuk kepada tatasusunan asas yang sama seperti kepingan asal.

Dalam kes ini, memandangkan kepingan pada mulanya mempunyai kapasiti yang sama dengan panjangnya, mana-mana operasi append() dengan lebih daripada 0 elemen memerlukan mencipta tatasusunan baharu yang lebih besar. Inilah yang dilakukan slice1 = append(slice1, 100). Ia memperuntukkan tatasusunan baharu, menyalin kandungan yang lama dan mengembalikan pengepala kepingan baharu.

Penugasan pengepala kepingan yang terhasil kepada slice1 menggantikan pengepala kepingan sebelumnya dalam slice1. Ini bermakna slice1 kini menunjuk kepada tatasusunan asas yang berbeza daripada slice. Akibatnya, sebarang pengubahsuaian seterusnya yang dibuat kepada slice1 tidak menjejaskan slice, dan begitu juga sebaliknya.

Kesimpulan

Walaupun kepingan biasanya disalah anggap sebagai penunjuk, ia sebenarnya adalah nilai yang berbeza. jenis. Perbezaan intrinsik ini nyata semasa operasi append(). Tugasan seperti slice1 = append(slice1, 100) mencipta pengepala kepingan baharu yang mungkin atau mungkin tidak menghala ke tatasusunan asas yang sama seperti kepingan asal. Perkara ini penting untuk diingat semasa memanipulasi kepingan dalam kod Go.

Atas ialah kandungan terperinci Apakah Misteri Di Sebalik Gelagat Slice dalam Operasi append() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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