Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bilakah Fungsi `append()` Golang Memperuntukkan Slice Baharu?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-02 03:27:30165semak imbas

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>

Output:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]

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>

Output menjadi:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]

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!

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