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. 如何使用websocket实现前后端通信

    websocket通信是很好玩的,也很有用的的通信方式,使用方式如下: 第一步由于springboot很好地集成了websocket,所以先在在pom.xml文件中引入依赖 <dependenc ...

  2. 跨域和CORS

    一 跨域 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...

  3. 34 多线程(六)——线程安全 synchronized

    关键字synchronized可以写在方法和代码块中 写在普通方法中:锁住的对象是this,即类的实例.也就是说锁住的是类下面的类变量(成员变量),而不是方法中的变量. 写在静态方法中:锁住的对象时c ...

  4. Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  5. xorm -Find方法实例

    查询多条数据使用Find方法,Find方法的第一个参数为slice的指针或Map指针,即为查询后返回的结果,第二个参数可选,为查询的条件struct的指针. package main import ( ...

  6. 如何配置php session使用redis集群

    本实例基于phpredis 2.2.8,支持集群处理,php5.3及以上. 1.页面修改: ini_set('session.save_handler', 'rediscluster'); ini_s ...

  7. 方法2:使用Jenkins构建Docker镜像 --SpringCloud

    前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 ...

  8. Java JDK1.8源码学习之路 1 Object

    写在最前 对于一个合格的后端程序员来说,现行的流行框架早已经能胜任基本的企业开发,Springboot 任何的框架都把重复的工作更佳简单/优化的解决掉,但是完全陷入在这样的温水里面, 好比温水煮青蛙, ...

  9. Layui + thymeleaf org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: " 错误解决

    解决方法: 1.将layui的代码移动到新的js文件当中,用template模板引擎的方式引入: <script th:src="@{/static/js/facility/mover ...

  10. Spring Aop中execution的语法

    参考地址:https://blog.csdn.net/zz210891470/article/details/54175107 execution(* com.sample.service.impl. ...