zoukankan      html  css  js  c++  java
  • 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)
    }
    
  • 相关阅读:
    二进制回复操作
    日志和备份介绍
    mraiadb查
    mraiadb增三删改
    mardb基本操作
    redis搭建主从和多主
    ldd 查看符号找不到
    一个声明指定了多个类型
    word中为选定文本加边框和底纹
    ue配置lua语法高亮
  • 原文地址:https://www.cnblogs.com/OwlInTheOaktree/p/15208508.html
Copyright © 2011-2022 走看看