📜  GO语言 切片

📅  最后修改于: 2021-01-02 09:08:08             🧑  作者: Mango

去切片

在Go中,切片是基础数组的动态大小的分段视图。该段可以是整个数组或数组的子集。我们通过指示开始和结束索引来定义数组的子集。切片为基础数组提供了一个动态窗口。

切片数据类型示例:

package main
import (
   "fmt"
)
func main() {
   odd := [6]int{2, 4, 6, 8, 10, 12}
   var s []int = odd[1:4]
   fmt.Println(s)
}

输出:

[4 6 8]

切片就像对数组的引用。 Slice不存储任何数据。如果我们更改数组的元素,它也会修改基础数组。如果其他分片引用同一基础数组,则它们的值也将更改。

切片就像数组引用。切片的示例如下:

package main
import "fmt"
func main() {
   names := [4]string{
      "John",
      "Jim",
      "Jack",
      "jen",
   }
   fmt.Println(names)
   slice1 := names[0:2]
   slice2 := names[1:3]
   fmt.Println(slice1, slice2)
   slice2[0] = "ZZZ"
   fmt.Println(slice1, slice2)
   fmt.Println(names)
}

输出:

[John Jim Jack jen]
[John Jim] [Jim Jack]
[John ZZZ] [ZZZ Jack]
[John ZZZ Jack jen]

切片字面量

切片字面量就像没有任何长度的数组字面量。没有长度的切片示例如下:

package main
import "fmt"
func main() {
   s := []struct {
      i int
      b bool
   }{
      {1, true},
      {2, false},
      {3,true},
      {4, true},
      {5, false},
      {6, true},
   }
   fmt.Println(s)
}

输出:

[{1 true} {2 false} {3 true} {4 true} {5 false} {6 true}]

省略上下键

在slice中,我们可以省略下键或上键。零是上限或下限键的默认值。

package main
import "fmt"
func main() {
   slice1 := []int{2,4,8,10,12,14}
   slice2 := slice1[2:4]
   fmt.Println(slice2)
   slice3 := slice1[:3]
   fmt.Println(slice3)
   slice4 := slice1[2:]
   fmt.Println(slice4)
   fmt.Println(slice1)
}

输出:

[8 10]
[2 4 8]
[8 10 12 14]
[2 4 8 10 12 14]

切片长度和容量

切片具有长度和容量。长度是存储的元素数,容量是从切片的开头算起的基础数组的元素数。

要获得长度,我们使用len(slice)函数,并获得容量,我们使用cap(slice)函数。

package main
import "fmt"
func main() {
   slice1 := []int{2,4,6,8,10,12,14}
   printSlice(slice1)
   // Slice the slice to give it zero length.
   slice2 := slice1[:0]
   printSlice(slice2)
   // Extend its length.
   slice3 := slice1[:4]
   printSlice(slice3)
   // Drop its first two values.
   slice4 := slice1[2:]
   printSlice(slice4)
}
func printSlice(s []int) {
   fmt.Printf("length =%d capacity=%d %v\n", len(s), cap(s), s)
}

输出:

length =7 capacity=7 [2 4 6 8 10 12 14]
length =0 capacity=7 []
length =4 capacity=7 [2 4 6 8]
length =5 capacity=5 [6 8 10 12 14]

切片功能

我们还可以借助make函数创建切片。 make函数创建大小为零的数组,并返回该数组的切片。

package main
import "fmt"
func main() {
   slice := make([]int, 10)
   printSlice("slice", slice)
   slice1 := make([]int, 0, 10)
   printSlice("slice1", slice1)
   slice2 := slice1[:5]
   printSlice("slice2", slice2)
   slice3 := slice2[2:5]
   printSlice("slice3", slice3)
}
func printSlice(s string, x []int) {
   fmt.Printf("%s length=%d capacity=%d %v\n",
      s, len(x), cap(x), x)
}

输出:

slice length=10 capacity=10 [0 0 0 0 0 0 0 0 0 0]
slice1 length=0 capacity=10 []
slice2 length=5 capacity=10 [0 0 0 0 0]
slice3 length=3 capacity=8 [0 0 0]