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])
}
运行结果如下:
函数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)
}
运行结果如下:
从切片中删除元素
要从切片中删除元素,也可使用内置函数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)
}
运行结果如下:
复制切片中的元素
要复制切片的全部或部分元素,可使用内置函数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)
}
运行结果如下:
函数copy在新切片中创建元素的副本,因此修改一个切片中的元素不会影响另一个切片。还可将单个元素或特定范围内的元素复制到新切片中,下面的示例复制索引1处的元素。
copy(smellyCheeses, cheeses[1:])
酷客教程相关文章:
评论前必须登录!
注册