golang基礎---Slice切片
阿新 • • 發佈:2018-07-09
區分 ray golang基礎 \n 指向 一個數 內存 拷貝 列表
切片Slice在go語言中是單獨的類型(指向底層的數組),不同於python(對可叠代對象操作的工具),註意區分數組和slice的區別
- 定義一個空slice,格式
var s []int
,這種既沒有長度也沒有元素賦值的類型(相比叫array) 數組的基本操作如下 ,類似與python中列表切片的操作,詳見實例
package main import "fmt" func main() { var s1 []int //這樣就是一個slice類型,既沒有長度也沒有元素賦值 a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //這是一個數組 s2 := a[5:10] //切片,索引5到10的元素,不包含索引為10 s3 := a[:3] //切片,索引1-3的元素,不包含索引3 s4 := a[6:] //切片,第6個索引到最後一個索引的元素 s5 := a[:] //切片,復制一個數組 fmt.Println(s1) fmt.Println(a) fmt.Println(s2) //數組的切片,類似python fmt.Println(s3) fmt.Println(s4) fmt.Println(s5) } /*輸出 s1---> [] a---> [0 0 0 0 0 0 0 0 0 0] s2---> [6 7 8 9 10] s3---> [1 2 3] s4---> [7 8 9 10] s5---> [1 2 3 4 5 6 7 8 9 10] */
使用make初始化一個slice類型,包含三個參數
- ①切片類型 []int
- ②初始長度 len
③容量 cap
package main import "fmt" func main() { s1 := make([]int, 3, 10) //使用make初始化一個slice,包含三個參數:①切片類型②初始長度③容量 fmt.Println(len(s1), cap(s1)) //輸出長度,容量 fmt.Println(s1) } /*輸出: len(s1)--->3 cap(s1)--->10 s1---> [0 0 0] //可變數組 */
Reslice ,在原slice基礎上再次切片,slice一個數組時,不僅取出了len,同時容量也會得到相應的切片。
示例
//Reslice,在slice基礎上再次slice. package main import "fmt" func main() { a := []byte{‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘k‘, ‘m‘} //定義一個數組,元素為byte類型 sa := a[3:5] // slice切片,取索引三到五,不包含索引5 sb := sa[1:3] fmt.Println(string(sa)) fmt.Println(len(sa), cap(sa)) fmt.Println(string(sb)) fmt.Println(len(sb), cap(sb)) } /*輸出 sting(sa)---> de len(sa)---> 2 cap(sa)---> 6 string(sb)---> ef len(sb)---> 2 cap(sb)---> 5 */
Append,類似python中list類型,使用append,從數組尾部追加元素
- 可以將一個slice追加在另一個slice尾部
- 如果最終長度未超過追加到slice的容量,則返回原始slice
如果超過追加的slice的容量則將重新分配數組並拷貝原始數據
package main import "fmt" func main() { s1 := make([]int, 3, 8) //初始化slice,長度位3,容量為8 fmt.Printf("%p\n", s1) //輸出s1的內存地址 fmt.Println(s1) s1 = append(s1, 1, 2, 3) //末尾追加三個元素,cap依然為8 fmt.Printf("%p\n", s1) //原來的slice fmt.Println(s1) s1 = append(s1, 1, 2, 3, 4) //繼續追加元素,超過原s1容量,會重新分配新的內存地址 fmt.Printf("%p\n", s1) //cap容量超過8,為9 fmt.Println(s1) } /* p*s1---> 0xc042070040 s1---> [0 0 0] p*s1s1--> 0xc042070040 s1---> [0 0 0 1 2 3] p*s1---> 0xc04205e080 //新的內存地址 s1---> [0 0 0 1 2 3 1 2 3 4] */
當兩個slice同時指向某一個數組時,改變某一個slice索引時,另一個slice索引值及原數組的索引也會改變
package main import "fmt" func main() { a := []int{1, 2, 3, 4, 5, 6} s1 := a[2:5] s2 := a[1:3] fmt.Println(s1, s2) s1[0] = 9 fmt.Println(s1, s2) fmt.Println(a) } /* s1---> [3 4 5] s2---> [2 3] //更改s1的slice索引後,s2的索引也會改 s1---> [9 4 5] s2---> [2 9] a---> [1 2 9 4 5 6] */
copy,格式 copy(s1,s2)
, 將s2拷貝到s1數組中,當len(s1) > len(s2)時,最終將s2中的索引
替換掉s1的索引,當len(s1)<len(s2)時,s1的索引值全部被對應s2的索引替換
示例
package main import "fmt" func main() { s1 := []int{1, 2, 3, 4, 5} s2 := []int{6, 7, 8} copy(s1, s2) //將s2的元素拷貝到s1,s2 fmt.Println(s1) copy(s2, s1) fmt.Println(s2) copy(s1, s2[2:3]) //只拷貝某一切片的索引 fmt.Println(s1) } /*輸出 s1---> [6 7 8 4 5] s2---> [1 2 3] s1---> [8 2 3 4 5] */
golang基礎---Slice切片