陣列元素固定,在 Go 語言中沒有那么常用,更常用的資料結構是切片,
什么是切片呢? 切片就是動態的陣列,它的長度不固定,可以隨意向切片中追加元素,而且切片會在容量不足的時候自動擴容,
切片(slice)是對陣列一個連續片段的參考,這個片段可以是整個陣列,或者是由起始和終止索引標識的一些項的子集,需要注意的是,終止索引標識的項不包括在切片內,切片提供了一個與指向陣列的動態視窗,
切片的資料結構如下:
type slice struct {
// Pointer 是指向一個陣列的指標
array unsafe.Pointer
// 當前切片的長度
len int
// cap 是當前切片的容量,cap 總是大于等于 len 的,
cap int
}
Pointer 作為一個指標指向的陣列是一片連續的記憶體空間,這片記憶體空間可以用于存盤切片中保存的全部元素,底層存盤都是連續的,所以可以將切片理解為一片連續的記憶體空間加上長度與容量的標識,
實戰需求: slice 切片的實作原理
馬上安排!
一、工程目錄
cd go-003/
二、創建 g003.go
/*
* @Author: 菜鳥實戰
* @FilePath: /go110/go-003/g003.go
* @Description: slice 切片
*/
package main
import (
"fmt"
"runtime"
)
// 主函式
func main() {
// 使用內置函式列印
println("Hello", "菜鳥實戰")
//定義一個無初始長度的切片
s := []string{}
for i := 0; i < 6; i++ {
// 拼接元素
s = append(s, "eeeee")
// 拼接后會動態擴容
fmt.Printf("容量: %v, 長度 : %v \n", cap(s), len(s))
}
// 使用包函式列印
fmt.Printf("版本: %s \n", runtime.Version())
}
三、編譯和運行
# 1、生成模塊依賴
go mod init g003# 2、編譯
go build g003.go# 3、編譯后的目錄結構
└── go-003 ├── g003 ├── g003.go └── go.mod# 4、運行
go run g003
四、運行結果
Hello 菜鳥實戰
容量: 1, 長度 : 1
容量: 2, 長度 : 2
容量: 4, 長度 : 3
容量: 4, 長度 : 4
容量: 8, 長度 : 5
容量: 8, 長度 : 6
版本: go1.17.10
由輸出結果可以看到,Slice 的容量會自動擴容的起點是 2,當長度大于 2 時,slice 的容量會自動擴容為原來的 2 倍,每一次擴容都會重新開辟一塊記憶體空間,將舊的資料復制到新開辟的記憶體空間中,然后釋放舊的記憶體空間,
陣列長度是固定的,而 Go 中使用的切片設計想法是由動態陣列概念而來,可以用來管理資料集合,并可以自動增加和減少,但是切片本身并不是動態資料或者陣列指標,與此同時,切片還具有可索引,可迭代的優秀特性,因此使用也更為廣范,
菜鳥實戰,持續學習!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/504672.html
標籤:其他
