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

看完這期圖解,別再搞不清切片拷貝了

開發(fā) 后端
在剛使用 Go 時(shí),菜刀曾將 Python 深拷貝手法[:]用于 Go 中 ,結(jié)果造成了 bug。相信不少轉(zhuǎn)語言的 Gopher 也在切片拷貝上栽過跟頭。

[[438643]]

本文轉(zhuǎn)載自微信公眾號(hào)「Golang技術(shù)分享」,作者機(jī)器鈴砍菜刀 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Golang技術(shù)分享公眾號(hào)。

在剛使用 Go 時(shí),菜刀曾將 Python 深拷貝手法[:]用于 Go 中 ,結(jié)果造成了 bug。相信不少轉(zhuǎn)語言的 Gopher 也在切片拷貝上栽過跟頭。

切片是 Go 中最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),之前我們談過切片傳遞、切換轉(zhuǎn)換、切片擴(kuò)容等內(nèi)容。

本文,我們將探討切片拷貝,就切片的三種拷貝方式進(jìn)行圖解分析,希望幫助讀者鞏固一下基礎(chǔ)知識(shí)。

深淺拷貝

所謂深淺拷貝,其實(shí)都是進(jìn)行復(fù)制,主要區(qū)別在于復(fù)制出來的新對(duì)象和原來的對(duì)象,它們的數(shù)據(jù)發(fā)生改變時(shí),是否會(huì)相互影響。

簡單而言,B 復(fù)制 A,如果 A 的數(shù)據(jù)發(fā)生變化,B 也跟著變化,這是淺拷貝。反之, 如果 B 不發(fā)生變化,則為深拷貝。

深淺拷貝差異的根本原因在于,復(fù)制出來的對(duì)象與原對(duì)象是否會(huì)指向同一個(gè)地址。

