前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >今天带大家认识一下Golang中的数组类型

今天带大家认识一下Golang中的数组类型

作者头像
Mandy的名字被占用了
发布2021-11-25 14:36:41
4750
发布2021-11-25 14:36:41
举报

文章整理在GitHub,Gitee主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。

数组的含义

数组是相同类型的变量的集合。也可以理解为内存地址连续的一组变量的集合。

数据结构

数组的定义

基本格式

代码语言:javascript
复制
// 指定初始值
数组名称 := [数组长度]数组类型 {初始值1,初始值2,......,初始值n}
// 初始化一个数组
var 数组名 [数组长度]数组类型
情况分析
  1. 数组定义时长度和类型不能省略。如果长度是"...",此时数组的长度会根据初始值的元素个数而定。
  2. 数组的长度可以是一个常量表达式,但是编译阶段的数组长度值必须是一个整数类型的值,不能是其他的类型。比如编译后的值是一个字符串的0("0"),这种是错误的。
  3. 数组的小标是从0开始的。数组可以创建一个空数组,也可以创建一个分配好的值的数据。
  4. 数组的类型和数组的长度是数组中的一部分,因此如果类型相同并且数组元素也相同的数组,但是长度不一样,是不同的数组类型。
代码语言:javascript
复制
// 这两个数组不是不是同一类型的数组
var arrray1 = [10]int {1, 2}
var arrray2 = [11]int {1, 2}
// 这两组数组是同一类型的数组
var arrray1 = [10]int {1, 2}
var arrray2 = [...]int {1, 2}
  1. 当未设置初始值时,根据数组的长度和数组的类型,编译时自动设置默认值。如果设置的是"...",编译时则默认根据类型自动设置一个初始值。
默认值
  1. 当数组类型是数字类型时,初始值是0,
  2. 当数组类型是string,初始值为空,
  3. 当数组的类型是bool类型时,初始值为false

代码演示

代码语言:javascript
复制
func IndexArray() {
 // 长度和初始值都不设置,打印一个空数组,[]
 array1 := [...]int{}
 fmt.Println(array1)
 // 长度设置,初始值不设置,打印一个长度为1,初始值为0的数组,[0]
 array2 := [1]int{}
 fmt.Println(array2)
 // 长度不设置,设置初始值,打印出初始值[1 2]
 array3 := [...]int{1,2}
 fmt.Println(array3)
 // 长度和初始值都设置,打印出初始值[1 2 3 4]
 array4 := [4]int{1,2,3,4}
 fmt.Println(array4)
 // 长度设置,初始值设置的个数小于长度,未设置的初始值根据数组类型编译时自动设置默认值,打印出[1 2 0 0]
 array5 := [4]int{1,2}
 fmt.Println(array5)
 // 长度设置,指定索引设置初始值,其他未设置初始值的编译时自动设置默认值,打印出[0 0 0 0 0 1]
 array6 := [6]int{5: 1}
 fmt.Println(array6)
 // 长度和初始值设置,指定索引,打印出[2 2 2]
 array7 := [3]int{0:2,1:2,2:2}
 fmt.Println(array7)
}

多维数组

多维数组定义

代码语言:javascript
复制
var 数组名称 [数组长度][二维的长度]....[n维的长度] 数组类型
  1. 不管是多少维度的数组,数据类型必须和定义时保持一致。

代码演示

代码语言:javascript
复制
// 多维数组的定义
func MoreArray() {
 var array1 [1][2]int
 var array2 = [1][2]int{
  {1, 2},
 }
 // 正确定义
 var array3 = [3][2][3]int{
  {{1, 2, 3}, {3, 2, 1}},
 }
 // 正确定义
 var array3 = [3][2][3]int{
  {
   {1, 2, 3}, 
   {3, 2, 1}},
 }
 // 错误定义
 var array3 = [3][2][3]int{
  {
    {1, 2, 3}, 
    {3, 2, 1},
  },
 }
}
代码语言:javascript
复制
// output
[[[1 2 3] [3 2 1]] [[0 0 0] [0 0 0]] [[0 0 0] [0 0 0]]]

