Go语言基础之数组与切片


目录:

Array数组

数组定义与初始化

数组定长的有序序列,元素类型相同,值类型的数据对象

package main

import "fmt"

func main() {
    // 定义数组
        var arr1 [3]int
        // 初始化数组
        arr1 = [3]int{0,0,0}
        // 定义时初始化
    arr2 := [3]int{1, 2, 3}
    fmt.Println(arr1)
    fmt.Println(arr2)
    fmt.Printf("%T,%T", arr1, arr2)
}
-------------------------------------------
[0 0 0]
[1 2 3]
[3]int,[3]int
// 初始化时,根据值的数量来确定长度
arr3 := [...]int{1, 2, 3, 4, 5}
// 根据索引初始化数组,为赋值索引为0
arr4 := [5]int{0: 1, 1: 2, 2: 4, 3: 8, 4: 16}

遍历数组

package main

import "fmt"

func main() {
    arr4 := [5]int{0: 1, 1: 2, 2: 4, 3: 8, 4: 16}
    // 索引遍历
    for i := 0; i < len(arr4); i++ {
        fmt.Println(arr4[i])
    }
    // for range 遍历
    for i, v := range arr4 {
        fmt.Println(i, v)
    }
}

多维数组

package main

import "fmt"

func main() {
    arr5 := [3][2]int{
        [2]int{1, 2},
        [2]int{3, 4},
        [2]int{5, 6},
    }
    fmt.Println(arr5)
}

遍历多维数组

package main

import "fmt"

func main() {
    arr5 := [3][2]int{
        [2]int{1, 2},
        [2]int{3, 4},
        [2]int{5, 6},
    }
    // 多维数组的遍历
    for _, v1 := range arr5 {
        // fmt.Println(i1, v1)
        for _, v2 := range v1 {
            fmt.Println(n, v2)
        }

    }
}

数组求和

package main

import "fmt"

func Sum(arr []int) int {
    sum := 0
    for _, v := range arr {
        sum += v
    }
    return sum
}

func main() {
    arr5 := [...]int{1, 3, 5, 7, 9}
    fmt.Println(Sum(arr5[:]))
}

切片

相同类型,可变长的数组,基于数组,是引用型数据指向数组。

package main

import "fmt"

func main() {
    var s1 []int
    var s2 []string
    // 未初始化时,值为nil,未开辟存储空间
    fmt.Println(s1 == nil)
    fmt.Println(s2 == nil)
    s1 = []int{1, 2, 3}
    s2 = []string{"北京", "上海", "广州", "深圳"}
    fmt.Println(s1, s2)
        // 从数组得到切片
    a1 := [...]int{1, 2, 3, 4, 5}
    s3 := a1[0:3]
    fmt.Println(s3)
    fmt.Printf("%T,%T", s3, a1)
}
-----------------------------------------------------
true
true
[1 2 3] [北京 上海 广州 深圳]
[1 2 3]
[]int,[5]int

make()函数创建切片

package main

import "fmt"

func main() {
    s1 := make([]int, 5, 10)
    fmt.Println(s1)
    // 输出长度(当前存储的数据量)
    fmt.Println(len(s1))
    // 输出容量(能够存储的数据总量)
    fmt.Println(cap(s1))
}

切片Append

package main

import "fmt"

func main() {
    // 扩容切片
    s1 := []string{"北京", "上海", "广州"}
    fmt.Println(s1)
    fmt.Println(len(s1), cap(s1))
        // 必须用原来的变量接收返回值
        //扩容时重新开辟内容空间创建数组存储数组,地址改变需要重新引用
    s1 = append(s1, "深圳")
    fmt.Println(s1)
    // 扩容容量翻倍(不同版本策略不同)
    fmt.Println(len(s1), cap(s1))
}
-------------------------------------
[北京 上海 广州]
3 3
[北京 上海 广州 深圳]
4 6

切片Copy

package main

import "fmt"

func main() {
    // 拷贝cppy
    s1 := []string{"北京", "上海", "广州"}
    var s2 []string = make([]string, 3)
    copy(s2, s1)
    s1[0] = "天津"
    fmt.Println(s1, s2)
}

从切片中删除元素

package main

import "fmt"

func main() {
    // 拷贝cppy
    s1 := []string{"北京", "上海", "广州"}
    s1 = append(s1[:0], s1[1:]...)
    fmt.Println(s1)
}
-----------------------
[上海 广州]

删除索引为index的元素, 操作方法是:a=append(a[:index],a[index+1])

make和new的区别

1.make和new都是用来申请内存空间的

2.new很少用,一般是给基本数据类型申请内存的,例如string、int,返回的是对应类型的指针(*int*string)。

3.make是用来给slice、map、chan申请内存的,make函数返回类型对应这三钟类型