<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
陣列是具有相同 唯一型別 的一組以編號且長度固定的資料項序列
陣列宣告
var identifier [len]type
切片
切片(slice)是對陣列一個連續片段的參照,切片是一個參照型別,切片是一個指標。
切片是一個長度可變的陣列。
切片宣告
var identifier []type
切片初始化
var slice1 []type = arr[start:end]
修改切片的值覆蓋陣列的值
程式碼
package main import "fmt" func main() { arr := [5]int{1,2,3,4,5} fmt.Printf("slice modification before: array=%v len=%d cap=%dn", arr, len(arr), cap(arr)) s := arr[0:3] fmt.Printf("len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) s = append(s, 6,10) fmt.Printf("len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) fmt.Printf("slice modification: array=%v len=%d cap=%dn", arr, len(arr), cap(arr)) }
結果
slice modification before: array=[1 2 3 4 5] len=5 cap=5
len=3 cap=5 ptr=0xc00000c300 slice=[1 2 3]
len=5 cap=5 ptr=0xc00000c300 slice=[1 2 3 6 10]
slice modification: array=[1 2 3 6 10] len=5 cap=5
由於未超出底層陣列的容量,地址不變,陣列還是原來的陣列,所以修改切片會覆蓋陣列的值。
程式碼
package main import "fmt" func main() { arr := [5]int{1,2,3,4,5} fmt.Printf("slice modification before: array=%v len=%d cap=%dn", arr, len(arr), cap(arr)) s := arr[0:3] fmt.Printf("len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) s = append(s, 6,10,11) fmt.Printf("len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) fmt.Printf("slice modification: array=%v len=%d cap=%dn", arr, len(arr), cap(arr)) }
結果
slice modification before: array=[1 2 3 4 5] len=5 cap=5
len=3 cap=5 ptr=0xc00000c300 slice=[1 2 3]
len=6 cap=10 ptr=0xc0000141e0 slice=[1 2 3 6 10 11]
slice modification: array=[1 2 3 4 5] len=5 cap=5
超出底層陣列的容量,地址變了,會分配一個新的陣列,返回的切片指向這個新陣列,舊的陣列的值未被修改。
切片小數1024
程式碼
package main import "fmt" func main() { arr := [5]int{1,2,3,4,5} s := arr[0:3] fmt.Printf("len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) s = append(s, 6,10,11) fmt.Printf("len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) }
結果
before: len=3 cap=5 ptr=0xc00000c300 slice=[1 2 3]
after: len=6 cap=10 ptr=0xc0000141e0 slice=[1 2 3 6 10 11]
該切片的容量為源切片容量的2倍
程式碼
package main import "fmt" func main() { arr := [1024]int{1,2,3,...,1024} s := arr[0:] fmt.Printf("before: len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) s = append(s, 1025) fmt.Printf("after: len=%d cap=%d ptr=%p slice=%vn", len(s), cap(s), s, s) }
結果
before: len=1024 cap=1024 ptr=0xc000112000 slice=[1 2 3 ... 1024]
after: len=1025 cap=1280 ptr=0xc00012c000 slice=[1 2 3 ... 1024 1025]
切片容量在原來的切片的容量上增加了1/4
如果切片的容量不夠會呼叫growslice這個函數進行擴容
// go1.16.6 src/runtime/slice.go func growslice(et *_type, old slice, cap int) slice { ... // code newcap := old.cap doublecap := newcap + newcap if cap > doublecap { newcap = cap } else { if old.cap < 1024 { newcap = doublecap } else { // Check 0 < newcap to detect overflow // and prevent an infinite loop. for 0 < newcap && newcap < cap { newcap += newcap / 4 } // Set newcap to the requested cap when // the newcap calculation overflowed. if newcap <= 0 { newcap = cap } } } // 根據切片型別和容量計算要分配記憶體的大小 var overflow bool var lenmem, newlenmem, capmem uintptr switch { ... // code } ... // code // 將舊切片的資料搬到新切片開闢的地址中 memmove(p, old.array, lenmem) return slice{p, old.len, newcap} }
切片擴容的規則
到此這篇關於淺談Go切片的值修改是否會覆蓋陣列的值 的文章就介紹到這了,更多相關Go切片覆蓋陣列的值 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45