Go语言【第九篇】:Go数据结构之:数组
Go语言数组
Go语言提供了数组类型的数据结构。数组时具有相同唯一类型的一组已编号且长度固定的数据项序列,中类型可以是任意的原始类型如整形、字符串或者自定义类型。
相对于声明number0,number1,...,and number99的变量,使用数组形式numbers[0],numbers[1],...,numbers[99]更加方便且易于扩展。数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为0,第二个索引为1,以此类推,如下图所示:

声明数组
Go语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
以上为一维数组的定义方式,数组长度必须是整数且大于0。例如以下定义了数组balance长度为10类型为float32:
var balance [10] float32
初始化数组
以下演示了数组初始化:
var balance = [5] float{1000.0, 2.0, 3.4, 7.0, 50.0}
初始化数组{}中的元素个数不能大于[]中的数字,如果忽略[]中的数字不设置大小,Go语言会根据元素的个数来设置数组的大小:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
该实例与上面的实例是一样的,虽然没有设置数组的大小:
balance[4] = 50.0
以上实例读取了第五个元素,数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为0,第二个索引为1,以此类推,如下图所示:

访问数组元素
数组元素可以通过索引(位置)来读取,格式为数组名后加中括号,中括号中为索引值,例如:
float32 salary = balance[9]
以上实例读取了数组balance第10个元素的值,以下演示了数组完整操作(声明、赋值、访问)的实例:
package main
import "fmt"
func main(){
    var n [10] int    /* n 是一个长度为10的数组 */
    var i, j int
    /* 为数组 n 初始化元素 */
    for i = 0; i < 10; i++ {
        n[i] = i + 100    /* 设置元素为 i + 100 */
    }
    /* 输出每个数组元素的值 */
    for j = 0; j < 10; j++ {
        fmt.Printf("Element[%d] = %d\n", j, n[j]
    }
}
以上实例运行结果为:
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
跟过内容
数组对Go语言来说是非常重要的,以下介绍将介绍数组更多类容:
| 内容 | 描述 | 
|---|---|
| 多维数组 | Go语言支持多维数组,最简单的多维数组是二维数组 | 
| 向函数传递数组 | 可以像函数传递数组参数 | 
Go语言多维数组
Go语言支持多维数组,以下为常用的多维数组声明方式:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
以下实例声明了三维的整形数组:
var threedim [5][10][4] int
二维数组
二维数组是最简单的多维数组,二维数组本质上是由一维数组组成的,二维数组定义方式如下:
var arrayName [x][y] variable_type
variable_type 为Go语言的数据类型,arrayName为数组名,二维数组可以认为是一个表格,x为行,y为列,下图演示了一个二维数组a为三行四列:

二维数组中的元素可以通过a[i][j]来访问。
初始化二维数组
多维数组可以通过大括号来初始化,以实例为一个3行4列的二位数组:
a = [3][4]int {
     {0, 1, 2, 3} ,   /*  第一行索引为 0 */
     {4, 5, 6, 7} ,   /*  第二行索引为 1 */
     {8, 9, 10, 11}   /*  第三行索引为 2 */
}
访问二维数组
二维数组通过指定坐标来访问,如数组中的行索引与列索引,例如:
int val = a[2][3]
以上实例访问了二维数组val第三行第四列的元素(第三行的第四个元素),二维数组可以使用循环嵌套来输出元素:
package main
import "fmt"
func main() {
    /* 数组 - 5行 2列 */
    var a = [5][2] int { {0,0}, {1,2}, {2,4}, {3,6}, {4,8} }
    var i, j int
    /* 输出数组元素 */
    for i = 0; i < 5; i++ {
        for j = 0; j < 2; j++ {
            fmt.Printf("a[%d][%d] = %d\n", i, j, a[i][j])
        }
    }
}
以上实例运行输出结果为:
a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8
Go语言向函数传递数组
如果我们想向函数传递数组参数,需要在函数定义时,声明形参为数组,可以通过以下两种方式来声明:
方式一:形参设定数组大小
void myFunction(param [10] int) {
    .
    .
    .
}
方式二:形参未设定数组大小
void myFunction(param [] int) {
    .
    .
    .
}
以下实例中函数接收整形数组参数,另一个参数指定了数组元素的个数,并返回平均值:
func getAverage(arr []int, size int) float32 {
    var i int
    var avg, sum float32
    for i = 0; i < size; ++i {
        sum += arr[i]
    }
    avg = sum / size
    return avg
}
接下来我们调用这个函数:
package main
import "fmt"
func main() {
   /* 数组长度为 5 */
   var  balance = []int {1000, 2, 3, 17, 50}
   var avg float32
   /* 数组作为参数传递给函数 */
   avg = getAverage( balance, 5 ) ;
   /* 输出返回的平均值 */
   fmt.Printf( "平均值为: %f ", avg );
}
func getAverage(arr []int, size int) float32 {
   var i,sum int
   var avg float32  
   for i = 0; i < size;i++ {
      sum += arr[i]
   }
   avg = float32(sum) / float32(size)
   return avg;
}
以上实例执行结果为:
平均值为: 214.399994
以上实例中我们是以哦那个的形参并为设定数组大小,浮点数计算输出有一定的偏差,我们也可以转整形来设置精度,代码如下:
package main
import (
    "fmt"
)
func main() {
    a := 1.69
    b := 1.7
    c := a * b      // 结果应该是2.873
    fmt.Println(c)  // 输出的是2.8729999999999998
}
设定固定精度:
package main
import (
    "fmt"
)
func main() {
    a := 1690           // 表示1.69
    b := 1700           // 表示1.70
    c := a * b          // 结果应该是2873000表示 2.873
    fmt.Println(c)      // 内部编码
    fmt.Println(float64(c) / 1000000) // 显示
}
Go语言【第九篇】:Go数据结构之:数组的更多相关文章
- 从零开始学习R语言(四)——数据结构之“数组(Array)”
		本文首发于知乎专栏:https://zhuanlan.zhihu.com/p/60141207 也同步更新于我的个人博客:https://www.cnblogs.com/nickwu/p/125677 ... 
- 用js来实现那些数据结构(数组篇01)
		在开始正式的内容之前,不得不说说js中的数据类型和数据结构,以及一些比较容易让人混淆的概念.那么为什么要从数组说起?数组在js中是最常见的内存数据结构,数组数据结构在js中拥有很多的方法,很多初学者记 ... 
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
		这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ... 
- (转)Python成长之路【第九篇】:Python基础之面向对象
		一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ... 
- C语言中如何将二维数组作为函数的参数传递
		今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ... 
- Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
		Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ... 
- Go语言备忘录:基本数据结构
		本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处,多谢! 参考书籍<Go语 ... 
- C语言第九讲,结构体
		C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ... 
- ElasticSearch入门 第九篇:实现正则表达式查询的思路
		这是ElasticSearch 2.4 版本系列的第九篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ... 
随机推荐
- 优步UBER司机全国各地奖励政策汇总 (2月8日-2月14日)
			滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ... 
- 开胃小菜——impress.js代码详解
			README 友情提醒,下面有大量代码,由于网页上代码显示都是同一个颜色,所以推荐大家复制到自己的代码编辑器中看. 今天闲来无事,研究了一番impress.js的源码.由于之前研究过jQuery,看i ... 
- 抓取Oracle数据快照
			进入到oracle安装目录下的admin(找到这个目录)开启cmd键入sqlplus system/mima@实例名>@awrrpt.sql Would you like an HTML rep ... 
- Android intel X86 图像渲染
			最近几天有个项目需要在intel 芯片的系统上集成我们的视频通话软件.之前只是在ARM平台上使用,对于intel 没测试过,直接运行apk后,本端渲染的图像出错,渲染出的图像很像I420被作为RGB5 ... 
- Unity编辑器 - Rigidbody动力学Bake到AnimationClip
			Unity编辑器 - Rigidbody动力学Bake到AnimationClip Unity文档移动平台优化部分提到Physics对CPU的消耗较大 将动力学的特效如破碎等Bake成动画也是优化性能 ... 
- 利用爬虫、SMTP和树莓派3B发送邮件&续集&(爬取墨迹天气预报信息)
			-----------------------------------------------学无止境----------------------------------------------- 前 ... 
- GRU-CTC中文语音识别
			目录 基于keras的中文语音识别 音频文件特征提取 文本数据处理 数据格式处理 构建模型 模型训练及解码 aishell数据转化 该项目github地址 基于keras的中文语音识别 该项目实现了G ... 
- 我的linux操作习惯
			标签(空格分隔): ubuntu 最佳操作 用linux随时可能会有宕机的危险,谁知道我哪会神经病犯了呢.用deepin宕机的可能性会更高的,所以我才不得不安装一个windows做备份,然后把数据备份 ... 
- JDK中的泛型
			Java中的泛型介绍: 起因: 1. JDK 1.4 以前类型不明确: ① 装入集合的对象被当作 Object 类型对待,从而失去了自己的原有类型: ② 从集合中取出时往往需要转型,效率低下,并且容易 ... 
- Java中的增强for循环
			增强 for 循环 1. 增强的 for 循环对于遍历 Array 或 Collection 的时候相当方便. import java.util.*; public class Test { publ ... 
