揭阳响应式网站价格,网站仿站是啥,软件开发公司组织结构图,word在线编辑数组就是一篇连续的内存#xff0c;几乎所有的计算机语言都有数组#xff0c;只不过 Go 语言里面的数组其实并不常用#xff0c;这是因为数组是定长的静态的#xff0c;一旦定义好长度就无法更改#xff0c;而且不同长度的数组属于不同的类型#xff0c;之间不能相互转换…数组就是一篇连续的内存几乎所有的计算机语言都有数组只不过 Go 语言里面的数组其实并不常用这是因为数组是定长的静态的一旦定义好长度就无法更改而且不同长度的数组属于不同的类型之间不能相互转换相互赋值用起来多有不方便之处。切片是动态的数组是可以扩充内容增加长度的数组。当长度不变时它用起来就和普通数组一样。当长度不同时它们也属于相同的类型之间可以相互赋值。切片的便捷性让数组的绝大多数应用领域都广泛地被取代了。不过也不可以小瞧数组在切片的底层实现中数组是切片的基石是切片的特殊语法隐藏了内部的细节让用户不能直接看到内部隐藏的数组。切片不过是数组的一个包装给顽固的数组装上了灵活的翅膀让石头也可以展翅飞翔。仅仅是上面纯文字的说明读者肯定会感觉很懵。下面让我们来看具体的实例。数组变量的定义我们先试一下只申明类型不赋初值。这时编译器会给数组默认赋上「零值」。数组的零值就是所有内部元素的零值。package mainimport fmtfunc main() {var a [9]intfmt.Println(a)}------------[0 0 0 0 0 0 0 0 0]复制代码下面我们看看另外三种变量定义的形式 效果都是一样的package mainimport fmtfunc main() {var a [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [10]int [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}c : [8]int{1, 2, 3, 4, 5, 6, 7, 8}fmt.Println(a)fmt.Println(b)fmt.Println(c)}---------------------[1 2 3 4 5 6 7 8 9][1 2 3 4 5 6 7 8 9 10][1 2 3 4 5 6 7 8]复制代码数组的访问接下来我们使用下标来简单操作一下数组这个数组里存的是数字的平方值package mainimport fmtfunc main() {var squares [9]intfor i : 0; i len(squares); i {squares[i] (i 1) * (i 1)}fmt.Println(squares)}--------------------[1 4 9 16 25 36 49 64 81]复制代码数组的下标越界检查(高阶知识)上面的代码中我们注意到可以使用内置函数 len() 来直接获取数组的长度。数组的长度是编译期确定的当我们使用 len() 函数访问数组的长度属性时编译器在背后偷偷把它替换成了整数值。package mainimport fmtfunc main() {var a [5]int{1,2,3,4,5}a[101] 255fmt.Println(a)}-----./main.go:7:3: invalid array index 101 (out of bounds for 5-element array)复制代码上面的代码运行结果说明了 Go 语言会对数组访问下标越界进行编译器检查。有一个重要的问题是如果下标是一个变量Go 是如何检查下标越界呢变量需要在运行时才可以决定是否越界Go 是如何办到的呢package mainimport fmtfunc main() {var a [5]int{1,2,3,4,5}var b 101a[b] 255fmt.Println(a)}------------panic: runtime error: index out of rangegoroutine 1 [running]:main.main()/Users/qianwp/go/src/github.com/pyloque/practice/main.go:8 0x3dexit status 2复制代码答案是 Go 会在编译后的代码中插入下标越界检查的逻辑所以数组的下标访问效率是要打折扣的比不得 C 语言的数组访问性能。数组赋值同样的子元素类型并且是同样长度的数组才可以相互赋值否则就是不同的数组类型不能赋值。数组的赋值本质上是一种浅拷贝操作赋值的两个数组变量的值不会共享。package mainimport fmtfunc main() {var a [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [9]intb aa[0] 12345fmt.Println(a)fmt.Println(b)}--------------------------[12345 2 3 4 5 6 7 8 9][1 2 3 4 5 6 7 8 9]复制代码从上面代码的运行结果中可以看出赋值后两个数组并没有共享内部元素。如果数组的长度很大那么拷贝操作是有一定的开销的使用的时候一定需要注意。下面我们尝试使用不同长度的数组赋值会有什么结果package mainimport fmtfunc main() {var a [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [10]intb afmt.Println(b)}--------------------------./main.go:8:4: cannot use a (type [9]int) as type [10]int in assignment复制代码可以看出不同长度的数组之间赋值是禁止的因为它们属于不同的类型。数组的遍历数组除了可以使用下标进行遍历之外还可以使用 range 关键字来遍历range 遍历提供了下面两种形式。package mainimport fmtfunc main() {var a [5]int{1,2,3,4,5}for index : range a { fmt.Println(index, a[index]) } for index, value : range a {fmt.Println(index, value)}}------------0 11 22 33 44 50 11 22 33 44 5复制代码考虑到切片的内容太多我们将独立一节专门讲解切片下一节将是 Go 语言的极有价值的一节读者一定要努力搞清楚每一个细节。