数组
数据在 go 语言中也相当的特别, 1 就算同是 int 类型的数组,如果他们在声明的长度不一样,那么也认为他们是不同的类型;2: 数组在 go 语言中为认为是值类型。
声明
go 语言的数组场景方式比较特别
package main
import "fmt"
func main() {
// 1.声明并初始化长度为 3 的整型数组
var arr_x = [3]int{100, 200, 300}
fmt.Printf("len = %d, cap = %d, arr_x = %s \n", len(arr_x), cap(arr_x), arr_x)
// 省略长度
var arr_y = [...]int{100, 200, 300}
fmt.Printf("len = %d, cap = %d, arr_y = %s \n", len(arr_y), cap(arr_y), arr_y)
// 缺省值会被自动初始化为 0
var arr_z = [3]int{}
fmt.Printf("len = %d, cap = %d, arr_z = %s \n", len(arr_z), cap(arr_z), arr_z)
// 使用索引初始化
var arr_a = [3]int{0: 111, 1: 222, 2: 333}
fmt.Printf("len = %d, cap = %d, arr_a = %s \n", len(arr_a), cap(arr_a), arr_a)
}
go run .
len = 3, cap = 3, arr_x = [%!s(int=100) %!s(int=200) %!s(int=300)]
len = 3, cap = 3, arr_y = [%!s(int=100) %!s(int=200) %!s(int=300)]
len = 3, cap = 3, arr_z = [%!s(int=0) %!s(int=0) %!s(int=0)]
len = 3, cap = 3, arr_a = [%!s(int=111) %!s(int=222) %!s(int=333)]
数组是值类型
数组是值类型,就意味着在数据做为参数传给函数时,这个时候会全量的复制数据。
package main
import "fmt"
func PrintAddr(arr [4]uint8) {
fmt.Printf("addresss of arr: %p type = %T \n", &arr, arr)
}
func main() {
var ages = [4]uint8{1, 3, 5, 7}
fmt.Printf("addresss of ages: %p type = %T \n", &ages, ages)
PrintAddr(ages)
}
go run .
addresss of ages: 0x1400000e0a4 type = [4]uint8
addresss of arr: 0x1400000e0ac type = [4]uint8
迭代
package main
import "fmt"
func main() {
var arr_x = [3]int{100, 200, 300}
fmt.Printf("len = %d, cap = %d, arr_x = %s \n", len(arr_x), cap(arr_x), arr_x)
for index, value := range arr_x {
fmt.Printf("index = %d, value = %d \n", index, value)
}
}
切片
package main
import "fmt"
func main() {
var arr_x = [3]int{100, 200, 300}
fmt.Printf("type of arr_x = %T \n", arr_x)
fmt.Printf("len = %d, cap = %d, arr_x = %s \n", len(arr_x), cap(arr_x), arr_x)
// 切片
var arr_y = arr_x[0:2]
fmt.Printf("type of arr_y = %T \n", arr_y)
for index, value := range arr_y {
fmt.Printf("index = %d, value = %d \n", index, value)
}
}
最后
可以看到在 go 语言中对数据的限制还是比较多的,这个也就是我们平时不用它的原因,大多数情况下我们用切片这个动态数据类型来解决。