go切片的copy和view的使用方法
語(yǔ)義理解切片
go 語(yǔ)言中的切片是 go 語(yǔ)言的一個(gè)特色,從語(yǔ)義上來(lái)說(shuō),切片就是把一個(gè)整體的東西切分成小的部分,那么對(duì)于語(yǔ)言中的切片也是同理。
舉個(gè)例子看如下代碼:
package main import "fmt" func main() { arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} fmt.Println("arr[2:6]:", arr[2:6]) // 從下標(biāo)2到下標(biāo)6 fmt.Println("arr[:6]:", arr[:6]) // 從下標(biāo)0到下標(biāo)6 fmt.Println("arr[2:]:", arr[2:]) // 從下標(biāo)2到最后 fmt.Println("arr[:]:", arr[:]) // 全部 }
輸出結(jié)果為:
arr[2:6]: [2 3 4 5]
arr[:6]: [0 1 2 3 4 5]
arr[2:]: [2 3 4 5 6 7]
arr[:]: [0 1 2 3 4 5 6 7]
這里可以很明確的看出,我們想要 arr 數(shù)組的哪一部分,我們就切哪一部分。
當(dāng)然,如果僅僅知道切片是這么用的當(dāng)然還不夠,我們應(yīng)該更加深入的理解,如:
對(duì)原數(shù)組的 copy 還是 view 。
對(duì)于 go 語(yǔ)言的數(shù)組,copy 和 view 是同時(shí)都存在的。
- copy 就是使用這個(gè)數(shù)組的時(shí)候我將這個(gè)數(shù)組拷貝一份,這樣對(duì)于數(shù)組的增刪改,是不會(huì)改變?cè)瓟?shù)組的值的
- view 由數(shù)組執(zhí)行切片所返回的對(duì)象是一個(gè) view,即視圖,若我們?cè)谝晥D上操作數(shù)組,會(huì)改變?cè)瓟?shù)組,
copy 場(chǎng)景
package main import ( "fmt" ) func updateArr(arr [5]int) { arr[0] = 100 fmt.Println("修改后的arr:", arr) } func main() { arr3 := [...]int{2, 4, 5, 6, 7} fmt.Println("原來(lái)的:", arr3) updateArr(arr3) fmt.Println("再次查看原始的:", arr3) }
輸出結(jié)果:
原來(lái)的: [2 4 5 6 7]
修改后的arr: [100 4 5 6 7]
再次查看原始的: [2 4 5 6 7]
如上代碼可以看到,我們?cè)?updateArr 里面修改了下標(biāo)為 0 的值,但是我們輸出原始數(shù)組的時(shí)候,并沒(méi)有變。這就是對(duì)數(shù)組 copy。
view 場(chǎng)景
func updateArr(arr []int) { arr[0] = 100 fmt.Println("修改后的arr:", arr) } func main() { arr3 := [...]int{2, 4, 5, 6, 7} fmt.Println("原來(lái)的:", arr3) // 使用切片 updateArr(arr3[:]) fmt.Println("再次查看原始的:", arr3) }
輸出結(jié)果:
原來(lái)的: [2 4 5 6 7]
修改后的arr: [100 4 5 6 7]
再次查看原始的: [100 4 5 6 7]
為什么 view 能夠改變?cè)瓟?shù)組
雖然 Slice 本身是值類(lèi)型,但是它內(nèi)部使用了對(duì)數(shù)組的指針引用,所以修改切片數(shù)據(jù),會(huì)將數(shù)組原有數(shù)據(jù)修改掉。
當(dāng)然,在理解上面的同時(shí),一定要知道 go 是如何定義一個(gè)切片的
var b []int
所以,在 updateArr 這個(gè)函數(shù)傳參的時(shí)候 arr []int 是傳切片進(jìn)去。不然會(huì)報(bào)錯(cuò)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
go語(yǔ)言中的Carbon庫(kù)時(shí)間處理技巧
這篇文章主要介紹了go語(yǔ)言中的Carbon庫(kù)時(shí)間處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02如何使用Golang發(fā)送Get和Post請(qǐng)求
這篇文章主要給大家介紹了關(guān)于如何使用Golang發(fā)送Get和Post請(qǐng)求的相關(guān)資料,Go語(yǔ)言(Golang)的標(biāo)準(zhǔn)庫(kù)提供了處理HTTP請(qǐng)求的功能,這使得將Go用于web應(yīng)用程序變得非常容易,需要的朋友可以參考下2023-06-06Golang連接Redis數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Golang連接Redis數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12成功安裝vscode中g(shù)o的相關(guān)插件(詳細(xì)教程)
這篇文章主要介紹了成功安裝vscode中g(shù)o的相關(guān)插件的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Go方法簡(jiǎn)單性和高效性的充分體現(xiàn)詳解
本文深入探討了Go語(yǔ)言中方法的各個(gè)方面,包括基礎(chǔ)概念、定義與聲明、特性、實(shí)戰(zhàn)應(yīng)用以及性能考量,文章充滿(mǎn)技術(shù)深度,通過(guò)實(shí)例和代碼演示,力圖幫助讀者全面理解Go方法的設(shè)計(jì)哲學(xué)和最佳實(shí)踐2023-10-10