Array

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

1.数组 在定义阶段,长度和类型就固定了,以后不能更改
2.长度也是数组类型的一部分

数组定义:

var 数组变量名 [元素数量]T
// 定义一个长度为3元素类型为int的数组a
var a [3]int

注意:

package main

import "fmt"

func main()  {
var a [3]int
var b [5]int
fmt.Println(a, b) // [0 0 0] [0 0 0 0 0]

   a = b //不可以这样做,因为此时a和b是不同的类型

  // 注意: a与都是b数组, 单两者是不同类型的数组,因为长度不同 
  // 数组的类型 = 数组内数据的类型 + 定义长度
}

数组的初始化

  • 方式一

package main

import "fmt"

func main()  {
// var a1 [3]int = [3]int{1,2,3}
var a1 = [3]int{1,2,3}
var a2 = [5]int{1,2,3}
var s1 = [3]string{"上海"}
fmt.Println(a1) // [1 2 3]
fmt.Println(a2) // [1 2 3 0 0] int类型数组内的数据数量小于定义数量时,默认用零补位
fmt.Println(s1) // [上海 ] string类型数组内的数据数量小于定义数量时,默认用空格补位
}
  • 方式二

按照上面的方法每次都要确保提供的初始值和数组长度一致,一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度

package main

import "fmt"

func main()  {
  // 自动获取数组长度
var a3 = [...]int{1,2,3,4,5}
var s2 = [...]string{"上海", "北京"}
fmt.Println(a3) // [1 2 3 4 5]
fmt.Println(s2) // [上海 北京]
}
  • 方式三

我们还可以使用指定索引值的方式来初始化数组

package main

import "fmt"

func main()  {
var a4 [5]int
a4 = [5]int{4:1} // 索引4的数字为1其余为0
fmt.Println(a4) // [0 0 0 0 1]
   fmt.Printf("a4的类型是:%T", a4)  // a4的类型是:[5]int
}

数组的取值

Go语言的数组可按索引取值

package main

import "fmt"

func main()  {
var s3 = [...]string{"上海", "北京"}
fmt.Println(s3[1]) // 北京
fmt.Printf("%T \n", s3[1]) // string
   s4 := s3[0]
fmt.Println(s4) // 上海
}

数组的遍历

package main

import "fmt"

func main()  {
var s5 = [3]int{1,2,3}
for i := 0; i < len(s5); i++{
fmt.Print(s5[i]) //
} for i, v := range s5{
fmt.Printf("索引:%d 值:%d \n", i, v) // 索引:0 值:1 ...
}
}

练习

  • 求数组内元素的和

package main

import "fmt"

func main()  {
var a5 = [...]int{1,3,5}
value := 0
for index := 0; index < len(a5); index++ {
value = value + a5[index]
}
fmt.Println(value) // var v = 0
for _, i := range a5{
v = v + i
}
fmt.Println(value) //
}
  • 查找[1,3,5,7,8]数组内和为8的元素组合

package main

import "fmt"

func main()  {
var a7 = [...]int{1,3,5,7,8}
for i := 0; i < len(a7); i++ {
for j := i+1; j < len(a7); j++ {
if a7[i]+a7[j] == 8 {
fmt.Printf("(%d %d)", a7[i], a7[j]) // (1 7)(3 5)
}
}
}
}

多维(层)数组

Go语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。

多维数组的定义

package main

import "fmt"

func main()  {
  // 初始化方式一
var a9 [3][2]int
a9 = [3][2]int{
[2]int{1,2},
[2]int{3,4},
}
fmt.Println(a8) // [1 2 3]
fmt.Println(a9) // [[1 2] [3 4] [0 0]]
// 初始化方式二
var a10 = [...][2]int{
{6,7},
{8,9},
{0,1},
}
fmt.Println(a10) // [[6 7] [8 9] [0 1]]
// 注意:多维数组除了第一次可以用[...], 其他层都不能用[...]
}

多维数组的取值

package main

import "fmt"

func main()  {
var a10 = [...][2]int{
{6,7},
{8,9},
{0,1},
}
fmt.Println(a10[1][0]) //
}

多维数组的遍历

package main

import "fmt"

func main()  {
var a10 = [...][2]int{
{6,7},
{8,9},
{0,1},
}
// 方式一
for i := 0; i < len(a10); i++ {
fmt.Print(a10[i]) // [6 7][8 9][0 1]
}
// 方式二
for _, i := range a10{
fmt.Print(i) // [6 7][8 9][0 1]
}
}

数组是值类型

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值。

package main

import "fmt"

