您的位置:首页 > 编程语言 > Go语言

跟着猫哥学Golang[9] - slice

2015-11-12 23:08 459 查看
1. Golang中操作数组或者序列化数据需要用到slice,程序中写作“[]"。slice 指向数组的值,并且同时包含了长度信息。
例如:[]T
是一个元素类型为
T
的 slice。

先看段程序了解一下Golang的Slice:package main

import "fmt"

func main() {
list1 := []int{2,4,6,8}
fmt.Println(list1)
fmt.Printf("type %T\n", list1)
for i:=0;i<len(list1);i++ {
fmt.Printf("list1[%d] = %d\n",i, list1[i])
}
}

#输出
[2 4 6 8]
type []int
list1[0] = 2
list1[1] = 4
list1[2] = 6
list1[3] = 8

声明的时候,slice要放在类型前面,后面跟具体列表内容。当然,直接 list1 := []int{}也行,只不过这是个空数组,可以当做逻辑”非“来使用。

2. 与Python类似的,Golang的slice可以重新切片。语法:s[low:high],表示从 low 到 high-1 的 slice 元素,含有两端。 只要记住Golang类似于C,含下不含上,即可。

所以,我们可以很安全地推断出,s[low:low]会返回空切片[],而s[low:low+1]只包含一个元素,即:s[low]。 再来看一个重新切片的例子。

package main

import "fmt"

func main() {
list1 := []int{2,4,6,8,10}

fmt.Println(list1[1:1])
fmt.Println(list1[0:3])
fmt.Println(list1[:2])
fmt.Println(list1[1:])
fmt.Println(list1[:0])
}
# 输出:
[]
[2 4 6]
[2 4]
[4 6 8 10]
[]


3. slice也可以用make来声明,当然这里就会出现有Golang特色的切片了。

由函数 make 创建slice,这会分配一个零长度的数组并且返回一个 slice 指向这个数组: list2 := make([]int, 5)  // list2长度为5

Golang特色来了—— slice有长度和容量,slice 的容量是底层数组可以增长的最大长度。这会儿我们能明白之前使用的切片,长度和容量都是一样的了吧?也就明白默认情况下,容量和长度是一样的。

为了指定容量,可传递第三个参数到 make,比如:list3 := make([]int, 0, 5) // list3长度是0,容量是5。

看切片长度用len(),看切片容量用cap()。

slice 可以通过“重新切片”来扩容(增长到容量上限)。看下面的例子,就能明白了。

package main

import "fmt"

func main() {
list2 := make([]int, 4, 5)
fmt.Println(len(list2), cap(list2))
list2[3]=10
//list2[4]=20 会报错的...
fmt.Println(list2)
list2[0]=1
list2[1]=5
fmt.Println(list2)
fmt.Println(list2[:len(list2)])
fmt.Println(list2[:cap(list2)])
list2 = list2[:cap(list2)] //重新切片,增加slice容量
list2[4]=20 //这次是不报错的
fmt.Println("Now list2 is: ", list2)
}
# 输出:
4 5
[0 0 0 10]
[1 5 0 10]
[1 5 0 10]
[1 5 0 10 0]
Now list2 is: [1 5 0 10 20]

4. 空切片

很自然的,没有任何元素的切片就是空,逻辑上是”false“,也等同于Golang里的nil。再来个例子:

package main

import "fmt"

func main() {
var zerolist []int
fmt.Println(zerolist, len(zerolist), cap(zerolist))
if zerolist == nil {
fmt.Println("empty slice or zero elements list equals nil!")
}
}
# 输出:
[] 0 0
empty slice or zero elements list equals nil!



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: