GO語言學習——切片二

PENGJUNQIAO發表於2022-04-29

使用make()函式構造切片

格式:

make([]T, size, cap)

其中:

  • T:切片的元素型別
  • size:切片中元素的數量
  • cap:切片的容量

切片的本質

切片的本質就是對底層陣列的封裝,它包含了三個資訊:

  • 底層陣列的指標
  • 切片的長度(len)
  • 切片的容量(cap)

切片的本質

切片就是一個框,框住了一塊連續的記憶體。

切片屬於引用型別,真正的資料都是儲存在底層陣列裡的。

判斷切片是否為空

使用len(s) == 0來判斷

切片不能直接比較

  • 一個nil值的切片沒有底層陣列

  • 一個nil值的切片的長度和容量都是0

  • 一個長度和容量都是0的切片不一定是nil

切片的賦值拷貝

切片遍歷

  • 索引遍歷和

  • for range遍歷

點選檢視程式碼
 package main
    
 import "fmt"
  
  // make()函式創造切片
  
  func main(){
  	s1 := make([]int,5,10)
  	fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1)) // s1=[0 0 0 0 0] len(s1)=5 cap(s1)=10
  
  	s2 := make([]int,0,10)
  	fmt.Printf("s2=%v len(s2)=%d cap(s2)=%d\n", s2, len(s2), cap(s2)) // s2=[] len(s2)=0 cap(s2)=10
  
  	// 切片的賦值
  	s3 := []int{1,3,5}
  	s4 := s3 // s3和s4都指向了同一個底層陣列
  	fmt.Println(s3, s4)
  	s3[0] = 1000
  	fmt.Println(s3, s4)
  
  	// 切片的遍歷
  	// 1. 索引遍歷
  	for i:=0;i<len(s3);i++ {
  		fmt.Println(s3[i])
  	}
  	// 2. for range迴圈
  	for i,v := range s3 {
  		fmt.Println(i, v)
  	}
  	
  }

vscode 配置程式碼片段

Ctrl + Shift + P snippets go(go.json)

{
	// Place your snippets for go here. Each snippet is defined under a snippet name and has a prefix, body and 
	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
	// same ids are connected.
	// Example:
	// "Print to console": {
	// 	"prefix": "log",
	// 	"body": [
	// 		"console.log('$1');",
	// 		"$2"
	// 	],
	// 	"description": "Log output to console"
	// }
	"println":{
		"prefix": "pln",
		"body":"fmt.Println($0)",
		"description": "println"
	},
	"printf":{
		"prefix": "plf",
		"body": "fmt.Printf(\"$0\")",
		"description": "printf"
	}
}

相關文章