Go语言学习 _基础03 _数组和切片

Go语言学习 _基础03 _数组和切片

1、数组
package array_test

import "testing"

func TestArrayInit(t *testing.T){
    var arr [3]int // 声明方式 1
    arr1 := [4]int{1,2,3,4} // 声明方式 2
    arr2 :=[...]int{1,2,3,4,5} // 声明方式 3 省去对于空间大小的声明 通过初始化来确定 空间大小 
    arr1[1] = 5
    t.Log(arr[1],arr[2])
    t.Log(arr1,arr2)
}

func TestArrayTravel(t *testing.T){
    arr3 := [...]int{1,2,3,5}
    for i := 0; i < len(arr3); i++{ // 传统遍历
        t.Log(arr3[i])
    }
    for idx,e :=range arr3{
        t.Log(idx,e) // idx —— 索引值
    }

    for _,e :=range arr3{ // TODO Go语言有严格的 编程约束,
        // TODO 如果 不关心 index 可以使用 下划线 来表示忽略此返回值,但不能没有这个 返回参数的 占位符
        t.Log(e) // idx —— 索引值
    }
}

// 数组的截取(切片) —— 切头去尾、不可使用负数
func TestArraySection(t *testing.T){
    arr3 :=[...]int{1,2,3,4}
    arr3_sec := arr3[:] // 全部取
    for idx,e :=range arr3_sec{
        t.Log(idx,e) // idx —— 索引值
    }
    arr3_sec = arr3[0:2]
    for idx,e :=range arr3_sec{
        t.Log(idx,e) // idx —— 索引值
    }

}
2、切片
package slice_test

import (
    "fmt"
    "testing"
)

func TestSliceInit(t *testing.T) {
    var s0 []int
    t.Log(len(s0), cap(s0))
    s0 = append(s0, 1)
    t.Log(len(s0), cap(s0))

    s1 := []int{1, 2, 3, 4}
    t.Log(len(s1), cap(s1))

    s2 := make([]int, 3, 5)
    t.Log(len(s2), cap(s2))
    //t.Log(s2[0],s2[1],s2[2],s2[3],s2[4]) panic: runtime error: index out of range [3] with length 3 [recovered]
    // panic: runtime error: index out of range [3] with length 3
    t.Log(s2[0], s2[1], s2[2])
    // TODO 切片的结构,本质上切片是一个结构体 由 指针 长度(len) 容量(cap) 三个要素组成
    // TODO 只有 在 len 范围内 才是可访问的 元素
    s2 = append(s2, 1)
    t.Log(len(s2), cap(s2))
    t.Log(s2[0], s2[1], s2[2], s2[3])
    // TODO cap 为切片的 扩充 提供了 空间

}

func TestSliceGrowing(t *testing.T) {
    s := []int{}
    for i := 0; i < 10; i++ {
        s = append(s, i)
        t.Log(len(s), cap(s))
        t.Log(s)
        fmt.Println()
    }
    // TODO 观察输出 可以看到 每次 存入新元素前 如果会是的 cap < len 那么 cap就会 变成 cap*2
    // TODO 来满足增长需求,这也是 为什么 append() 操作之后要把新切片返回给原切片 因为 操作可能带来 空间位置的改变
}

func TestSliceShareMeory(t *testing.T) {
    year := []string{"Jan", "Feb", "Mar", "Arp", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
    Q2 := year[3:6]
    t.Log(Q2, len(Q2), cap(Q2)) // len = 3 ,cap =9 ( cap 会一直 延伸到 这个数组结束的 位置)
    summer := year[5:8]
    t.Log(summer, len(summer), cap(summer))
    summer[0] = "Unknow"
    t.Log(Q2)
    t.Log(year)

    // TODO 从输出 可以观察到 切片共享 内存的 特性
    // TODO 如果 源自同一数组的 两个 切片 其一改变 另一个 可能会被影响
}

func TestSliceComparing(t *testing.T) {
    //a := []int{1, 2, 3, 4}
    //b := []int{1, 2, 3, 4}
    //if a == b { // 不能进行比较
    //    t.Log("equal")
    //}
    // invalid operation: a == b (slice can only be compared to nil)
}
原文地址:https://www.cnblogs.com/OwlInTheOaktree/p/15208508.html