Bilakah Fungsi `append()` Golang Memperuntukkan Slice Baharu?

Patricia Arquette
Lepaskan: 2024-11-02 03:27:30
asal
166 orang telah melayarinya

When Does Golang's `append()` Function Allocate a New Slice?

Bilakah Golang Append() Mencipta Slice Baharu?

Bertentangan dengan dokumentasi API terbina dalam, fungsi append() tidak selalu mencipta kepingan baharu . Ini ditentukan oleh kapasiti kepingan asal dan bilangan elemen yang akan ditambah.

Dalam coretan kod yang disediakan, tempat gabungan boolean dicipta secara rekursif, tanda seru menunjukkan kepingan yang dihantar ke saluran daripada fungsi AddOption. Walau bagaimanapun, kepingan yang muncul di bahagian lain dalam main() diubah suai.

Kekeliruan timbul daripada perbezaan antara jenis data kepingan dan perwakilan dalamannya. Deskriptor hirisan terdiri daripada dua integer (panjang dan kapasiti) dan penunjuk kepada data asas. Oleh itu, append() mengembalikan kepingan baharu dengan deskriptor baharu tetapi penunjuk yang sama kepada data.

Ini digambarkan dalam contoh kod berikut:

<code class="go">package main

import "fmt"

func main() {
    s := make([]int, 0, 5) // Create a slice with zero length and capacity 5
    s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers

    a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same)
    fmt.Println(a)

    b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same)
    fmt.Println(b)
    fmt.Println(a)
}</code>
Salin selepas log masuk

Output:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]
Salin selepas log masuk

Ini menunjukkan bahawa kedua-dua a dan b berkongsi penuding data yang sama kerana kepingan asal masih mempunyai kapasiti. Walau bagaimanapun, jika kita mengurangkan kapasiti kepada 4:

<code class="go">s := make([]int, 0, 4)</code>
Salin selepas log masuk

Output menjadi:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]
Salin selepas log masuk

Memandangkan kepingan asal tidak lagi mempunyai kapasiti yang mencukupi, append() mencipta kepingan baharu dengan penunjuk data baharu untuk b.

Atas ialah kandungan terperinci Bilakah Fungsi `append()` Golang Memperuntukkan Slice Baharu?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!