golang数组
目录
数组特性
- 数据类型集合,一旦声明长度,无法更改,通过下标访问数组值
- 数组赋值,是复制,不会改变原始数组长度
语法
- var 数据变量名 [数组长度]T
数组内存结构
type ArrHeader struct {
Data uintptr
Len int
}
数组内存结构简单
[4]int{2,3,5,7} 数组值对应的内存结构
数组声明
var num [3]int // 长度为3的int数组
fmt.Println(num) // [0,0,0]
var str [3]string // 长度为3的string数组
fmt.Println(str) // [ ]
var num1 = [3]int{1, 2, 3} // 声明数组并且初始化
fmt.Println(num1)
var str1 = [...]string{"a", "b", "c"} // 声明数组并初始化 ...数组会自己计算长度
fmt.Println(str1)
var num2 = [...]int{1: 2, 2: 2, 8: 3} // 声明数组并初始化 索引 : 值
fmt.Println(num2) // [0 2 2 0 0 0 0 0 3]
fmt.Println(len(num2)) // 9
数组赋值
根据特性 赋值是复制,不会改变原始数组,所以大型数组赋值要考虑效率
var num3 = [...]int{1, 2}
fmt.Println(num3) // [1,2]
num3[1] = 100
fmt.Println(num3) // [1, 100]
数组指针
- 数组指针和数组操作基本类是
- 大型数组赋值推荐
var str2 = [...]string{"a", "b"}
var str3 = &str2 // str3 是指向数组的指针
fmt.Println(str3) // &[a b]
fmt.Println(str3[0]) // a
数组方法
len() 获取数组长度
var num4 = [...]int{1, 2, 3}
fmt.Println(len(num4)) // 3 获取数组长度 len
cap() 获取数组容量
var num4_1 = [...]int{1, 2, 3}
fmt.Println(cap(num4_1)) // 3 获取数组长度 cap
数组遍历
for
- for 遍历在复杂情况下 可能会出现数组下标越界
var str4 = [...]string{"a", "b"}
for i := 0; i < len(str4); i++ {
fmt.Println(str4[i])
}
for rang 推荐 最佳
var num5 = [...]int{1, 2, 3, 4, 5}
for key, value := range num5 {
fmt.Printf("key: %d value: %d \n", key, value)
}
// key: 0 value: 1
// key: 1 value: 2
// key: 2 value: 3
// key: 3 value: 4
// key: 4 value: 5
数组类型扩展
数组类型是切片和字符串等结构的基础。以上数组的很多操作都可以直接用于字符串或切片中。
1.字符串数组
var str = [...]string{"a", "b", "c"}
fmt.Println(str) // [a b c]
var str1 = [...]string{0: "a1", 1: "b1"}
fmt.Println(str1) // [a1 b1]
2.结构体数组
var line1 [2]User
fmt.Println(line1) // [{0 0} {0 0}]
var line2 = [2]User{{Id: 1, Name: "zds", Age: 19}, {Id: 2, Name: "zdc", Age: 18}}
fmt.Println(line2) // [{1 zds 19} {2 zdc 18}]
3.接口数组
var unknown1 [2]interface{}
fmt.Println(unknown1[:]...) // <nil> <nil>
var unknown2 = [...]interface{}{1, "123"}
fmt.Println(unknown2) // [1 123]
4.管道数组
var ch [2]chan int
fmt.Println(ch) // [<nil> <nil>]
var ch2 = [2]chan int{}
fmt.Println(ch2) // [<nil> <nil>]
5.图像解码器数组
var decoder1 [2]func(io.Reader) (image.Image, error)
fmt.Println(decoder1)
var decoder2 = [...]func(io.Reader) (image.Image, error){
png.Decode,
jpeg.Decode,
}
fmt.Println(decoder2)
6.空数组
// 1.长度为0的不在内存空间
// 2.用于强调某种特有类型的操作时避免分配额外的内存空间
c1 := make(chan [0]int)
go func() {
fmt.Println("c1")
c1 <- [0]int{}
}()
<-c1