文章目录

    • 前言
    • 一. 数组
    • 1. 数组的语法和声明
  • 2 语法
      • 1)语法:
    • 2. 数组的初始化
      • a) 先声明再赋值 (先声明在初始化)
      • b) 声明并初始化
      • c) 不限长赋值
      • d) 索引赋值
    • 3. 访问和修改数组元素
      • 1) 元素值的查询
      • 2)切片
    • 4. 数组的循环
      • 循环遍历数组
        • 方法一:条件循环
        • 方法二: range循环
    • 5. 多维数组
    • 6. 数组是值类型
    • 7. 数组内存布局
    • 总结

前言

容器数据类型是相对于前面的基本数据类型而言的,分为: 数组和切片,我们今天来看一下数组

一. 数组

1. 数组的语法和声明

我们之前学习过变量,当存储一个学生名字时可以name=“laoxin”,但是如果班级有三十人,每个人的名字都想存储到内存中怎么办呢?总不能用三十个变量分别存储吧,这时数组就可以发挥作用了。

数组其实是和字符串一样的序列类型,不同于字符串在内存中连续存储字符,数组用[]的语法将同一类型的多个值存储在一块连续内存中。

特点:

  • 固定长度,数组声明后长度便不能再修改
  • 只能存储一种特定类型元素的序列

比如以下两个是不同的:

[5]int
[10] int

2 语法

1)语法:

直接声明:

var 数组名 [元素数量]元素类型

2. 数组的初始化

a) 先声明再赋值 (先声明在初始化)

var arr [3]int //数组是一个值类型

这里用int类型声明的,所以这里必须存int类型

数组是一个值类型,也就是未赋值的时候,里面只有一个布尔值为false的值,这种我们叫零值。

就是默认值

package mainimport "fmt"func main() {var arr [3]intfmt.Println(arr)
}

执行:

可以看到默认就是三个值,三个值都为0

三种定义方法:

package mainimport "fmt"func main() {var test1 [3]int         //[0 0 0]var test2 = [3]int{1, 2} // [1 2 0]var test3 = [3]string{"北京", "上海", "深圳"} //[北京 上海 深圳]fmt.Println(test1, test2, test3)
}

注意: 数组也支持索引和切片

package mainimport "fmt"func main() {var arr [3]intfmt.Println(arr)fmt.Println(arr[0], &arr[0])fmt.Println(arr[1], &arr[1])fmt.Println(arr[2], &arr[2])
}

执行结果

可以看到三个连续的地址,每个int占8个字节,上面的是16进制,不是10进制。

所以180+8=188
188+9=190

初始化: arr[1] = “张三”

b) 声明并初始化

声明并赋值

package mainimport ("fmt"
)func main() {var names = [3]string{"beijing", "shanghai", "shandong"}fmt.Println(names)
}

执行结果

c) 不限长赋值

package mainimport "fmt"func main() {var names = [...]string{"beijing", "shanghai", "shandong"}fmt.Println(names)var age = [...]int{1, 2, 3}fmt.Println(age)
}

有数字和…的是数组,没有数字的是切片
执行结果:

d) 索引赋值

指定索引值的方式来初始化数组

package mainimport ("fmt"
)func main() {var names = [3]string{1: "laoxin", 2: "zhangsan"}//三个键值对,但这里只输入了2个,那第三个默认是什么呢?fmt.Println(names, len(names)) //此时的len可以判断有多少个元素}

3. 访问和修改数组元素

1) 元素值的查询

package mainimport "fmt"func main() {var names = [...]string{"laoxin", "wangqiang", "zhangsan"}//索引元素的取出:fmt.Println(names[1])fmt.Println(names[2])
}

2)切片

【开始索引:结束索引】

package mainimport "fmt"func main() {var names = [...]string{"laoxin", "wangqiang", "zhangsan"}//切片(重点)fmt.Println(names[1:2])fmt.Println(names[:3])
}

4. 数组的循环

循环遍历数组

方法一:条件循环