func main()  {
a11 := [2]int{1,2}
a12 := a11 // 在内存中为变量a12开辟了内存空间,存入数组[1 2]
a11[0] = 5 // 改变的是变量a11在内存中数组[1,2]里的值
fmt.Println(a11) // [5 2]
fmt.Println(a12) // [1 2]
}

摘自

Go语言 - 数组 | 多维数组的更多相关文章

  1. C语言之二维数组

    二维数组 还是一个数组,只不过数组中得每一个元素又是一个数组 1). 声明语法 类型 数组名[行][列]; 例:  int nums[2][3];//2行3列的二维数组,保存的数据类型是int类型 c ...

  2. 【C语言】多维数组

    C 语言支持多维数组.多维数组声明的一般形式如下: type name[size1][size2]...[sizeN]; 二维数组 多维数组最简单的形式是二维数组.一个二维数组,在本质上,是一个一维数 ...

  3. C语言基础--二维数组

    二维数组概念: 数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组,二维数组是特殊的一维数组. 二维数组格式: 元素类型 数组名称[一维数组的个数][每个一维数组的元素个数]; 元素类型 ...

  4. 【学习笔记】【C语言】二维数组

    1. 什么是二维数组 一个数组能表示一个班人的年龄,如果想表示很多班呢? 什么是二维数组?int ages[3][10]; 三个班,每个班10个人 相当于3行10列 相当于装着3个一维数组 二维数组是 ...

  5. 二维数组&多维数组

    1.二维数组 二维数组由多个一维数组组成,其定义方式: ,]{ {,,,}, {,,,}, {,,,} }; 二维数组中括号中,逗号左边表示一维数组的个数,也可以说控制行,逗号后面的数表示每个一维数组 ...

  6. Java基本语法-----java数组(一维数组二维数组)

    嘿嘿!你们懂的,又是图片,委屈大家了. java数组(一维数组二维数组) [正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!下面有个"顶"字,你就 ...

  7. 数据结构 二维数组-->稀疏数组-->二维数组

    稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不 ...

  8. java数组---多维数组

    多维数组 多维数组可以看成是数组的数组 比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 public static void main(String[] args) { ...

  9. c语言中双维数组与指针的那点事儿

    说起c语言的指针,估计对c语言只是一知半解的同志们可能都会很头疼,尤其它跟数组又无耻的联系到一起的时候,就更加淫荡了!!! 怎么说呢,就是有一点规定:(或准则) 数组名可以看成是指向数组头元素的指针, ...

  10. 【嵌入式开发】C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

随机推荐

  1. Deepin15.11源码安装Nginx17.5包括stream模块和njs模块

    一:先到官网下载nginx-1.17.5.tar.gz包并且解压到当前目录,解压后目录为:nginx-1.17.5: 二:下载njs源码(它没有像stream模块一样附带在了nginx源码里),因此首 ...

  2. 嵌入式qt显示中文和隐藏鼠标

    最近项目快接近尾声了,要把项目移植到板子上,但是板子上的系统没有安装字库,导致中文无法显示,并且有一个很讨厌的鼠标光标(又没有鼠标),上网找了一些解决方案,记录一下 qt显示中文: 如果你急于在ARM ...

  3. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...

  4. Oracle 11g 总结篇2

    第一部分: 字段名的别名用""括起来,如:last_name as "姓名". 去除重复:在投影的字段名前加上 distinct 就可以了. 比如:select ...

  5. [LOJ2537] [PKUWC2018] Minimax

    题目链接 LOJ:https://loj.ac/problem/2537 洛谷:https://www.luogu.org/problemnew/show/P5298 Solution 不定期诈尸 好 ...

  6. JXOI2018

    发现自己不会T3可以退群了 排序问题(组合.模拟) 可以发现Gobo Sort相当于在所有排列中随机选择一个,所以当第\(i\)个数出现次数为\(a_i\)时,期望的Sort次数就是\(\frac{( ...

  7. Javascript实现的智能消防栓状态监测画面

    系统需要添加智能消防栓模块.集成了一家采用NbIOT通讯的智能消防栓产品.由第厂家平台对接NbIot特联网平台,我们平台提供一个api从第三方平台接收消防栓状态,用SignlaR把状态推送到前端.需要 ...

  8. Windows10如何卸载OneDrive

    Windows10如何卸载OneDrive 来源 https://zhuanlan.zhihu.com/p/23985905 1) 禁止onedrive自启动简单的就是在任务管理器的启动中禁用oned ...

  9. Mycat分布式数据库架构解决方案--schema.xml详解

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 该文件 ...

  10. 兴奋与沮丧并存spider爬取拉勾网

    兴奋的开发除了爬取拉勾网的爬虫信息,可是当调试都成功了的那一刻,我被拉钩封IP了. 下面是spider的主要内容 import reimport scrapy from bs4 import Beau ...