[英]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.