随心的博客

好记性不如个烂笔头,随心记录!

返回顶部

go 数组

前言:

go中数组的使用,

数组是一个由固定长度特定类型元素组成的序列,

一个数组可以由零个或多个元素组成,

存放多个同一类型的数据,是一种复杂数据类型

 

正文:

定义数组语法:

var 数组变量名 [元素数量]Type  = [元素数量]Type {}

元素数量是常量  一旦定义不能改变

 

定义方式如下:

var users [3]string = [3]string{"liudehua", "guofucheng", "liming"}

var users   = [3]string{"liudehua", "guofucheng", "liming"}  //定义并赋值  

var ids [3]int   //仅定义,不赋值

ids := [3]int{5, 8, 9}   //使用 =: 定义

ids := [...]int{1, 2, 3, 4, 5, 6, 7}  //不确定长度定义

 

数组定义示例1:只声明,不赋值。

var ids [3]int

fmt.Println(ids)    //输出 [0 0 0]  默认值为0

fmt.Printf("%T", ids) //输出[3]int

不赋值的情况下,默认值都为0

 

定义示例2:声明后再赋值:

var ids [3]int

ids[0] = 5  //赋值

ids[1] = 8  //赋值

ids[2] = 9  //赋值

fmt.Println(ids) //输出[5 8 9]

fmt.Printf("%T", ids)  //输出[3]int

 

定义示例3:使用 := 定义

  ids := [3]int{5, 8, 9}

 

定义示例4:不确定长度数组定义

ids := [...]int{1, 2, 3, 4, 5, 6, 7}  //使用...,不明确长度,编译器自动识别长度

fmt.Println(ids)

fmt.Printf("%T", ids) //输出[1 2 3 4 5 6 7]

 

定义示例4:指定索引值来声明数组   索引必须是 整型

userInfo := [...]string{1: "liudehua", 2: "465466@qq.com"}

fmt.Println(userInfo)  //输出:[ liudehua 465466@qq.com]

 

二维数组定义:

定义示例1: 普通定义方式

users := [3][2]string{

{"liudehua", "123134@qq.com"},

{"guofucheng", "231412@qq.com"},

{"zhangxueyou", "6666664465@qq.com"},

}

fmt.Println(users)

//输出 [[liudehua 123134@qq.com] [guofucheng 231412@qq.com] [zhangxueyou 6666664465@qq.com]]

 

定义示例2:多维数组只有第一层可以使用...来让编译器推导数组长度

users := [...][2]string{

{"liudehua", "123134@qq.com"},

{"guofucheng", "231412@qq.com"},

{"zhangxueyou", "6666664465@qq.com"},

{"liming", "3412111@qq.com"},

}

fmt.Println(users)

//输出[[liudehua 123134@qq.com] [guofucheng 231412@qq.com] [zhangxueyou 6666664465@qq.com] [liming 3412111@qq.com]]

 

数组的遍历

 

示例1:一维数组 for i遍历

users := [...]string{"liudehua", "liming", "guofucheng"}

for i := 0; i < len(users); i++ {

fmt.Println(users[i])

}

 

示例2:一维数组for ranage 遍历

users := [...]string{"liudehua", "liming", "guofucheng"}

for k, v := range users {

fmt.Println(k, v)  

}

 

示例3:二维数组的循环遍历

users := [...][2]string{

{"liudehua", "123134@qq.com"},

{"guofucheng", "231412@qq.com"},

{"zhangxueyou", "6666664465@qq.com"},

{"liming", "3412111@qq.com"},

}

 

for k1, v1 := range users {  //如果k1 不使用,可以使用_ 匿名变量抛弃掉

for k2, v2 := range v1 {

fmt.Println(k1, k2, v2)

}

}

 

数组赋值,传参:

数组是值类型,赋值和传参会复制整个数组。因此改变副本的值,不会改变本身的值

 

示例1:值传参,改变副本的值,本身的值不改变

users := [...]string{"liudehua", "zhangxueyou"}

newUsers := users

newUsers[0] = "yangphp"

fmt.Println(users) //输出 [liudehua zhangxueyou]

fmt.Println(newUsers) //输出 [yangphp zhangxueyou]

 

示例2:引用传参,改变副本的值,本身的值也改变了

 

users := [...]string{"liudehua", "zhangxueyou"}

newUsers := &users 

newUsers[0] = "yangphp"

fmt.Println(users)    //输出 [yangphp zhangxueyou]

fmt.Println(newUsers) //输出 &[yangphp zhangxueyou]

 

fmt.Printf("%p\n", &users[0])

//输出 0xc0000523c0  %p,输出内存地址,后面变量需要增加 &符号

fmt.Printf("%p\n", &newUsers[0]) //输出 0xc0000523c0 地址相同

 

 

完结

posted @ 2023-03-30 23:08  yangphp  阅读(25)  评论(0编辑  收藏  举报