package mainimport "fmt"func main() {var names = [...]string{"laoxin", "wangqiang", "zhangsan", "lisi"}for i := 0; i < len(names); i++ {fmt.Println(names[i])}
}

方法二: range循环

package mainimport "fmt"func main() {var names = [...]string{"laoxin", "wangqiang", "zhangsan", "lisi"}for i := range names {fmt.Println(i)}
}

这样可以取到索引

package mainimport "fmt"func main() {var names = [...]string{"laoxin", "wangqiang", "zhangsan", "lisi"}for i := range names {fmt.Println(i)fmt.Println(names[i])}
}

更好的方法,建议使用

package mainimport "fmt"func main() {var names = [...]string{"laoxin", "wangqiang", "zhangsan", "lisi"}for i, v := range names {fmt.Println(i, v)}
}

5. 多维数组

这里以二维为例子

package mainimport "fmt"func main() {a := [3][2]string{{"北京", "上海"},{"广州", "深圳"},{"成都", "重庆"},}fmt.Println(a) //[[北京 上海] [广州 深圳] [成都 重庆]]fmt.Println(a[2][1]) //重庆
}

二维数组的遍历(难点)

package mainimport "fmt"func main() {a := [3][2]string{{"北京", "上海"},{"广州", "深圳"},{"成都", "重庆"},}fmt.Println(a) //[[北京 上海] [广州 深圳] [成都 重庆]]fmt.Println(a[2][1]) //重庆for i1, v1 := range a {for i2, v2 := range v1 {fmt.Println(i1, v1, v2, i2)}}}


先遍历第一组{“北京”, “上海”},,然后遍历第一组的第一个 北京

i2 只有两个值 0,1, 因为i2遍历的是[北京,上海],i1 三个值,分别是

6. 数组是值类型

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

package mainimport "fmt"func main() {s1 := [2]int{1, 2}s2 := s1 //把s1拷贝一份给到s2s2[1] = 10fmt.Println(s1, &s1[1]) //[1,2]  0xc000106038fmt.Println(s2, &s2[1]) //[1,10] 0xc000106048}

7. 数组内存布局

var a [5] int
赋值: a[1] = 10

package mainimport "fmt"func main() {var intArr [3]int//初始值为【0,0,0】/*内存会为变量 intArr 开辟一块空间,目前默认是 [0,0,0] ,地址可以通过数组名获取 &intArr,也是第一个元素的地址*/fmt.Println(intArr, &intArr[0], &intArr, &intArr[1])/*&intArr[0] 0xc00000c180&intArr[1]  0xc00000c188int 类型占8个字节  ,所以第三个元素就是在第二个基础上加8, 当然这里是16进制的*/
}

这个地方需要注意一点:
虽然我们说intArr的内存地址为&intArr,但如果我们用println 打印的话,是不会出来结果的,需要用

fmt.Printf(“intArr的内存地址为:%p”, &intArr)

因为默认情况下println默认使用 %v 进行格式化输出的

总结

1) 数组的地址可以通过数组名字来获取
2) 数组的第一个元素的地址,就是数组的首地址
3) 数组的各个元素的地址间隔是依据数组的类型决定的。
4)数组本身没有地址,数值作为值类型存在,指针位置默认指向数组第一位。
5) 数据是多个相同的类型的组合,一个数组一旦定义了,他的长度是固定的,不能动态变化,能动态变化的叫切片,我们后面会学切片
6)数组中的元素可以是任何类型,包括值类型和引用类型,但不能混用
7) 数组创建后,如果没有复制,有默认值
数字类型的数组: 默认为0
字符串类型的数组: 默认为“”
bool数组,默认为false