以下是 Python 中 list 與 Go 中 slice 深淺拷貝的表現(xiàn)差異

  1. // Python 版 
  2. if __name__ == '__main__'
  3.     a = [1, 2, 3] 
  4.     b = a 
  5.     c = a[:] 
  6.     a[0] = 100 
  7.     print(a, b, c) // [100, 2, 3] [100, 2, 3] [1, 2, 3] 
  8.  
  9. // Golang 版 
  10. func main() { 
  11.  a := []int{1, 2, 3} 
  12.  b := a 
  13.  c := a[:] 
  14.  a[0] = 100 
  15.  fmt.Println(a, b, c) // [100 2 3] [100 2 3] [100 2 3] 

發(fā)現(xiàn)沒有?在 Go 中 [:] 操作并不是深拷貝。

= 拷貝

通過=操作符拷貝切片,這是淺拷貝。

  1. func main() { 
  2.  a := []int{1, 2, 3} 
  3.  b := a 
  4.  fmt.Println(unsafe.Pointer(&a))  // 0xc00000c030 
  5.  fmt.Println(a, &a[0])            // [100 2 3] 0xc00001a078 
  6.  fmt.Println(unsafe.Pointer(&b))  // 0xc00000c048 
  7.  fmt.Println(b, &b[0])            // [100 2 3] 0xc00001a078 

圖解

[:] 拷貝

通過[:]方式復(fù)制切片,同樣是淺拷貝。

  1. func main() { 
  2.  a := []int{1, 2, 3} 
  3.  b := a[:] 
  4.  fmt.Println(unsafe.Pointer(&a)) // 0xc0000a4018 
  5.  fmt.Println(a, &a[0])           // [1 2 3] 0xc0000b4000 
  6.  fmt.Println(unsafe.Pointer(&b)) // 0xc0000a4030 
  7.  fmt.Println(b, &b[0])           // [1 2 3] 0xc0000b4000 

圖解

我們有時(shí)會(huì)使用[start: end]進(jìn)行拷貝。例如,b:=a[1:],那它的拷貝情況如何

copy() 拷貝

上述兩種方式都是淺拷貝,如果要切片深拷貝,需要用到copy()內(nèi)置函數(shù)。

copy()函數(shù)簽名如下

  1. func copy(dst, src []Type) int 

其返回值代表切片中被拷貝的元素個(gè)數(shù)

  1. func main() { 
  2.  a := []int{1, 2, 3} 
  3.  b := make([]int, len(a), len(a)) 
  4.  copy(b, a) 
  5.  fmt.Println(unsafe.Pointer(&a))  // 0xc00000c030 
  6.  fmt.Println(a, &a[0])            // [1 2 3] 0xc00001a078 
  7.  fmt.Println(unsafe.Pointer(&b))  // 0xc00000c048 
  8.  fmt.Println(b, &b[0])            // [1 2 3] 0xc00001a090 

圖解

copy 的元素?cái)?shù)量與原始切片和目標(biāo)切片的大小、容量有關(guān)系

  1. func main() { 
  2.  a := []int{1, 2, 3} 
  3.  b := []int{-1, -2, -3, -4} 
  4.  copy(b, a) 
  5.  fmt.Println(unsafe.Pointer(&a))  // 0xc0000a4018 
  6.  fmt.Println(a, &a[0])            // [1 2 3] 0xc0000b4000 
  7.  fmt.Println(unsafe.Pointer(&b))  // 0xc0000a4030 
  8.  fmt.Println(b, &b[0])            // [1 2 3 -4] 0xc0000aa060 

圖解

總結(jié)

切片是 Go 語言中最基本的數(shù)據(jù)結(jié)構(gòu),它的擴(kuò)容與拷貝細(xì)節(jié),在理解不當(dāng)時(shí),是很容易寫出程序 bug 的。

本文分別就切片的三種拷貝方式,=、[:]、copy()進(jìn)行了探討。其中,=、[:]是淺拷貝,copy()拷貝是深拷貝。

 

這樣的圖解方式,你喜歡嗎~

 

責(zé)任編輯:武曉燕 來源: Golang技術(shù)分享
相關(guān)推薦

2021-02-24 07:38:50

Redis

2017-08-09 15:07:08

大數(shù)據(jù)數(shù)據(jù)分析戶畫像

2021-06-16 00:57:16

JVM加載機(jī)制

2025-04-21 10:43:21

2021-03-18 23:28:45

Python反斜杠字符串

2020-12-01 11:33:57

Python拷貝copy

2022-05-27 21:56:55

索引存儲(chǔ)MySQL 存儲(chǔ)引擎

2024-12-05 11:03:04

2020-12-02 11:18:50

print調(diào)試代碼Python

2020-12-04 10:05:00

Pythonprint代碼

2015-02-28 10:01:00

云計(jì)算IT架構(gòu)虛擬化

2020-06-18 10:48:44

Linux 系統(tǒng) 數(shù)據(jù)

2017-08-16 09:55:36

2025-06-10 02:22:00

2025-05-19 04:00:00

2023-08-18 15:22:54

工業(yè)物聯(lián)網(wǎng)工業(yè)互聯(lián)網(wǎng)

2021-07-06 14:32:54

機(jī)器學(xué)習(xí)人工智能計(jì)算機(jī)

2019-12-17 09:29:02

數(shù)據(jù)庫架構(gòu)分庫分表

2020-12-11 09:24:19

Elasticsear存儲(chǔ)數(shù)據(jù)

2025-05-30 03:15:00

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产高清在线精品一区二区三区 | 亚洲精品一区中文字幕 | 欧美久久久久 | 亚洲电影一区二区三区 | 成人性生交大片免费看r链接 | 成人一区二区三区 | 亚洲视频免费观看 | 97国产精品视频 | 欧美国产日韩一区二区三区 | 成人影院在线观看 | 午夜精品久久久久久久久久久久久 | 蜜桃精品在线 | 亚洲精品视频在线看 | 国产一区在线视频 | 777毛片| 日韩在线精品视频 | 成人欧美一区二区三区在线观看 | 91精品一区二区三区久久久久 | 精品久久中文字幕 | 精品啪啪 | 成人av在线播放 | 狠狠综合久久av一区二区老牛 | 综合久久av | av免费网| 99re视频在线 | 欧美一级三级 | 欧美日韩免费在线 | 精品久 | 中文字幕久久久 | 91免费在线播放 | av中文字幕在线播放 | 中文字幕视频在线观看 | 精品国产欧美一区二区三区成人 | 福利视频一区 | 九色91视频 | 午夜电影网 | 日韩播放| 免费高潮视频95在线观看网站 | 亚洲一区视频在线播放 | 尤物在线视频 | 亚洲一二三区av |