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
posted @ 2023-01-09 23:01  半截肥皂  阅读(72)  评论(0编辑  收藏  举报