go语言基础语法-容器数据类型-数组
文章目录
- 前言
- 一. 数组
- 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语言基础语法-容器数据类型-数组相关推荐
- 一篇文章带你玩转C语言基础语法。2:数据类型。千字总结
我的个人主页:☆光之梦☆的博客_CSDN博客-C语言基础语法(超详细)领域博主 欢迎各位
- Python基础语法和数据类型最全总结
本文分享自华为云社区<Python最全基础语法和数据类型总结>,原文作者:北山啦 . 人生苦短,我用Python.总结了Python最全基础语法和数据类型总结,一文带你学会Python. ...
- Go语言 基础语法学习 (未完待更......
文章目录 一 Go语言结构 1 Go Hello world实例 2 执行Go程序 二 Go语言基础语法 1 Go标记 2 行分隔符 3 注释 4 标识符 5 一些关键字 6 Go语言的空格 7 格式 ...
- GO 语言基础语法一 (快速入门 Go 语言)
Go语言基础语法 一. golang 标识符,关键字,命名规则 二. golang 变量 三. golang 常量 四. golang 数据类型 五. golang 布尔类型 六. golang 数字 ...
- 【Day4 C语言基础语法学习-3】
Day4 C语言基础语法学习-3 一 数组 1.1 数组的概念 1.2 一维数组 1.2.1 一维数组的定义 1.2.2 一维数组的性质 1.3 一维数组的初始化和遍历 1.4 冒泡排序法 二.二维数 ...
- 【Day3 C语言基础语法学习-2】
Day3 C语言基础语法学习-2 一.输入输出函数 1.1 getchar()/putcgar() 1.1.1getchar() 1.1.2 putchar 1.2 gets()/puts() 1.2 ...
- Go语言基础语法讲解与学习
Go语言基础语法讲解与学习 1 Go语言基础知识介绍 介绍Go语言之前,我们先了解一下有哪些开源项目是Go语言开发的,其中就包括 Docker.Go-Ethereum.Thrraform 和 Ku ...
- C语言基础语法【1】
目录 1.在linux系统编写C语言,基本命令:变量.常量.标识符 2.数据类型.取值范围.字符串 3.短路原则.类型转换 4.switch语句.for.while循环.死循环 1.在linux系统编 ...
- 【Go编程语言】 Go语言基础语法
Go语言基础语法 文章目录 Go语言基础语法 一.注释 1.单行注释 2.多行注释 二.变量 1.变量的定义 2.变量的初始化 3.理解变量(内存地址) 4.变量交换 5.匿名变量 6.变量的作用域 ...
最新文章
- OC学习笔记之Foundation框架NSNumber、NSValue和NSDate(转)
- 麒麟芯片AI首席科学家,解读AI芯片如何让手机更智能
- php 变量的8类类型
- 李宏毅线性代数笔记2: 线性方程组和数域
- mysql语句的执行顺序_SQL语句完整的执行顺序(02)
- php数组取字段值,php如何获取二维数组指定的某个字段的值
- 11、OAuth和OpenID服务
- python 元组遍历_Python中的for循环:元组、列表、字典的遍历和相互转化
- React使用antd Table生成层级多选组件
- Android基础——数据存储
- 关于go访问rabbitmq的连接池
- MIUI V5的私密短信功能
- Python基本操作(二)注释、分隔
- 十年生死轮回,看国产手机发展四个阶段
- Python中判断两个字符串的内容是否相同
- VS2017 15.4提供预览版,面向Windows 10秋季更新(FCU)
- C#正则提取字符串中的数字
- 数学建模——线性规划篇
- wp下载吧主题模板_内含newzhan2.60无授权版本
- recycle view drag and swip demo
热门文章
- 美国要建太空军?人类离星际争霸还有多远
- 2022-5-25 Leetcode 1005.K次取反后最大化的数组和
- 【排版】用Overleaf速成LaTeX代码(从入门到开门)
- 剑指offer系列-24.反转链表
- 2021-09-24meituan-012小美的书架
- Linux C编程问题:symbol lookup error: xxx undefined symbol xxx
- nologging何时能减少redo
- Error: 17172, Severity: 16 SNIInitialize() failed with error 0x2.
- 分布时滞matlab,Matlab仿真含时滞多智体一致性分析,附代码
- 聚类和判别分析小论文