Go语言中的数组(array)和数组切片(slice)
2013-02-17 18:31
1281 查看
在Go语言中,数组长度在定义后就不可更改,在声明时长度可以为一个常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式)。数组的长度是该数组类型的一个内置常量,可以用Go语言的内置函数len()来获取。 数组的长度在定义后无法再次修改;数组是值类型,每次传递都产生一份副本。 初看起来数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是一个指针。数组切片的数据结构可以抽象为以下3个变量:一个指向原生数组的指针数组切片中元素的个数数组切片已分配的存储空间 从底层实现的角度看,数组切片实际上仍然使用数组来管理元素,基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且可以被随意传递,而不会导致所管理的元素被复制。下面用 reflect 包来反射出数据的类型。
package main
import(
"fmt"
"reflect"
)
func main(){
vs:=[]interface{}{
[]int{},// slice 切片
[]int{1,2,3},// slice 切片
[]int{1,2,3}[:],//切片再切还是切片
make([]int,3,10),//标准的slice 定义方式
[3]int{1,2,3},//array 数组,确定数组长度
[...]int{1,2,3},//array 数组,由编译器自动计算数组长度。
}
for i,v:=range vs{
rv:=reflect.ValueOf(v)//进入疯狂的reflect世界
fmt.Println(i,rv.Kind())
}
}上述程序执行结果:0 slice 1 slice 2 slice 3 slice 4 array 5 array注意slice和数组在声明时的区别:声明数组时,方括号内写明了数组的长度或使用...自动计算长度,而声明slice时,方括号内没有任何字符。数组切片的扩容:
ww:=make([]int,3,5)
ww[0]=23
ww[1]=23
ww[2]=23
//ww[3]=34// 这样赋值会报错误 panic: runtime error: index out of range 超过了切片的大小
fmt.Println(cap(ww))
ww=append(ww,2,4,34)//需要用 append 给赋值, append 在存储空间不足时,会自动增加存储空间
fmt.Println(cap(ww))
fmt.Println(ww)注:append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。 但当slice中没有剩余空间(即(cap-len) == 0)时,此时将动态分配新的数组空间。返回的slice数组指针将指向这个空间,而原数组的内容将保持不变;其它引用此数组的slice则不受影响。 参考:数组(Array)和切片(Slice)/article/2195892.html Golang Go语言Array数组与Slice切片的不同http://kejibo.com/golang-slice-array-reflect/2.2 Go基础 https://github.com/astaxie/build-web-application-with-golang/blob/master/02.2.md
相关文章推荐
- 第4课 Go数组Array和切片Slice
- [Go] 数组 和 切片(array、slice)
- Go语言 数组(Array), 分片(Slice), Map 以及 Set
- go 数组(array)、切片(slice)、map、结构体(struct)
- go语言笔记——切片底层本质是共享数组内存!!!绝对不要用指针指向 slice切片本身已经是一个引用类型就是指针
- 深入理解golang — 数组(array)、切片(slice)、map
- Go语言_array,slice,map
- GO语言数组和切片实例详解
- Go语言学习笔记 --- slice切片
- Go语言学习笔记(三)数组 & 切片 & map
- 详解go语言的array和slice 【二】
- 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
- Go语言中的数组和Slice
- Go 语言切片(Slice)
- 数组(Array)和切片(Slice)
- Go语言中的 Array, Slice和 Map
- Go 语言切片(Slice)
- go递归函数如何传递数组切片slice
- 理解Golang中的数组(array)、切片(slice)和map
- Go语言学习笔记十一: 切片(slice)