成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言為什么建議 append 追加新元素使用原切片變量接收返回值?

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

?1.介紹

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

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

本文我們介紹一下 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)
}

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

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

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

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

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

3.append 的原理

Go 語言內(nèi)置函數(shù) append 第一個入?yún)⑹乔衅愋偷淖兞浚衅旧硎且粋€ struct 結(jié)構(gòu),參數(shù)傳遞時會發(fā)生值拷貝。

Go 語言 slice 源碼如下:

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

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

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

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

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

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

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

4.總結(jié)

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

參考資料:

  • 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

責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2023-12-27 08:12:04

切片Go語言

2022-09-18 23:09:13

Go語言標(biāo)準(zhǔn)庫

2024-01-02 10:38:22

Go語言數(shù)組

2024-03-15 09:56:47

切片函數(shù)泛型

2023-03-06 08:01:25

structGo語言

2021-08-13 11:31:23

HTTP

2020-04-07 16:12:56

Go編程語言開發(fā)

2020-06-23 14:09:49

枚舉JDK場景

2021-12-19 23:58:51

Golang語言返回值

2012-08-20 09:16:15

Go語言

2023-08-07 14:52:33

WindowsExplorer進(jìn)程

2009-11-17 16:16:59

PHP遞歸函數(shù)

2025-04-23 08:22:37

JavaKotlin類型

2016-09-27 21:25:08

Go語言Ken Thompso

2018-05-02 12:34:48

2012-08-13 09:15:54

Go開發(fā)語言編程語言

2024-03-11 11:02:03

Date類JavaAPI

2021-03-10 09:40:50

Linux命令文件

2024-07-08 00:01:00

GPM模型調(diào)度器

2025-03-04 00:25:55

Go開發(fā)者切片
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区三区四区在线播放 | 天天躁人人躁人人躁狂躁 | 大吊一区二区 | 国产午夜视频 | 久久精品1| 国内精品视频在线观看 | 久久精品在线免费视频 | 亚洲区视频| 在线婷婷| 久久综合伊人 | 午夜国产羞羞视频免费网站 | 精品亚洲一区二区三区 | 久草视频2| 欧美日韩综合精品 | 亚洲精品久久久久久国产精华液 | 国产高清一区二区三区 | 免费在线观看成人 | 国产一级一级国产 | 国产日韩欧美精品一区二区 | 欧美日韩一区二区三区不卡视频 | 91精品麻豆日日躁夜夜躁 | 精品国产成人 | 日韩精品一区二区三区视频播放 | 久久精品无码一区二区三区 | 99色综合 | 亚洲一区在线日韩在线深爱 | 久久国产精品视频 | 久久99精品久久久久久国产越南 | 中文字幕亚洲一区二区三区 | 亚洲精品资源 | 亚洲免费av一区 | 国产欧美一级二级三级在线视频 | 麻豆精品一区二区三区在线观看 | 国产精品九九九 | 亚洲国产成人精品久久久国产成人一区 | 国产免费一区二区 | 免费一区二区三区 | 精品美女视频在免费观看 | 国产人成在线观看 | 国外成人在线视频网站 | 欧美黄色大片在线观看 |