跟着猫哥学Golang[9] - slice
2015-11-12 23:08
459 查看
1. Golang中操作数组或者序列化数据需要用到slice,程序中写作“[]"。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]。 再来看一个重新切片的例子。
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!")
}
}
例如:[]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!
相关文章推荐
- Going Home(最大匹配km算法)
- Google 多源码管理工具 gclient
- 快速上手 Mongoose
- Go指南中的练习:Stringers
- Growth of Functions - Introduction to Algorithm - Summary of Chapter 3
- django 快速搭建blog
- UVA 11090 Going in Cycle!! (spfa + 二分)
- Git Tutorial 2 - Goto Local Repository
- golang不定参数
- django 快速实现注册
- Introduction to Algorithm - Summary of Chapter 2(2) - Merge Sort
- golang学习之win7下go环境搭建
- 坑爹的golang日期时间格式format()
- golang截取中文字符串
- Django 1.8.2 文档 总结
- 2012年5月16日,Google发布“知识图谱(Knowledge Graph)”
- Introduction to Algorithm - Summary of Chapter 2(1) - Insertion sort
- pymongo update更新多条记录
- mongo创建用户
- Django中间件