首页 > 其他分享 >Go 数组详解和实战

Go 数组详解和实战

时间:2023-01-28 11:44:24浏览次数:61  
标签:初始化 int fmt 打印 Println 详解 数组 Go

数组是存放元素的容器,Go语言中数组的长度是数组类型的一部分,定义数组时必须指定存放元素的类型和容量(长度)

定义

var a1 [3]bool
var a2 [4]int

fmt.Printf("a1:%T\na2:%T\n", a1, a2)
复制代码

打印结果:

image.png

数组初始化

默认值

定义数组时不进行初始化,默认元素都是零值:bool类型的false、整型和浮点类型的0、字符串的空串" "

var a1 [3]bool 
var a2 [4]int

// 如果不初始化:默认元素都是零值(布尔值:false 整型和浮点类型:0 字符串:"")
fmt.Println(a1, a2)
复制代码

打印结果:

image.png

初始化方式1

最简单的初始化方式,在大括号中定义好和长度一致的值。

var a1 [3]bool 
a1 = [3]bool{true,false,false}
fmt.Println(a1)
复制代码

打印结果:

image.png

初始化方式2:根据初始值自动判断数组的长度

在中括号中写明长度,当定义的数值个数比长度小时,会用默认值补齐,比如:0、false、""

a8 := [10]int{0, 1, 2, 3, 4, 5, 6, 7}  //7后面会用0补齐
fmt.Println(a8)
复制代码

打印结果: [0 1 2 3 4 5 6 7 0 0]

[...]的用法

[...]设置数组长度时,会根据初始值自动判断数组的长度

aa := [...]int{0, 1, 2, 3, 4, 5, 6, 7} //[...]根据初始值自动判断数组的长度
fmt.Println(aa)
复制代码

打印结果:[0 1 2 3 4 5 6 7]

初始化方式3:根据索引初始化

指定索引对应的值,未指定索引的值会用默认值填充,比如:0、false、""

a3 := [5]int{0: 1, 4: 2} //根据索引初始化
fmt.Println(a3)
复制代码

打印结果:[1 0 0 0 2]

取值

遍历数组

fori循环遍历数组

citys := [...]string{"北京", "上海", "深圳"} //索引从0到2
// 根据索引遍历
for i := 0; i < len(citys); i++ {
   fmt.Println(citys[i])
}
复制代码

打印结果:

image.png

for range遍历

for range遍历更简单

citys := [...]string{"北京", "上海", "深圳"} //索引从0到2
for i, city := range citys {
   fmt.Printf("key值:%d 城市为:%v\n", i, city)
}
复制代码

打印结果:

image.png

多维数组

定义

我们以二维数组举例,比如我们需要定义[[1 2 3][4 5 6]]这样的二维数组,需要怎么定义呢?

示例如下:

  1. 下面代码中的第一个长度单位[2]表示二维数组的有几个元素
  2. 第二个长度单位[3]表示子集数组中有几个元素
  3. 初始化的时候:变量 = 数组类型{}
//定义多维数组
var a11 [2][3]int

//初始化多维数组
a11 = [2][3]int{
   [3]int{1, 2, 3},
   [3]int{4, 5, 6}, //注意:最后这个也要加逗号分隔
}

fmt.Println(a11)
复制代码

打印结果:

image.png

取值

多维数组的遍历

//定义多维数组
var a11 [2][3]int

//初始化多维数组
a11 = [2][3]int{
   [3]int{1, 2, 3},
   [3]int{4, 5, 6}, //注意:最后这个也要加逗号分隔
}

//双重for range遍历取值
for _, v1 := range a11 {
   fmt.Println(v1)
   for _, v2 := range v1 {
      fmt.Println(v2)
   }
}
复制代码

打印结果:

image.png

数组特点:值类型 不是引用类型

我们发现把b1赋值给b2,再修改b2的值,b1的值并没有改变。我认为这是数组和切片最大的区别,建议大家再对比学习一下切片的知识点:Go slice切片详解和实战

b1 := [3]int{1, 2, 3}
b2 := b1
b2[0] = 100
fmt.Println(b1,b2)
复制代码

打印结果:

image.png

总结:说明Go的数组是值类型,不是引用类型:b2:=b1的操作,给b2开辟了新的内存空间,而不是引用b1的内存地址。

数组实战

求数组cArray[1,3,5,7,8]所有元素之和

cArray := [...]int{1, 3, 5, 7, 8}
r := 0
for _, i2 := range cArray {
   r += i2
}
fmt.Printf("相加结果为:%v", r)
复制代码

打印结果:相加结果为:24

求出cArray数组中,和为8的下标,比如[0 3]和[1 2]

for i := 0; i < len(cArray); i++ {
   for j := 0; j < i; j++ {
      if cArray[i]+cArray[j] == 8 {
         fmt.Printf("符合的下标为:%v,%v \n", j, i)
      }
   }
}
复制代码

打印结果:

image.png

总结

以上就是Go数组的详解和实战应用,建议大家和Go的切片Slice对比学习 

标签:初始化,int,fmt,打印,Println,详解,数组,Go
From: https://www.cnblogs.com/gongxianjin/p/17070004.html

相关文章

  • 代码随想录-数组
    数组是一个非常基础的数据类型。数组是存放在连续内存空间上的相同类型数据的集合。下标从零开始,且元素从只能被覆盖不能被删除。题单704.二分查找704.二分查找题......
  • (23)go-micro微服务客户端开发(使用负载均衡)
    目录一main.go开发二客户端代码开发:三客户端测试功能1.发送注册邮件2.实现注册功能3.查询用户功能四运行项目五最后一main.go开发至此,咱们的项目服务端代码,已经开......
  • 算法入门--有序数组的平方
    给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:......
  • 2 System Calls Using Go
    Theoperatingsystemprovidesalotofwaysforapplicationstoextractinformationandperformoperations.Youwilllookatthedifferentwaystoextractsys......
  • 如何在 Go 语言开发的宿主程序中嵌入 WebAssembly
    ​​如何在Go语言开发的宿主程序中嵌入WebAssembly​​ 在WebAssembly的官方定义中,​​forastack-basedvirtualmachine​​​这句话也值得关注,因为它引领了......
  • 【双指针】LeetCode 167. 两数之和 II - 输入有序数组
    题目链接167.两数之和II-输入有序数组思路本思路来自一张图告诉你O(n)的双指针解法的本质原理(C++/Java)下图是白色部分初始的搜索空间,即A[0]+A[7]假如targ......
  • Django3 使用xadmin
    xadmin下载地址:https://github.com/vip68/xadmin_bugfix下载完之后解压,只需要把里面的xadmin文件夹和requirements.txt文件复制到项目根目录下,然后在终端执行pipinstall......
  • PHP转Go实践:xjson解析神器「开源工具集」
    前言近期会更新一系列开源项目的文章,新的一年会和大家做更多的开源项目,也欢迎大家加入进来。xutil今天分享的文章源自于开源项目jinzaigo/xutil的封装。在封装过程中......
  • PyCharm配置Django多个setting文件
    django项目设置多个setting文件时,pycharm会少了很多代码补全提示,对于我这种新手很不方便,经过一番折腾,总结了一些小经验1.PyCharm-->设置-->语言和框架-->Django-->启用Dj......
  • js对象数组去重
    一个对象数组,根据传入的属性key对应的值来去重,实现方法如下,用双数组法,只要一次循环即可,时间复杂度低//对象数组去重arr=[{a:1},{a:2},{a:1},{a:3}]functiontodo(p......