golang 数组(array)
1. 概念
golang中的数组是具有固定长度及相同数据类型的序列集合
2. 初始化数组
var 数组名 [数组大小]数据类型
package main
import "fmt"
func main() {
//第一种
var arr1 [3]int = [3]int{1, 2, 3}//指定数组长度为3,指定3个值初始化
//var arr1 = [3]int{1, 2, 3} //可以省略[3]int
fmt.Printf("arr1的类型为%T\n", arr1)
fmt.Println("arr1的值为:", arr1)
//第二种
var arr2 = [...]int{1, 2, 3, 4, 5} //数组长度位置为“...”,则表示数组的长度是根据初始值的长度确定的
fmt.Printf("arr2的类型为%T\n", arr2)
fmt.Println("arr2的值为:", arr2)
//第三种
var arr3 = [...]int{0: 1, 3: 4, 5: 6} //对下标0赋值1,对下标3赋值4,对下标5赋值6
fmt.Printf("arr3的类型为%T\n", arr3)
fmt.Println("arr3的值为:", arr3)
//第四种
var arr4 [4]string //定义一个长度为4的空数组
arr4[0] = "1.23" //按照下标赋值
arr4[3] = "4.46" //没有赋值的下标对应数组指定数据类型的默认值
fmt.Printf("arr4的类型为%T\n", arr4)
fmt.Println("arr4的值为:", arr4)
}
输出结果
arr1的类型为[3]int
arr1的值为: [1 2 3]
arr2的类型为[5]int
arr2的值为: [1 2 3 4 5]
arr3的类型为[6]int
arr3的值为: [1 0 0 4 0 6]
arr4的类型为[4]string
arr4的值为: [1.23 4.46]
3. 数组内存分析
数组下标的内存下标地址的计算为: 0x+数组内存地址+数组的下边*数组数据类型占用的字节数
package main
import "fmt"
func main() {
var arr1 [3]int32
//%p表示为十六进制,并加上前导的0x
fmt.Printf("arr1数组的内存地址为:%p\n", &arr1) //0xc00009e070
fmt.Printf("arr1[0]数组的内存地址为:%p\n", &arr1[0]) //0xc00009e070 = 0x+c00009e070+0*4
fmt.Printf("arr1[1]数组的内存地址为:%p\n", &arr1[1]) //0xc00009e074 = 0x+c00009e070+1*4
fmt.Printf("arr1[2]数组的内存地址为:%p\n", &arr1[2]) //0xc00009e078 = 0x+c00009e070+2*4
}
输出结果
arr1数组的内存地址为:0xc00009e070
arr1[0]数组的内存地址为:0xc00009e070
arr1[1]数组的内存地址为:0xc00009e074
arr1[2]数组的内存地址为:0xc00009e078
4. 遍历数组
4.1 for循环遍历
package main
import "fmt"
func main() {
var arr4 = [5]int{10, 20, 30, 40, 50} //定义数组arr4长度为5,初始化值为10,20,30,40,50
for i := 0; i < len(arr4); i++ { //i为arr4的数组下标,从0开始,到len(arr4)=5结束,每次加1
fmt.Printf("arr4[%d]的值为:%v\n", i, arr4[i])
}
}
输出结果
arr4[0]的值为:10
arr4[1]的值为:20
arr4[2]的值为:30
arr4[3]的值为:40
arr4[4]的值为:50
4.2 for range遍历
package main
import "fmt"
// for range遍历
func main() {
var arr5 = [5]string{"a", "b", "c", "d", "e"}
for key, val := range arr5 { //key为数组的下标,val为下标对应的值
fmt.Printf("arr4[%d]的值为:%v\n", key, val)
}
}
输出结果
arr4[0]的值为:a
arr4[1]的值为:b
arr4[2]的值为:c
arr4[3]的值为:d
arr4[4]的值为:e
5. 数组注意点
5.1 数组定义的长度属于数据类型的一部分
如长度为3的int类型数组:[3]int和长度为6的int类型数组:[6]int的类型是不一样的
package main
import "fmt"
func main() {
var arr1 [3]int
var arr2 [6]int
fmt.Printf("数组arr1的类型为:%T\n", arr1)
fmt.Printf("数组arr1的类型为:%T", arr2)
}
输出结果
数组arr1的类型为:[3]int
数组arr1的类型为:[6]int
5.2 数组是值类型而不是引用类型。这意味着当数组变量被赋值时,将会获得原数组的拷贝。新数组中元素的改变不会影响原数组中元素的值。
package main
import "fmt"
func test(arr1 [3]int) { //定义test函数,指定传入参数为[3]int数组
arr1[0] = 10 //修改传入数组的下标为0的值为10
fmt.Printf("test函数中的arr1数组的值为:%v", arr1)
}
func main() {
var arr2 = [3]int{1, 2, 3}
test(arr2)
fmt.Println() //换行
fmt.Printf("main函数中的arr2数组的值为:%v", arr2)
}
输出结果
test函数中的arr1数组的值为:[10 2 3]
main函数中的arr2数组的值为:[1 2 3]
5.3 其它函数中,去修改原来的数组,可以使用指针方式。
package main
import "fmt"
func test1(arr *[3]int) { //定义test函数,指定传入参数为[3]int内存地址
arr[0] = 10 //修改内存地址下标为0的值为10
}
func main() {
var arr3 = [3]int{1, 2, 3}
test1(&arr3) //将数组的内存地址传进去
fmt.Printf("main函数中的arr3数组的值为:%v", arr3)
}
输出结果
main函数中的arr3数组的值为:[10 2 3]
6. 二维数组
6.1 二维数组赋值
var 数组名 [一维数组大小][二维数组大小]数据类型
package main
import "fmt"
func main() {
//第一种
var arr1 [2][4]int = [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} //一维数组长度为2,传入两个数组,二维数组长度为4,传入的数值个数为4
//var arr1 = [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}} //省略[2][4]int
fmt.Printf("二维数组arr1的值为:%v\n", arr1)
fmt.Printf("二维数组arr1的值为:%T\n", arr1)
//第二种
var arr2 = [...][2]int{{0, 1}, {2, 3}, {4, 5}} //按传入的二维数组个数指定一位数组的长度,二维数组的长度为2
fmt.Printf("二维数组arr2的值为:%v\n", arr2)
fmt.Printf("二维数组arr2的类型为:%T\n", arr2)
//第三种
var arr3 = [...][3]int{0: {1, 2, 3}, 4: {7, 8, 9}} //按照下标给二维数组赋值,没赋值的按照数组类型的默认值
fmt.Printf("二维数组arr3的值为:%v\n", arr3)
fmt.Printf("二维数组arr3的类型为:%T\n", arr3)
//第四种
var arr4 [4][2]int
fmt.Printf("赋值前二维数组arr4的值为:%v\n", arr4)
arr4[1][1] = 10
arr4[2][0] = 111
arr4[0][1] = 50
arr4[0][0] = 40
fmt.Printf("赋值后二维数组arr4的值为:%v\n", arr4)
fmt.Printf("二维数组arr4的类型为:%T\n", arr4)
}
输出结果
二维数组arr1的值为:[[1 2 3 4] [5 6 7 8]]
二维数组arr1的值为:[2][4]int
二维数组arr2的值为:[[0 1] [2 3] [4 5]]
二维数组arr2的类型为:[3][2]int
二维数组arr3的值为:[[1 2 3] [0 0 0] [0 0 0] [0 0 0] [7 8 9]]
二维数组arr3的类型为:[5][3]int
赋值前二维数组arr4的值为:[[0 0] [0 0] [0 0] [0 0]]
赋值后二维数组arr4的值为:[[40 50] [0 10] [111 0] [0 0]]
二维数组arr4的类型为:[4][2]int
6.2 二维数组内存
package main
import "fmt"
func main() {
var arr1 = [2][2]int32{{0, 1}, {2, 3}}
fmt.Println(arr1)
fmt.Printf("arr1的内存地址为:%p\n", &arr1) //0xc00001c0d0
fmt.Printf("arr1[0]的内存地址为:%p\n", &arr1[0]) //0xc00001c0d0
fmt.Printf("arr1[0][0]的内存地址为:%p\n", &arr1[0][0]) //0xc00001c0d0
fmt.Printf("arr1[0][1]的内存地址为:%p\n", &arr1[0][1]) //0xc00001c0d4(int32为4个字节,所以最后一位为二维数组第二个下标*字节=1*4=4)
fmt.Printf("arr1[1]的内存地址为:%p\n", &arr1[1]) //0xc00001c0d8(在上一个内存地址最后一位加上占用的4字节)
fmt.Printf("arr1[1][0]的内存地址为:%p\n", &arr1[1][0]) //0xc00001c0d8
fmt.Printf("arr1[1][0]的内存地址为:%p\n", &arr1[1][1]) //0xc00001c0dc(在上一个内存地址最后一位加上占用的4字节)
}
输出结果
[[0 1] [2 3]]
arr1的内存地址为:0xc00001c0d0
arr1[0]的内存地址为:0xc00001c0d0
arr1[0][0]的内存地址为:0xc00001c0d0
arr1[0][1]的内存地址为:0xc00001c0d4
arr1[1]的内存地址为:0xc00001c0d8
arr1[1][0]的内存地址为:0xc00001c0d8
arr1[1][0]的内存地址为:0xc00001c0dc
6.3 遍历二维数组
6.3.1 for循环遍历
package main
import "fmt"
func main() {
var arr1 = [2][4]int{{0, 1, 2, 3}, {4, 5, 6, 7}}
for i := 0; i < len(arr1); i++ { //len(arr1)获取的为二维数组的长度为2,循环两次
for j := 0; j < len(arr1[i]); j++ { //len(arr1[i])获取的为二维数组中的一维数组的长度为4,循环4次
fmt.Printf("arr1[%v][%v]的值为:%v\n", i, j, arr1[i][j])
}
}
}
输出结果
arr1[0][0]的值为:0
arr1[0][1]的值为:1
arr1[0][2]的值为:2
arr1[0][3]的值为:3
arr1[1][0]的值为:4
arr1[1][1]的值为:5
arr1[1][2]的值为:6
arr1[1][3]的值为:7
6.3.2 for range遍历
package main
import "fmt"
func main() {
var arr2 = [2][4]int{{0, 1, 2, 3}, {4, 5, 6, 7}}
for key1, val1 := range arr2 { //循环二维数组,key1位数组下标,为0,1,val1位二维数组中的一维数组的值{0, 1, 2, 3}, {4, 5, 6, 7}
for key2, val2 := range val1 { //循环一维数组,key2位数组的下标为0,1,2,3,val2位一维数组中的值
fmt.Printf("arr1[%v][%v]的值为:%v\n", key1, key2, val2)
}
}
}
输出结果
arr1[0][0]的值为:0
arr1[0][1]的值为:1
arr1[0][2]的值为:2
arr1[0][3]的值为:3
arr1[1][0]的值为:4
arr1[1][1]的值为:5
arr1[1][2]的值为:6
arr1[1][3]的值为:7
golang 数组(array)的更多相关文章
- Golang数组Array
数组Array 定义数组的格式:var [n], n>0 package main import ( "fmt" ) func main() { //数组的长度也是类型的一部 ...
- golang之array
golang使用array表示固定大小的数组,使用slice表示动态数组. package main import "fmt" func main() { var a = [5]i ...
- Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别
ArrayList和Vector的区别ArrayList与Vector主要从二方面来说. 一.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...
- go 数组(array)、切片(slice)、map、结构体(struct)
一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...
- javascript类型系统——数组array
× 目录 [1]创建 [2]本质 [3]稀疏[4]长度[5]遍历[6]类数组 前面的话 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javascript中的数组与 ...
- swift基本用法-数组array
数组简单用法 //------------------------------------------------------------------------------ // 1. 数组定义 / ...
- C#中数组Array、ArrayList、泛型List<T>的比较
在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...
- Javascript基础系列之(四)数据类型 (数组 array)
字符串,数值,布尔值都属于离散值(scalar),如果某个变量是离散的,那么任何时候它只有一个值. 如果想使用变量存储一组值,就需要使用数组(array). 数组是由多个名称相同的树值构成的集合,集合 ...
- AS3 - 数组Array的几个常用方法(附样例)
AS3 - 数组Array的几个常用方法(附样例) 2015-03-30 10:39发布:hangge浏览:241 Flex/Flash开发中,经常会使用到数组,下面总结了一些数组的常用方法. 1 ...
- Linux数组array基础
Linux数组array基础[${a[*]}和$a的区别] Bash中,数组变量的赋值有两种方法: (1) name = (value1 ... valuen) 此时下标从0开始 (2) name[i ...
随机推荐
- ArcGIS工具 - 按要素裁切数据库
在GIS处理数据中,经常需要分图,将整个任务区划分成若干块,由不同的人协作完成.为了节省分图裁切时间,减少人员操作失误,为源GIS专门制作了按要素裁切数据库工具,以提高数据生产效率. 需求描述 裁切单 ...
- 为什么网络I/O会被阻塞?
摘要:I/O 其实就是 input 和 output 的缩写,即输入/输出. 本文分享自华为云社区<为啥网络IO会被阻塞呢>,作者: 龙哥手记. 我们应该都知道 socket(套接字),你 ...
- 【大型软件开发】浅谈大型Qt软件开发(一)开发前的准备——在着手开发之前,我们要做些什么?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要操刀这个 ...
- NetCore模型绑定之FromBodyFromUriFromQueryFromRoute
title: .Net Core模型绑定之FromBody.FromUri.FromQuery.FromRoute categories: 后端 date: 2022-10-29 17:21:11 t ...
- 小项目中vuex使用频率不太多我们完全可以用provide inject 来代替可以让项目小不少
在一般小型项目中vuex实在是太浪费了所以我们可以用到 vue中的provide inject 代替 1.在vue3中我们先另起一个 文件创建一个全局的状态和方法的地方(如果你的全局状态特别的多记得要 ...
- 超详细手把手教你cordova开发使用指南+自定义插件,jsbridge
Cordova是什么 使用前端技术 开发跨平台web App的工具 底层原理:HTML+CSS搭建页面, JS和原生交互 交互原理:Cordova插件 环境配置 安卓开发基础环境搭建的文章可以参考一下 ...
- 上传图片文件并立即显示到页面使用 javascript实现鼠标拖动画矩形框以及实现固定区域内随意拖动
首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法其次,要了解容什么方式,画一个矩形,设计一个方法:DrawRectgle(左上角,右下角),并且要确定当调用这个方法时, ...
- Echarts自适应屏幕,无需刷新网页,可根据屏幕大小完美展现,内有详细代码注释,我可真是个小机灵~~O(∩_∩)O哈哈~
Echarts自适应屏幕,无需刷新网页,可根据屏幕大小完美展现 效果如图 随意拖拉,无惧检验 ~ ~ ~ ~ 下面上代码 里边有详细解释 <template> <div class= ...
- [Codeforces Round #794 (Div. 2)] D. Linguistics
我是什么东西艹艹艹 <我离正解只差个sort> 首先,观察字符串,可以发现:若存在形似\(AA--BB\)或\(BB--AA\)等有两个相同的字符挨在一起的情况,则我们在它们中间放一块隔板 ...
- drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用
目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...