博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《快学 Go 语言》第 4 课 —— 低调的数组
阅读量:2441 次
发布时间:2019-05-10

本文共 2670 字,大约阅读时间需要 8 分钟。

只要掌握了数据结构中的四大法宝,就可以包打天下,他们是:array 、linked list 、hash table、binary tree 。这四大法宝可不是各自为战的,灵活结合才能游刃有余。比如,一个用 hash table 组织的 symbol table,其中个个都是由字符型 array 构成的 linked list 组成的。 --- Go 语言之父 Rob Pike

Go 语言里面的数组其实很不常用,这是因为数组是定长的静态的,一旦定义好长度就无法更改,而且不同长度的数组属于不同的类型,之间不能相互转换相互赋值,用起来多有不方便之处。

切片是动态的数组,是可以扩充内容增加长度的数组。当长度不变时,它用起来就和普通数组一样。当长度不同时,它们也属于相同的类型,之间可以相互赋值。这就决定了数组的应用领域都广泛地被切片取代了。

不过也不可以小瞧数组,在切片的底层实现中,数组是切片的基石,是切片的特殊语法隐藏了内部的细节,让用户不能直接看到内部隐藏的数组。切片不过是数组的一个包装,给顽固的数组装上了灵活的翅膀,让石头也可以展翅飞翔。

仅仅是上面纯文字的说明,读者肯定会感觉很懵。下面让我们来看具体的实例。

数组变量的定义

我们先试一下只申明类型,不赋初值。这时编译器会给数组默认赋上「零值」。数组的零值就是所有内部元素的零值。

package mainimport "fmt"func main() {    var a [9]int    fmt.Println(a)}------------[0 0 0 0 0 0 0 0 0]

package mainimport "fmt"func 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 "fmt"func main() {    var squares [9]int    for 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 "fmt"func main() {    var a = [5]int{1,2,3,4,5}    a[101] = 255    fmt.Println(a)}-----./main.go:7:3: invalid array index 101 (out of bounds for 5-element array)

package mainimport "fmt"func main() {    var a = [5]int{1,2,3,4,5}    var b = 101    a[b] = 255    fmt.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

数组赋值

同样的子元素类型并且是同样长度的数组才可以相互赋值,否则就是不同的数组类型,不能赋值。数组的赋值本质上是一种浅拷贝操作,赋值的两个数组变量的值不会共享。

package mainimport "fmt"func main() {    var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}    var b [9]int    b = a    a[0] = 12345    fmt.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 "fmt"func main() {    var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}    var b [10]int    b = a    fmt.Println(b)}--------------------------./main.go:8:4: cannot use a (type [9]int) as type [10]int in assignment

数组的遍历

数组除了可以使用下标进行遍历之外,还可以使用 range 关键字来遍历,range 遍历提供了下面两种形式。

package mainimport "fmt"func 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

640?wx_fmt=jpeg

扫一扫二维码阅读《快学 Go 语言》更多章节

转载地址:http://btbqb.baihongyu.com/

你可能感兴趣的文章
SQL Server 存储过程的经典分页(转)
查看>>
学习J2ME编程需要掌握的七种技术(转)
查看>>
DB2 UDB V8.1管理学习笔记(二)(转)
查看>>
Symbian OS 开发初级手册(转)
查看>>
限制只能中文输入的方法(转)
查看>>
共享池 shared pool
查看>>
一张图搞定Java面向对象
查看>>
Borland ALM之需求定义和管理解决方案
查看>>
Verizon选择Borland控制开发流程并降低风险
查看>>
Borland 崭新的Caliber Define IT产品
查看>>
IBM Rational RequisitePro集成简介
查看>>
OOAD利器Rational Rose的介绍
查看>>
一年的测试生活和感悟
查看>>
通过RUP用例进行需求管理的可追踪性策略(2)
查看>>
持续改进之配置管理变更的关键路径
查看>>
postgresql 优化与维护
查看>>
mongodb replica sets 测试
查看>>
linux AS6.2 与 as5.4 的对比,性能提升明显
查看>>
FLASHCACHE 的是是非非
查看>>
length() between oracle and postgresql
查看>>