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 地址相同
完结
但行好事,莫问前程!
本文来自博客园,作者:yangphp,转载请注明原文链接:https://www.cnblogs.com/ypeih/p/17274746.html