簡體   English   中英

使用值接收器附加到具有足夠容量的切片

[英]Appending to a slice with enough capacity using value receiver

有人可以幫助我了解這里發生的情況嗎?

package main

import (
    "fmt"
)

func appendString(slice []string, newString string) {
    slice = append(slice, newString)
}

func main() {
    slice := make([]string, 0, 1)
    appendString(slice, "a")
    fmt.Println(slice)
}

我知道切片頭和使用指針接收器的需要。 但是在這里,由於基礎數組具有足夠的容量,因此我希望追加仍可以正常工作(只需將新值添加到基礎數組中,並且原始[復制的]標頭將按預期工作)

我的假設有什么問題?

讓我們添加最終的打印語句以查看結果:

slice := make([]string, 0, 1)
fmt.Println(cap(slice))
appendString(slice, "a")
fmt.Println(slice)

輸出將是(在Go Playground上嘗試):

1
[]

哪個是對的。 可以期望輸出為:

1
[a]

之所以不是這種情況,是因為即使不分配新的支持數組, main()slice變量中的slice頭也不會更改 ,它仍將保持length = 0 僅更改了存儲在appendString() (參數)內部的slice局部變量中的slice頭,但是此變量獨立於main的slice

如果要重新slice main的slice ,您將看到backing數組確實包含新字符串:

slice := make([]string, 0, 1)
fmt.Println(cap(slice))
appendString(slice, "a")
fmt.Println(slice)

slice = slice[:1]
fmt.Println(slice)

現在輸出將是(在Go Playground上嘗試):

1
[]
[a]

這就是為什么內置的append()必須返回新的slice的原因:因為即使不需要新的后備數組,如果添加的元素超過0個,slice頭(包含長度)也將不得不更改(增加)。

這就是為什么appendString()也應返回新切片的原因:

func appendString(slice []string, newString string) []string {
    slice = append(slice, newString)
    return slice
}

或簡稱:

func appendString(slice []string, newString string) []string {
    return append(slice, newString)
}

您必須在哪里使用它來重新分配它:

slice := make([]string, 0, 1)
fmt.Println(cap(slice))
slice = appendString(slice, "a")
fmt.Println(slice)

然后立即獲得預期的結果(在Go Playground上嘗試):

1
[a]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM