网站程序结构,网站不收录是什么原因,docker wordpress,好网站建设公司报价作者#xff1a;秃秃爱健身#xff0c;多平台博客专家#xff0c;某大厂后端开发#xff0c;个人IP起于源码分析文章 #x1f60b;。 源码系列专栏#xff1a;Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列#xff08;含#xff1a;Ribbon、Feign秃秃爱健身多平台博客专家某大厂后端开发个人IP起于源码分析文章 。 源码系列专栏Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列含Ribbon、Feign、Nacos源码系列、RocketMQ源码系列、Spring Cloud Gateway使用到源码分析系列、分布式事务Seata使用到源码分析系列、JUC源码系列 基础系列专栏30天熟悉GO语言建设中 码文不易如果感觉博主的文章还不错请点赞、收藏 ⭐️支持一下博主哇 联系方式Saint9768加我进技术交流群一起学习进步、freedom✈️ 文章目录 一、前言二、数组1、数组定义2、数组初始化1使用数组字面量初始化数组2GO自动计算数组的长度3指定特定元素的值 3、数组内存分析4、数组使用1访问数组元素2同类型数组赋值3将数组按引用传递 5、数组遍历 三、二维数组1、定义赋值2、初始化 四、总结 一、前言 Go系列文章 GO开篇手握Java走进Golang的世界2 Go开发环境搭建、Hello World程序运行3 Go编程规约和API包4 Go的变量、常量、运算符5 Go 基本数据类型6 Go 复杂数据类型之指针7 Go流程控制之分支结构if、switch8 Go流程控制之循环结构for range、goto、break、continueGo函数全方位解析Go异常处理机制 Go专栏传送链接https://blog.csdn.net/saintmm/category_12326997.html
二、数组
在GO语言中数组是一个长度固定的数据类型用于存储相同类型的数据
1、数组定义
数组声明时需要指定内部存储的数据的类型需要存储的元素的数量。数组声明完成之后每个数组元素的默认值都是对应类型的零值。
数组定义格式var arrayName [数组大小]数据类型
例如声明一个包含3个元素的整型数组。
var array 3[int]2、数组初始化
数组的初始化有三种方式使用数组字面量、自动计算数组长度、指定特定索引位置元素的值。
1使用数组字面量初始化数组
初始化一个包含3个元素的整型数组
var arr1 [3]int [3]int{3,6,9}
fmt.Println(arr1)或
var arr2 [3]int{1,2,3}
fmt.Println(arr2)2GO自动计算数组的长度
使用... 代替数组的长度GO会根据初始化时数组元素的数量来确定该数组的长度。
arr3数组的长度为4。
var arr3 [...]int{1,3,5,7}
fmt.Println(arr3)3指定特定元素的值
在已知数组长度的前提下可以给数组的特定索引位置指定具体的值。
下面初始化一个长度为3的数组并乱序指定索引0和索引2位置的元素值分别为39。
var arr4 [...]int{2:9, 0:3}
fmt.Println(arr4)3、数组内存分析
数组开辟的内存空间是一块连续的内存空间其访问/修改效率很高。
示例
package mainimport fmtfunc main() {// 定义数组var arr [3]int32// 打印数组fmt.Println(arr)// arr的内存地址值fmt.Printf(arr的地址为%p, arr)fmt.Println()// arr[0]内存地址值fmt.Printf(arr[0]的地址为%p, arr[0])fmt.Println()// arr[1]内存地址值fmt.Printf(arr[1]的地址为%p, arr[1])fmt.Println()// arr[2]内存地址值fmt.Printf(arr[2]的地址为%p, arr[2])
}输出
内存使用解析
示例中 int32类型的数组arr内存地址为0xc00001a0c0则arr[n]的内存地址为 0xc00001a0c0 4*n 4、数组使用
1访问数组元素
要访问数组里的某个元素使用[]运算符。
package mainimport fmtfunc main() {arr1 : [3]int{1,2,3}fmt.Println(arr1[0]的值为, arr1[0])
}输出
2同类型数组赋值
可以把同样类型的一个数组赋值给另外一个数组。
// 声明一个包含3个元素的整型数组
var arr [3]int32arr1 : [3]int32{1,2,3}// 把arr1的值赋值给arr
arr arr1注意数组长度属于类型的一部分即数组变量的类型包括两步分数组长度和每个元素的类型只有这两部分都相同的数组才是类型相同的数组才能互相赋值。
package mainimport fmtfunc main() {arr1 : [3]int{1,2,3}fmt.Printf(arr1数组的类型为%T\n, arr1)arr2 : [6]int{1,2,3,4,5,6}fmt.Printf(arr2数组的类型为%T\n, arr2)
}从输出来看arr1和arr2的类型分别为[3]int、[6]int。
此外编译器会阻止类型不同的数组互相赋值。
3将数组按引用传递
在go中数据属于值类型默认情况下按值传递将数组作为参数在函数之间传递时会进行值拷贝
package mainimport fmtfunc main() {arr1 : [3]int{1,2,3}// 数组默认按值传递函数不会改变arr1的元素值changeArrayValue(arr1)fmt.Println(arr1数组为, arr1)
}
func changeArrayValue(arr [3]int) {arr[0] 7
}输出
从输出内容可以得知函数间默认传递数据的方式是按值传递在子函数changeArrayValue中修改数组不会影响父函数main中数组的值。
根据内存和性能来看在函数见传递数组是一个开销很大的操作。因此我们可以选择使用指针在函数间传递数组。
package mainimport fmtfunc main() {arr1 : [3]int{1,2,3}// 使用指针的方式做引用传递函数会改变arr1的元素值changeArrayValueByPointer(arr1)fmt.Println(arr1数组为, arr1)
}func changeArrayValueByPointer(arr *[3]int) {arr[0] 7
}输出 将数组以指针的方式传递时数组都指向同一组数据子函数中修改数组的元素值父函数中可以感知到。
5、数组遍历
两种遍历方式普通for循环、for range。
示例
package mainimport fmtfunc main() {// 定义数组var scores [4]intscores[0] 99scores[1] 97scores[2] 89scores[3] 91// 遍历数组// 方法一普通for循环for i :0; i len(scores); i {fmt.Println(scores[i])}fmt.Println()// 方法二for rangefor key,value : range scores {fmt.Printf(第%d个学生的成绩的为%d\n, key, value)}
}输出 三、二维数组
二维数组、乃至多维数组本质上只是一维数组中的元素值变成了数组故多维数组的特性和一维数组保持一致。二维数组的遍历也是两种方式普通for循环、for range。
此处我们介绍一下二维数组的声明、初始化。
1、定义赋值
package mainimport fmtfunc main() {// 定义数组var arr [2][3]int32fmt.Println(arr)fmt.Printf(arr的地址为%p\n, arr)fmt.Printf(arr[0]的地址为%p\n, arr[0])fmt.Printf(arr[0][0]的地址为%p\n, arr[0][0])fmt.Printf(arr[1]的地址为%p\n, arr[1])fmt.Printf(arr[1][0]的地址为%p\n, arr[1][0])// 赋值arr[0][1] 12
}2、初始化
初始化方式和一维数组一样
// 使用数组字面量初始化数组
var arr1 [2][3]int32 [2][3]int32{{1,2,3},{4,5,6}}
fmt.Println(arr1)四、总结
本文内容从数组的定义、初始化 到 数组使用 以及 数组的内存分析。
数组的初始化方式有三种数组字面量、不定长数组、指定特定元素值数组的同类型是指两个数组长度相等、元素值类型相等。
另外数组默认是按值传递可以使用传递数组指针的方式实现按引用传递。