多维数组的常见集中情况和上面一维数组的常见集中情况一样,但是有如下不同的一个地方。多维数组的顶层必须设置长度

代码语言:javascript
复制
// 多维数组需要注意的地方
// 错误的定义方式
var array3 = [...][2][3]int{
    {{1, 2, 3}, {3, 2, 1}},
}
// 正确的定义方式(注意第二行结尾的","不能省略)
var array3 = [][2][3]int{
    {{1, 2, 3}, 
    {3, 2, 1}},
}
代码语言:javascript
复制
//output
[
   [[1 2 3] [3 2 1]]
   [[0 0 0] [0 0 0]] 
   [[0 0 0] [0 0 0]]
]

数组的常用操作

循环

  1. for方式
代码语言:javascript
复制
func LoopArray() {
 array := [4]int{1,2,3,4}
 len := len(array)
 for i := 0; i < len; i++ {
  fmt.Printf("数组array的索引%d对应的值是%d", i, array[i])
  fmt.Println()
 }
}
  1. range方式
代码语言:javascript
复制
arr := [...]int{1, 2, 3, 4}
 for index, value := range arr {
  fmt.Println(index, value)
 }

计算长度

代码语言:javascript
复制
len := len(数组名)

当数组是一个多维数组时,直接使用len(数组名),计算的是顶层的长度

赋值

代码语言:javascript
复制
数组命[下标] = 值
array := [4]int{1,2,3}
array[3] = 100

比较

如果两个数组类型相同(包括数组的长度,数组中元素的类型)的情况下,我们可以直接通过较运算符(==和!=)来判断两个数组是否相等,只有当两个数组的所有元素都是相等的时候数组才是相等的,不能比较两个类型不同的数组,否则程序将无法完成编译。

代码语言:javascript
复制
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // 编译错误:无法比较 [2]int == [3]int

数组与函数的使用

代码语言:javascript
复制
func 函数名(形参名称 [数组长度]数组类型) 函数返回值 {
    // 函数体
}

形参中,函数的长度为可写

代码语言:javascript
复制
// 数组与函数的使用
func Function(arr [] int) int {
    return len(arr)
}

Function([5]int{})

排序

冒泡排序
代码语言:javascript
复制
// 从大到小进行排序
func BubbleSort() {

 array := [...]int{2,9,3,5,1,2}
 len := len(array)
 fmt.Println(array)

 for i := 1; i < len; i++ {// 控制外层循环次数
  for j := 0; j < len-i; j++ { // 控制内部每次循环个数
   if array[j] < array[j+1] {
    tmp := array[j]
    array[j] = array[j+1]
    array[j+1] = tmp
   }
  }
 }
 fmt.Println(array)
}
插入排序
代码语言:javascript
复制
// 插入排序
func InsertSort() {
 array := [...]int{2,9,3,5,1,2}
 len := len(array)
 fmt.Println(array)
 // var j int = 0
 // for i := 1; i < len; i++ {
 //  tmp := array[i]
 //  for j = i; j > 0 && tmp < array[j - 1]; j-- {
 //   array[j] = array[j - 1]
 //  }
 //  array[j] = tmp
 // }
 for i := 1; i < len; i++ {// 控制外层循环个数
  tmp := array[i]
  for j := i-1; j >= 0; j-- {// 针对已经排序好的数组再次排序
   if tmp > array[j] {
    array[j+1] = array[j]
    array[j] = tmp
   }
  }
 }
 fmt.Println(array)
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡二条的技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数组的含义
  • 数据结构
  • 数组的定义
    • 基本格式
      • 情况分析
      • 默认值
  • 多维数组
    • 多维数组定义
      • 代码演示
      • 数组的常用操作
        • 循环
          • 计算长度
            • 赋值
              • 比较
                • 数组与函数的使用
                  • 排序
                    • 冒泡排序
                    • 插入排序
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档