go切片的copy和view的使用方法
語義理解切片
go 語言中的切片是 go 語言的一個(gè)特色,從語義上來說,切片就是把一個(gè)整體的東西切分成小的部分,那么對(duì)于語言中的切片也是同理。
舉個(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 語言的數(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("原來的:", arr3)
updateArr(arr3)
fmt.Println("再次查看原始的:", arr3)
}
輸出結(jié)果:
原來的: [2 4 5 6 7]
修改后的arr: [100 4 5 6 7]
再次查看原始的: [2 4 5 6 7]
如上代碼可以看到,我們?cè)?updateArr 里面修改了下標(biāo)為 0 的值,但是我們輸出原始數(shù)組的時(shí)候,并沒有變。這就是對(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("原來的:", arr3)
// 使用切片
updateArr(arr3[:])
fmt.Println("再次查看原始的:", arr3)
}
輸出結(jié)果:
原來的: [2 4 5 6 7]
修改后的arr: [100 4 5 6 7]
再次查看原始的: [100 4 5 6 7]
為什么 view 能夠改變?cè)瓟?shù)組
雖然 Slice 本身是值類型,但是它內(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高級(jí)特性探究之優(yōu)先級(jí)隊(duì)列詳解
Heap?是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)常用于實(shí)現(xiàn)優(yōu)先隊(duì)列,這篇文章主要就是來和大家深入探討一下GO語言中的優(yōu)先級(jí)隊(duì)列,感興趣的可以了解一下2023-06-06
go?smtp實(shí)現(xiàn)郵件發(fā)送示例詳解
這篇文章主要為大家介紹了go?smtp實(shí)現(xiàn)郵件發(fā)送示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
從零封裝Gin框架實(shí)現(xiàn)數(shù)據(jù)庫初始化GORM
這篇文章主要為大家介紹了從零封裝Gin框架實(shí)現(xiàn)數(shù)據(jù)庫初始化GORM,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go語言實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)絡(luò)端口掃描方法
這篇文章主要介紹了Go語言實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)絡(luò)端口掃描方法,實(shí)例分析了Go語言網(wǎng)絡(luò)程序的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
go語言數(shù)據(jù)結(jié)構(gòu)之前綴樹Trie
這篇文章主要介紹了go語言數(shù)據(jù)結(jié)構(gòu)之前綴樹Trie,文章圍繞主題展開詳細(xì)內(nèi)容介紹,具有一定得參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
基于Go語言實(shí)現(xiàn)插入排序算法及優(yōu)化
插入排序是一種簡(jiǎn)單的排序算法。這篇文章將利用Go語言實(shí)現(xiàn)冒泡排序算法,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Go語言有一定的幫助,需要的可以參考一下2022-12-12
golang搭建靜態(tài)web服務(wù)器的實(shí)現(xiàn)方法
這篇文章主要介紹了golang搭建靜態(tài)web服務(wù)器的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
GO excelize讀取excel進(jìn)行時(shí)間類型轉(zhuǎn)換的示例代碼(自動(dòng)轉(zhuǎn)換)
我們經(jīng)常會(huì)遇到如何自動(dòng)識(shí)別excel中的時(shí)間類型數(shù)據(jù)并轉(zhuǎn)化成對(duì)應(yīng)的 "Y-m-d H:i:s"類型數(shù)據(jù),本文小編給大家介紹了GO excelize讀取excel進(jìn)行時(shí)間類型轉(zhuǎn)換的示例代碼(自動(dòng)轉(zhuǎn)換),需要的朋友可以參考下2024-10-10