go语言基础语法-容器数据类型-数组相关推荐

  1. 一篇文章带你玩转C语言基础语法。2:数据类型。千字总结

    我的个人主页:☆光之梦☆的博客_CSDN博客-C语言基础语法(超详细)领域博主 欢迎各位

  2. Python基础语法和数据类型最全总结

    本文分享自华为云社区<Python最全基础语法和数据类型总结>,原文作者:北山啦 . 人生苦短,我用Python.总结了Python最全基础语法和数据类型总结,一文带你学会Python. ...

  3. Go语言 基础语法学习 (未完待更......

    文章目录 一 Go语言结构 1 Go Hello world实例 2 执行Go程序 二 Go语言基础语法 1 Go标记 2 行分隔符 3 注释 4 标识符 5 一些关键字 6 Go语言的空格 7 格式 ...

  4. GO 语言基础语法一 (快速入门 Go 语言)

    Go语言基础语法 一. golang 标识符,关键字,命名规则 二. golang 变量 三. golang 常量 四. golang 数据类型 五. golang 布尔类型 六. golang 数字 ...

  5. 【Day4 C语言基础语法学习-3】

    Day4 C语言基础语法学习-3 一 数组 1.1 数组的概念 1.2 一维数组 1.2.1 一维数组的定义 1.2.2 一维数组的性质 1.3 一维数组的初始化和遍历 1.4 冒泡排序法 二.二维数 ...

  6. 【Day3 C语言基础语法学习-2】

    Day3 C语言基础语法学习-2 一.输入输出函数 1.1 getchar()/putcgar() 1.1.1getchar() 1.1.2 putchar 1.2 gets()/puts() 1.2 ...

  7. Go语言基础语法讲解与学习

    Go语言基础语法讲解与学习 1 Go语言基础知识介绍 ​ 介绍Go语言之前,我们先了解一下有哪些开源项目是Go语言开发的,其中就包括 Docker.Go-Ethereum.Thrraform 和 Ku ...

  8. C语言基础语法【1】

    目录 1.在linux系统编写C语言,基本命令:变量.常量.标识符 2.数据类型.取值范围.字符串 3.短路原则.类型转换 4.switch语句.for.while循环.死循环 1.在linux系统编 ...

  9. 【Go编程语言】 Go语言基础语法

    Go语言基础语法 文章目录 Go语言基础语法 一.注释 1.单行注释 2.多行注释 二.变量 1.变量的定义 2.变量的初始化 3.理解变量(内存地址) 4.变量交换 5.匿名变量 6.变量的作用域 ...

最新文章

  1. OC学习笔记之Foundation框架NSNumber、NSValue和NSDate(转)
  2. 麒麟芯片AI首席科学家,解读AI芯片如何让手机更智能
  3. php 变量的8类类型
  4. 李宏毅线性代数笔记2: 线性方程组和数域
  5. mysql语句的执行顺序_SQL语句完整的执行顺序(02)
  6. php数组取字段值,php如何获取二维数组指定的某个字段的值
  7. 11、OAuth和OpenID服务
  8. python 元组遍历_Python中的for循环:元组、列表、字典的遍历和相互转化
  9. React使用antd Table生成层级多选组件
  10. Android基础——数据存储
  11. 关于go访问rabbitmq的连接池
  12. MIUI V5的私密短信功能
  13. Python基本操作(二)注释、分隔
  14. 十年生死轮回,看国产手机发展四个阶段
  15. Python中判断两个字符串的内容是否相同
  16. VS2017 15.4提供预览版,面向Windows 10秋季更新(FCU)
  17. C#正则提取字符串中的数字
  18. 数学建模——线性规划篇
  19. wp下载吧主题模板_内含newzhan2.60无授权版本
  20. recycle view drag and swip demo

热门文章

  1. 美国要建太空军?人类离星际争霸还有多远
  2. 2022-5-25 Leetcode 1005.K次取反后最大化的数组和
  3. 【排版】用Overleaf速成LaTeX代码(从入门到开门)
  4. 剑指offer系列-24.反转链表
  5. 2021-09-24meituan-012小美的书架
  6. Linux C编程问题:symbol lookup error: xxx undefined symbol xxx
  7. nologging何时能减少redo
  8. Error: 17172, Severity: 16 SNIInitialize() failed with error 0x2.
  9. 分布时滞matlab,Matlab仿真含时滞多智体一致性分析,附代码
  10. 聚类和判别分析小论文