Golang中slice切片的實(shí)現(xiàn)示例
slice
Go語(yǔ)言的切片是對(duì)數(shù)組的抽象。
數(shù)組的使用
package main
import (
"fmt"
)
// 傳遞固定長(zhǎng)度的數(shù)組還是值傳遞的方式
func printArray(myArray [5]int) {
for index, value := range myArray {
fmt.Println("index:", index, "value:", value)
}
}
func main() {
var myArr [5]int
myArr2 := [10]int{1, 2, 3, 4}
myArr3 := [4]int{1, 2, 3, 4}
myArr4 := []int{1, 2, 3, 4}
for i := 0; i < len(myArr); i++ {
fmt.Println(myArr[i])
}
for index, value := range myArr2 {
fmt.Println("index:", index, "value:", value)
}
fmt.Printf("myArr1 type=%T\n", myArr)
fmt.Printf("myArr2 type=%T\n", myArr2)
fmt.Printf("myArr3 type=%T\n", myArr3)
}

注意:
數(shù)組傳遞的參數(shù)是以值拷貝的形式進(jìn)行傳遞,如下:(在函數(shù)中修改了,但在主函數(shù)中并沒(méi)有變化)
package main
import (
"fmt"
)
// 傳遞固定長(zhǎng)度的數(shù)組還是值傳遞的方式
func printArray(myArray [5]int) {
for index, value := range myArray {
fmt.Println("index:", index, "value:", value)
}
myArray[0] = 15
}
func main() {
myArr2 := [5]int{1, 2, 3, 4}
printArray(myArr2)
fmt.Println("==================")
for index, value := range myArr2 {
fmt.Println("index:", index, "value:", value)
}
}

Go數(shù)組的長(zhǎng)度不可改變,在特定的場(chǎng)景中這樣的集合就不太適合了,Go中就提供了內(nèi)置類型切片(動(dòng)態(tài)數(shù)組),與數(shù)組相比,切片的長(zhǎng)度是不固定的,可以追加時(shí)可能使得切片的容量增大。
定義切片
可以聲明一個(gè)未指定大小的數(shù)組來(lái)定義切片(切片不需要說(shuō)明長(zhǎng)度。)
var identifier []type
使用make()函數(shù)來(lái)創(chuàng)建切片:
var slice1 []type = make([]type, len) 也可以簡(jiǎn)寫為 slice1 := make([]type, len) //也可以指定容量,其中capacity為可選參數(shù)。 make([]T, length, capacity)
切片的四種初始化的方式
package main
import "fmt"
func main() {
//聲明slice是一個(gè)切片,并且初始化,默認(rèn)值是1,2,3長(zhǎng)度是len=3
slice1 := []int{1, 2, 3}
//聲明slice是一個(gè)切片,但是并沒(méi)有為slice分配空間
var slice2 []int
slice2 = make([]int, 10, 15)
slice2[0] = 100
//聲明slice是一個(gè)切片,同時(shí)給slice分配3個(gè)空間,初始化值是0
var slice3 []int = make([]int, 10)
//聲明slice是一個(gè)切片,同時(shí)為slice分配空間,10個(gè)空間,初始化值是0,通過(guò):=推導(dǎo)出slice是一個(gè)切片
slice4 := make([]int, 10)
fmt.Printf("len=%d,slice=%v\n", len(slice1), slice1)
fmt.Printf("len=%d,slice=%v,cap=%d\n", len(slice2), slice2, cap(slice2))
fmt.Printf("len=%d,slice=%v\n", len(slice3), slice3)
fmt.Printf("len=%d,slice=%v\n", len(slice4), slice4)
}

切片的追加,截取與拷貝
切片示意圖:

追加
如果想增加切片的容量,我們必須創(chuàng)建一個(gè)新的更大的切片并把原分片的內(nèi)容都拷貝過(guò)來(lái)
長(zhǎng)度增加后,超過(guò)容量,則容量增加2倍
package main
import "fmt"
func main() {
var numbers = make([]int, 3, 5)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
numbers = append(numbers, 1)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
numbers = append(numbers, 1)
numbers = append(numbers, 1)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
}

截取
s := []int{1, 2, 3}
//左閉右開
s1 := s[0:2]
s1[0] = 100
s[1] = 200
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)

拷貝
截取是采用的淺拷貝,是指向的同一個(gè)地址。
如果要深拷貝??梢允褂胏opy函數(shù)
s := []int{1, 2, 3}
var s1 = make([]int, 3)
copy(s1, s)
s1[0] = 100
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)

到此這篇關(guān)于Golang中slice切片的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Golang slice切片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang協(xié)程關(guān)閉踩坑實(shí)戰(zhàn)記錄
協(xié)程(coroutine)是Go語(yǔ)言中的輕量級(jí)線程實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于golang協(xié)程關(guān)閉踩坑的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
深入理解Golang之http server的實(shí)現(xiàn)
這篇文章主要介紹了深入理解Golang之http server的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
源碼分析Go語(yǔ)言使用cgo導(dǎo)致線程增長(zhǎng)的原因
這篇文章主要從一個(gè)cgo調(diào)用開始解析Go語(yǔ)言源碼,從而分析一下造成線程增長(zhǎng)的原因,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一學(xué)習(xí)一下2023-06-06

