日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go 語言為什么建議 append 追加新元素使用原切片變量接收返回值?

?1.介紹

在 Go 語言中,切片類型比較常用,將新元素追加到切片也比較常見,因此 Go 語言提供一個(gè)內(nèi)置函數(shù) append,該函數(shù)可以非常方便實(shí)現(xiàn)此功能。

雖然 Go 語言內(nèi)置函數(shù) append 使用非常方便,但是使用不當(dāng)會(huì)不小心掉入一些“坑”。

本文我們介紹一下 Go 語言為什么建議 append 追加新元素使用原切片變量接收返回值?

2.append 的“坑”

我們先看一段示例代碼:

func main() {
a := make([]int, 0, 5)
a = append(a, 1)
b := append(a, 2)
c := append(a, 3)
fmt.Printf("v=%v || p=%p\n", a, &a)
fmt.Printf("v=%v || p=%p\n", b, &b)
fmt.Printf("v=%v || p=%p\n", c, &c)
}

閱讀上面這段代碼,我們定義一個(gè)長度為 0,容量為 5 的 int 類型的切片 a。

首先,我們使用 Go 語言內(nèi)置函數(shù) append? 追加一個(gè)元素 1 到切片 a 中。

然后,我們使用 Go 語言內(nèi)置函數(shù) append? 追加一個(gè)元素 2 到切片 a 中。

最后,我們使用 Go 語言內(nèi)置函數(shù) append? 追加一個(gè)元素 3 到切片 a 中。

但是,我們?cè)谳敵鼋Y(jié)果中發(fā)現(xiàn),b 的輸出結(jié)果不是 [1 2]?,c 的輸出結(jié)果不是 [1 2 3]?,b 和 c 的實(shí)際輸出結(jié)果相同,都是 [1 3]。為什么呢?我們接著往下看 Part 03 的內(nèi)容。

3.append 的原理

Go 語言內(nèi)置函數(shù) append 第一個(gè)入?yún)⑹乔衅愋偷淖兞?,而切片本身是一個(gè) struct 結(jié)構(gòu),參數(shù)傳遞時(shí)會(huì)發(fā)生值拷貝。

Go 語言 slice 源碼如下:

type slice struct {
array unsafe.Pointer
len int
cap int
}

因?yàn)?Go 語言內(nèi)置函數(shù) append? 參數(shù)是值傳遞,所以 append? 函數(shù)在追加新元素到切片時(shí),append 會(huì)生成一個(gè)新切片,并且將原切片的值拷貝到新切片。

在 Part 02 示例代碼中,我們?nèi)问褂?nbsp;append 參數(shù)追加新元素到切片 a 的操作,接收返回值的變量都不同。

第二次操作時(shí),因?yàn)?nbsp;append? 生成一個(gè)新切片,將原切片 a 的值拷貝到新切片,并且將新元素在原切片a[len(a)]? 長度的位置開始追加,使用變量 b 接收 append? 返回值 [1 2]?,所以變量 b 的值是 [1 2]。

第三次操作時(shí),同樣 append? 生成一個(gè)新切片,將原切片 a 的值拷貝到新切片,并且將新元素在原切片a[len(a)]? 長度的位置開始追加,使用變量 c 接收 append? 返回值 [1 3]?,所以變量 c 的值是 [1 3]。

但是,因?yàn)槿齻€(gè)切片的底層數(shù)組相同,Go 內(nèi)置函數(shù) append 會(huì)在原切片長度的位置開始追加新元素,所以第三次操作時(shí),把第二次操作時(shí)得到的變量 b 的最后一個(gè)元素覆蓋了。

閱讀到這里,相信聰明的讀者朋友們已經(jīng)明白 Part 02 示例代碼為什么實(shí)際輸出結(jié)果和預(yù)想的輸出結(jié)果不同了吧。

4.總結(jié)

本文我們介紹 Go 語言中使用內(nèi)置函數(shù) append 追加新元素的一個(gè)“坑”,建議讀者朋友們使用原切片變量接收返回值。

參考資料:

  • https://go.dev/tour/moretypes/15
  • https://pkg.go.dev/builtin#append
  • https://go.dev/blog/slices-intro
  • https://go.dev/doc/effective_go#slices
  • https://go.dev/ref/spec#Slice_types
  • https://go.dev/ref/spec#Length_and_capacity
  • https://go.dev/ref/spec#Making_slices_maps_and_channels
  • https://go.dev/ref/spec#Appending_and_copying_slices

分享題目:Go 語言為什么建議 append 追加新元素使用原切片變量接收返回值?
文章分享:http://www.dlmjj.cn/article/dhisiij.html