首頁 > 後端開發 > Golang > Golang 的 `append()` 函數何時分配新切片?

Golang 的 `append()` 函數何時分配新切片?

Patricia Arquette
發布: 2024-11-02 03:27:30
原創
270 人瀏覽過

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

Golang Append() 何時建立新切片?

與內建 API 文件相反,append() 函數並不總是建立新切片。這是由原始切片的容量和要添加的元素數量決定的。

在提供的程式碼片段中,遞歸地建立布林值組合,感嘆號表示傳送到頻道的切片新增選項函數。然而,在 main() 中另一側出現的切片被修改了。

切片資料類型與其內部表示之間的區別引起了混亂。切片描述符由兩個整數(長度和容量)和一個指向底層資料的指標組成。因此,append() 傳回一個帶有新描述符的新切片,但指向資料的指標相同。

這在以下程式碼範例中進行了說明:

<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>
登入後複製

輸出:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]
登入後複製

這表示a 和b 共用相同的資料指針,因為原始切片仍然有容量。但是,如果我們將容量減少到4:

<code class="go">s := make([]int, 0, 4)</code>
登入後複製

輸出變為:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]
登入後複製

由於原始切片不再有足夠的容量,append() 建立一個新切片b .

的新資料指針

以上是Golang 的 `append()` 函數何時分配新切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板