Go 使用切片

Go 使用切片,在Go语言中,数组是一个重要构件,但使用切片的情况更多。切片是底层数组中的一个连续片段,通过它您可以访问该数组中一系列带编号的元素。因此,切片能够让您顺序访问数组的特定部分。为何要使用切片呢?为何不直接使用数组呢?

在Go语言中,使用数组存在一定的局限性。采用前面的数组cheeses表明方试,您无法在数组中添加元素;然而切片比数组更灵活,您可在切片中添加和删除元素,还可复制切片中的元素。可将切片视为轻量级的数组包装器,它既保留了数组的完整性,又比数组使用起来更容易。

要声明一个长度为2的空切片,可使用如下语法。

var cheeses = make([]string, 2)

解读如下:

  • 使用关键字var声明一个名为cheeses的变量。
  • 在等号右边,使用Go内置函数make创建一个切片,其中第一个参数为数据类型,而第二个参数为长度。在这里,创建的切片包含两个字符串元素。
  • 将切片赋给变量cheeses。

创建切片后,可像给数组赋值一样给切片赋值。

cheeses[0] = "Mariolles"
cheeses[1] = "Époisses de Bourgogne"

要打印切片的值,方法也与打印数组一样。

fmt.Println(cheeses[0])
fmt.Println(cheeses[1])

到目前为止,切片类似于数组,但不同于数组的是,您可在切片中添加和删除元素。

在切片中添加元素

Go语言提供了内置函数append,让您能够增大切片的长度。

cheeses := append(cheeses, "coolcou")
fmt.Println(cheeses[2])

append会在必要时调整切片的长度,但它对程序员隐藏了这种复杂性。在这里,将切片的长度从2调整为3,并将值“coolcou”赋给了新创建的元素(其索引为2)。在编程接口方面,程序员只需使用新创建的索引来引用这个元素即可。这样,只需一行代码,就调整了切片的长度,并给新元素赋值了。

如下代码演示了如何在切片中添加元素:

 package main

 import (
  "fmt"
 )

 func main() {
  var cheeses = make([]string, 2)
  cheeses[0] = "Mariolles"
  cheeses[1] = "Époisses de Bourgogne"
  cheeses = append(cheeses, "coolcou")
  fmt.Println(cheeses[2])
 }

运行结果如下:
Go 使用切片

函数append也是一个不定参数函数。第4章介绍了不定参数函数,您已经知道它们是参数数量可变的函数。这意味着使用函数append可在切片末尾添加很多值。

cheeses := append(cheeses, "coolcou", "Reblochon", "Picodon")

这将相应地调整切片cheeses的长度,并将指定的值赋给新创建的元素。

如下程序演示了如何在切片末尾添加多个元素:

 package main

 import (
  "fmt"
 )

 func main() {
  var cheeses = make([]string, 2)
  cheeses[0] = "Mariolles"
  cheeses[1] = "Époisses de Bourgogne"
  cheeses = append(cheeses, "coolcou", "Reblochon", "Picodon")
  fmt.Println(cheeses)
}

运行结果如下:
Go 使用切片

从切片中删除元素

要从切片中删除元素,也可使用内置函数append。在下面的示例中,删除了索引2处的元素。

cheeses = append(cheeses[:2], cheeses[2+1:]...)

通过在删除元素前后检查切片cheeses的长度,可知已经正确地调整了该切片的长度。另外,元素的排列顺序没有发生变化。

如下程序演示了如何从切片中删除元素:

 package main

 import (
  "fmt"
 )

 func main() {
  var cheeses = make([]string, 3)
  cheeses[0] = "Mariolles"
  cheeses[1] = "Époisses de Bourgogne"
  cheeses[2] = "coolcou"
  fmt.Println(len(cheeses))
  fmt.Println(cheeses)
  cheeses = append(cheeses[:2], cheeses[2+1:]...)
  fmt.Println(len(cheeses))
  fmt.Println(cheeses)
 }

运行结果如下:
Go 使用切片

复制切片中的元素

要复制切片的全部或部分元素,可使用内置函数copy。在复制切片中的元素前,必须再声明一个类型与该切片相同的切片,例如,不能将字符串切片中的元素复制到整数切片中。如下程序演示了如何将一个切片中的元素复制到另一个切片中。

 package main

 import (
  "fmt"
 )

 func main() {
  var cheeses = make([]string, 3)
  cheeses[0] = "Mariolles"
  cheeses[1] = "Époisses de Bourgogne"
  var smellyCheeses = make([]string, 2)
  copy(smellyCheeses, cheeses)
  fmt.Println(smellyCheeses)
 }

运行结果如下:
Go 使用切片

函数copy在新切片中创建元素的副本,因此修改一个切片中的元素不会影响另一个切片。还可将单个元素或特定范围内的元素复制到新切片中,下面的示例复制索引1处的元素。

copy(smellyCheeses, cheeses[1:])

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!