专栏首页小尘哥的专栏第22节 数组(Array)

第22节 数组(Array)

一、数组(Array)

1.1 什么是数组

Go 语言提供了数组类型的数据结构。 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。

数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组的下标取值范围是从0开始,到长度减1。

数组一旦定义后,大小不能更改。

1.2 数组的语法

声明和初始化数组

需要指明数组的大小和存储的数据类型。

var variable_name [SIZE] variable_type

示例代码:

var balance [10] float32var balance = [5]float32{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

数组的其他创建方式:

  var a [4] float32 // 等价于:var arr2 = [4]float32{}  fmt.Println(a) // [0 0 0 0]  var b = [5] string{"ruby", "王二狗", "rose"}  fmt.Println(b) // [ruby 王二狗 rose  ]  var c = [5] int{'A', 'B', 'C', 'D', 'E'} // byte  fmt.Println(c) // [65 66 67 68 69]  d := [...] int{1,2,3,4,5}// 根据元素的个数,设置数组的大小  fmt.Println(d)//[1 2 3 4 5]  e := [5] int{4: 100} // [0 0 0 0 100]  fmt.Println(e)  f := [...] int{0: 1, 4: 1, 9: 1} // [1 0 0 0 1 0 0 0 0 1]  fmt.Println(f)

访问数组元素

float32 salary = balance[9]

示例代码:

package mainimport "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] = 100Element[1] = 101Element[2] = 102Element[3] = 103Element[4] = 104Element[5] = 105Element[6] = 106Element[7] = 107Element[8] = 108Element[9] = 109

数组的长度

通过将数组作为参数传递给len函数,可以获得数组的长度。

示例代码:

package mainimport "fmt"func main() {      a := [...]float64{67.7, 89.8, 21, 78}    fmt.Println("length of a is",len(a))}

运行结果:

length of a is 4

您甚至可以忽略声明中数组的长度并将其替换为…让编译器为你找到长度。这是在下面的程序中完成的。

示例代码:

package mainimport (      "fmt")func main() {      a := [...]int{12, 78, 50} // ... makes the compiler determine the length    fmt.Println(a)}

遍历数组:

package mainimport "fmt"func main() {      a := [...]float64{67.7, 89.8, 21, 78}    for i := 0; i < len(a); i++ { //looping from 0 to the length of the array        fmt.Printf("%d th element of a is %.2f\n", i, a[i])    }}

使用range遍历数组:

package mainimport "fmt"func main() {      a := [...]float64{67.7, 89.8, 21, 78}    sum := float64(0)    for i, v := range a {//range returns both the index and value        fmt.Printf("%d the element of a is %.2f\n", i, v)        sum += v    }    fmt.Println("\nsum of all elements of a",sum)}

如果您只需要值并希望忽略索引,那么可以通过使用_ blank标识符替换索引来实现这一点。

for _, v := range a { //ignores index}

1.3 多维数组

Go 语言支持多维数组,以下为常用的多维数组声明语法方式:

var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
var threedim [5][10][4]int

三维数组

a = [3][4]int{   {0, 1, 2, 3} ,   /*  第一行索引为 0 */ {4, 5, 6, 7} ,   /*  第二行索引为 1 */ {8, 9, 10, 11}   /*  第三行索引为 2 */}

1.4 数组是值类型

数组是值类型 Go中的数组是值类型,而不是引用类型。这意味着当它们被分配给一个新变量时,将把原始数组的副本分配给新变量。如果对新变量进行了更改,则不会在原始数组中反映。

package mainimport "fmt"func main() {      a := [...]string{"USA", "China", "India", "Germany", "France"}    b := a // a copy of a is assigned to b    b[0] = "Singapore"    fmt.Println("a is ", a)    fmt.Println("b is ", b) }

运行结果:

a is [USA China India Germany France]  b is [Singapore China India Germany France] 

数组的大小是类型的一部分。因此[5]int和[25]int是不同的类型。因此,数组不能被调整大小。不要担心这个限制,因为切片的存在是为了解决这个问题。

package mainfunc main() {      a := [3]int{5, 78, 8}    var b [5]int    b = a //not possible since [3]int and [5]int are distinct types}

本文分享自微信公众号 - 陌与尘埃(grq100296)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • thymeleaf中使用layui

    头部引入css,尾部引入js,定义两个模板(一个也可以,里面的碎片分开写,我喜欢写两个分别引入),注意th:fragment,fragment即碎片,可以在模板...

    小尘哥
  • 第16节 键盘输入和打印输出

    fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb('verb')源自C语言但更简单。

    小尘哥
  • springboot使用rabbitMQ(带回调)

    配置文件2:RabbitConstants(主要用于用户名、密码等值从配置文件获取,也可以用@Value方式)

    小尘哥
  • go-数组

    数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法:

    新人小试
  • Linux基础(day29)

    sed扩展 一. 打印某行到某行之间的内容 打印某一行到某一行之间的内容 需求: 例如:有个文件test的内容如下: ert fff ** [abcfd] 1...

    运维小白
  • XML封装与验证消息

    用户3003813
  • WordPress页面编辑插件:Divi Builder

    梦想家路飞
  • 想学潮汕话?这款小程序,教你最纯正的发音

    小程序体验师:郭诺亚 广东的大潮汕地区,不止盛产牛肉丸、牛肉火锅,还有笋粿蚝烙菜头粿,肠粉粿条猪脚圈,分分钟撑起一部深夜食堂。

    知晓君
  • 【C#】让ReSharper灰色显示未使用的非私有成员的关键

    1、在Inspection Severity中设置Non-private accessibility为Warning。如图:

    AhDung
  • 完整的java数组操作应用知识汇总

    数组是一种非常有用和常用的数据类型,存在于每种程序语言之中,java中的数组是一种最简单的复合数据类型,刚学习java数组的小白们大多都会听到一句这样的话:ja...

    三哥

扫码关注云+社区

领取腾讯云代金券