
1.4 数组高级技巧
1.4.1 一维数组的排序
在Go语言中,只要实现了sort.Interface接口,即可通过sort包内的函数完成排序、查找等操作。并且sort包已经把[]int、[]float64、[]string 3种类型都实现了该接口,可以方便地调用。
在Go语言中,sort.Sort()函数是递增排序,如果要实现递减排序,则要用sort.Reverse()函数,示例如下。
代码路径:chapter1/array/sort1.go。


1.4.2 二维数组的排序
对于二维数组的排序,可以通过实现sort.Interface接口的方法来处理。本节通过一个数组按指定规则排序的Go算法问题来进行示例,该算法具体要求如下。
给出一个二维数组,将这个二维数组按第i列(i从1开始)排序。如果第i列相同,则对相同的行按第i+1列的元素排序;如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列。如果第i列到最后一列都相同,则按原序排列。
例如,给定如下一个样例输入。
1,9,5
2,3,6
3,6,9
1,8,3
如果按第2列排序,则输出如下结果。
2,3,6
3,6,9
1,8,3
1,9,5
以上算法的Go语言代码实现如下。
代码路径:chapter1/array/sort.go。


写好排序算法后,编写一个main()函数来进行测试,示例如下。
代码路径:chapter1/arraySlice/mutilarray.go。


在文件所在目录打开命令行终端,输入启动命令,返回值如下。

1.4.3 多维数组声明
对于有一些Go语言编程经验的读者来说,尽管已经知道如何使用数组,但是对多维数组未必熟悉。多维数组可以理解为多个表单,如图1-3所示。

● 图1-3
常见的数组大多都是一维的线性数组,而多维数组在数值和图形计算领域却有比较常见的应用。多维数组的处理核心是将多维数组转换成二维数组,所以当遇到多维数组问题时,首先要考虑的就是降维,只要掌握了二维数组的排序方法,就可以轻松地通过for循环将多维数组转换成二维数组来处理。
Go语言多维数组声明方式如下。

以上声明语句的说明如下。
● variable_name:变量名字。
● [SIZE1] [SIZE2] … [SIZEN]:表示维度为N的数组的各维度的数组大小。
● variable_type:变量类型。
多维数组可通过大括号来初始化值。例如,声明一个3行4列的二维数组的示例如下。

例如,声明三维的整型数组的形式如下。
代码路径:chapter1/arraySlice/mutilarray1.go。

1.4.4 多维数组遍历
多维数组的遍历常用多重for循环来实现。例如,二维数组可以使用for循环嵌套来输出元素,示例如下。
代码路径:chapter1/arraySlice/mutilarray3.go。


1.4.5 多维数组的查询
在一维数组中,如果使用索引查看第1个元素,则直接使用索引为0即可,示例如下。

对于多维数组,访问索引为0的第1个元素的示例如下。
代码路径:chapter1/arraySlice/mutilarray4.go。

1.4.6 多维数组的修改
对于多维数组的修改,通过对要修改的元素重新赋值即可,例如,可以尝试对索引为0的元素进行修改,再修改索引为1的元素,示例如下。
代码路径:chapter1/arraySlice/mutilarray5.go。


1.4.7 三维数组生成器
创建一个三维数组生成器,需要通过make()函数和for…range循环语句配合起来实现,示例如下。
代码路径:chapter1/arraySlice/mutilarray2.go。

1.4.8 【实战】从数据库中获取数据并进行合并处理和导出
从数据库中获取数据并进行合并处理,主要用到database/sql包和encoding/csv包,以及驱动包github.com/go-sql-driver/mysql。方法是:首先连接数据库获取数据,然后进行合并处理,最后导出到CSV文件,示例如下。
代码路径:chapter1/arraySlice/1.3.9-export_csv.go。

