http://www.wklken.me/posts/2014/03/02/04-data-structure.html@H_502_1@
一.Array
在Go语言中,数组是一个值类型(value type)@H_502_1@
所有的值类型变量在赋值和作为参数传递时都将产生一个复制动作@H_502_1@
如果作为函数的参数类型,则在函数调用时参数发生数据复制,在函数体中无法修改传入数组的内容@H_502_1@
数组相等用 = != 比较,不能用 < >@H_502_1@
1.声明&赋值
初始化@H_502_1@
语法 var VarName [n]type // n>=0 e.g. var a [5]int //[0 0 0 0 0] var c [2][3]int //二维 var b int = [5]int{1,2,3,4,5} //声明并初始化 a := [3]int{1,3} b := [10]int{1,3} //前三个元素,其他为0 c := [20]int{19:1} //第20个元素初始化为1,其他默认0 d := [...]int{4,5,6} //自动计算长度 e := [...]int{0:1,1:2,19:3} //自动推断 二维数组 doubleArray := [2][4]int{[4]int{1,4},[4]int{5,6,7,8}} easyArray := [2][4]int{{1,2,169)">3,169)">4}, {4}} 多维 [...][n] 前者可推断,但是后者必须显示赋值
数组的长度是该数组类型的一个内置常量@H_502_1@
注意,数组长度也是类型的一部分,因此不同长度数组为不同类型(内置常量)@H_502_1@
即[3]int和[4]int是不同类型,并且数组不能改变长度@H_502_1@
数组之间的赋值是值的赋值,即当把一个数组作为参数传入函数的时候,传入的其实是该数组的副本(一次复制操作),而不是它的指针,如果要传入指针,使用slice@H_502_1@
2.元素访问
可以用new创建数组@H_502_1@
注意区分@H_502_1@
二.Slice
数组切片就像一个指向数组的指针,但更复杂,实际上它拥有自己的数据结构,而不仅仅是指针(指向原生数组的指针 + 数组切片中元素个数 + 数组切片已分配的存储空间)@H_502_1@
一个引用类型,总是指向一个底层array,声明可以向array一样,只是不需要长度@H_502_1@
slice就像一个结构体,包含三个元素@H_502_1@
1.声明&赋值
通过array创建@H_502_1@
直接创建@H_502_1@