iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

golang初探系列 第 13

day13-Slice 切片介紹

  • 分享至 

  • xImage
  •  

上一章節講解到 array 的使用,文章中有提到 array 使用上是實值類型以及在 array 長度不可變的(限制長度),間接的限制了使用場景

所以今天要討論的是 slice 切片,也是 Golang 對 array 在進行一層的封裝

Slice

切片是一個擁有相同類型元素的可變長度的序列,可以非常靈活運用,自動擴容
切片是引用類型 內部結構當中包含 pointer len cap 。 使用方便且快速操作數據集合

切片宣告

var variabel_name [] Type

package main

import (
	"fmt"
)

func main() {
	var a []string //聲明一個字串切片
	var b = []int{}
	var c = []bool{false, true}
	fmt.Println(a)
	fmt.Println(b)        //[]
	fmt.Println(c)        //[flase ture]
	fmt.Println(a == nil) //true

}

切片長度和容量

切片擁有自己的長度和容量
可以使用 len() 查看長度
可以使用 cap() 查看容量

package main

import "fmt"

func main() {
	a := [7]int{55, 75, 58, 60, 66, 84, 10}
	b := a[1:4] //基於arra a創建切片,包含a[1],a[2],a[3]
	fmt.Println(b)
	fmt.Printf("type of b: %T \n", b)
	fmt.Printf("len %d\n", len(b)) //長度為3 是指元素的個數
	fmt.Printf("cap %d\n", cap(b)) //切片容量最底層從切片第一元素到最後

}

使用 make 創建切片

package main

import "fmt"

func main() {
	s1 := make([]int, 5, 10) //創建長度5 容量10的 切片
	fmt.Printf("s1 = %v len(s1) = %d cap(s1) = %d", s1, len(s1), cap(s1))
}

使用 append 來達成增加元素

使用 append() 來對 slice 進行操作
來達成自動擴容效果

package main

import "fmt"

func main() {
	s1 := make([]int, 2, 2) //創建長度0 容量2的 切片
	fmt.Printf("長度 %d 容量 %d\n", len(s1), cap(s1))
	fmt.Printf("指標為 %p\n", s1)
	//使用 append 對 s1 增加元素2
	s1 = append(s1, 2)
	fmt.Printf("s1 = %v \n", s1)
	//容量自動擴容至 4
	fmt.Printf("長度 %d 容量 %d ", len(s1), cap(s1))
	fmt.Printf("擴容後 pointer = %p 改變\n", s1)
	s1 = append(s1, 2, 7, 8, 10)
	fmt.Printf("s1 = %v\n", s1)
	fmt.Printf("長度 %d 容量 %d\n", len(s1), cap(s1))
	var b = []int{5, 89, 156, 10}
    //將 b 切片 與 s1 進行合併
	s1 = append(s1, b...)
	fmt.Printf("s1 = %v\n", s1)
	fmt.Printf("長度 %d 容量 %d\n", len(s1), cap(s1))
}

使用 copy 進行複製

操作兩個slice 藉由複製至目標

package main

import (
	"fmt"
)

func main() {
	var source []int = []int{1, 2, 3, 4, 5}
	var target = make([]int, 10)
	fmt.Println(target)
	copy(target, source )
	fmt.Println(target)
}


上一篇
day12-陣列介紹
下一篇
day14-Map 字典類型介紹
系列文
golang初探30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言