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. JIRA学习

    Jira是Atlassian公司出品的一款事务管理软件.无论是“需求”,还是“BUG”,或是“任务”,都是“事务”的一种,所以Jira可以胜任非常多的角色:需求管理.缺陷跟踪.任务管理等等……因为Ji ...

  2. 如何在一个文件中写多个Vue组件(译-有删改)

    原文地址 Writing multiple Vue components in a single file 在一个文件中编写多个组件是React的模式,其中一些文件包含多个组件. 走开发过程中,有些组 ...

  3. 【LeetCode】最长公共前缀【二分】

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  4. 39 多线程(十一)——ThreadLocal

    目前阶段,我只能知其然,不能做到知其所以然,这里引用一篇其所以然的文章,为以后理解ThreadLocal做准备: https://www.cnblogs.com/ldq2016/p/9041856.h ...

  5. pandas再次学习

    numpy.scipy官方文档  pandas官方网站  matplotlib官方文档 一.数据结构 二.数据处理 1.数据获取(excel文件数据基本信息) #coding=utf-8 import ...

  6. kotlin --- 时间戳与字符串互相转换

    直接贴代码,清晰易懂.喜欢点个赞 class Timestamp { /** * Timestamp to String * @param Timestamp * @return String */ ...

  7. fastjson反序列化使用不当导致内存泄露

    分析一个线上内存告警的问题时,发现了造成内存告警的原因是使用fastjson不当导致的. 分析dump发现com.alibaba.fastjson.util.IdentityHashMap$Entry ...

  8. M-SOLUTIONS Programming Contest

    A.(n-2)*180 #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  9. 微信公众号 分享接口 签名通过 分享无效果(JSSDK自定义分享接口的策略调整)

    为规范自定义分享链接功能在网页上的使用,自2017年4月25日起,JSSDK“分享到朋友圈”及“发送给朋友”接口,自定义的分享链接,其域名或路径必须与当前页面对应的公众号JS安全域名一致,否则将调用失 ...

  10. WPF 不要给 Window 类设置变换矩阵(应用篇)

    原文:WPF 不要给 Window 类设置变换矩阵(应用篇) WPF 的 Window 类是不允许设置变换矩阵的.不过,总会有小伙伴为了能够设置一下试图绕过一些验证机制. 不要试图绕过,因为你会遇到更 ...