Go -- 数组 + 切片

栏目: 编程工具 · 发布时间: 6年前

func TestArrayInit(t *testing.T) {
    var a [3]int // 声明并初始化为默认零值
    t.Log(a)     // [0 0 0]
    a[0] = 1
    t.Log(a) // [1 0 0]

    b := [3]int{1, 2, 3}           // 声明并初始化
    c := [2][2]int{{1, 2}, {3, 4}} // 多维数组初始化
    t.Log(a, b, c)                 // [1 0 0] [1 2 3] [[1 2] [3 4]]

    d := [...]int{1, 2, 3, 4, 5} // 使用...,不用指定初始化数组的长度
    t.Log(len(d), d[2])          // 5 3
}

遍历

func TestArrayTravel(t *testing.T) {
    a := [...]int{1, 2, 3, 4, 5}

    // 不推荐
    for i := 0; i < len(a); i++ {
    	t.Log(a[i])
    }

    // foreach
    for index, item := range a {
    	// index为索引,item为元素值
    	t.Log(index, item)
    }

    // foreach
    for _, item := range a {
    	// Go是有严格编程约束的语言,_是占位符,表示不关心这个值
    	t.Log(item)
    }
}

截取

func TestArraySection(t *testing.T) {
    // [包含,不包含]
    // 不支持负数索引
    a := [...]int{1, 2, 3, 4, 5}
    a_sec := a[:3]      // [1 2 3]
    a_sec = a[3:]       // [4 5]
    a_sec = a[2:len(a)] // [3 4 5]
    //a_sec = a[-1]       // invalid array index -1 (index must be non-negative)
    t.Log(a_sec)
}

切片

内部结构

Go -- 数组 + 切片

初始化

func TestSliceInit(t *testing.T) {
    // 与数组声明非常类似,但没有指定长度,切片是可变长的
    var s0 []int
    t.Log(len(s0), cap(s0)) // 0 0

    s0 = append(s0, 1)
    t.Log(len(s0), cap(s0)) // 1 1

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

    s2 := make([]int, 3, 5)
    t.Log(len(s2), cap(s2))    // 3 5
    t.Log(s2[0], s2[1], s2[2]) // 0 0 0
    //t.Log(s2[0], s2[1], s2[2], s2[3]) // panic: runtime error: index out of range
    s2 = append(s2, 1)
    t.Log(s2[0], s2[1], s2[2], s2[3]) // 0 0 0 1
    t.Log(len(s2), cap(s2))           // 4 5
}

增长

func TestSliceGrowing(t *testing.T) {
    s := []int{}
    for i := 0; i < 10; i++ {
    	s = append(s, i)
    	t.Log(len(s), cap(s))
    	// 1 1
    	// 2 2
    	// 3 4
    	// 4 4
    	// 5 8
    	// 6 8
    	// 7 8
    	// 8 8
    	// 9 16
    	// 10 16
    }
}

共享存储结构

Go -- 数组 + 切片
func TestSliceShareMemory(t *testing.T) {
    months := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}

    Q2 := months[3:6]
    t.Log(Q2, len(Q2), cap(Q2)) // [Apr May Jun] 3 9

    summer := months[5:8]
    t.Log(len(summer), cap(summer)) // 3 7
    summer[0] = "unknown"
    t.Log(Q2)     // [Apr May unknown]
    t.Log(months) // [Jan Feb Mar Apr May unknown Jul Aug Sep Oct Nov Dec]
}

对比

  1. 容量是否 可伸缩 ,切片是可伸缩的
  2. 是否可以进行 比较 ,数组可以用==比较
func TestSliceComparing(t *testing.T) {
    s1 := []int{1, 2, 3, 4}
    s2 := []int{1, 2, 3, 4}
    t.Log(s1 == s2) // invalid operation: s1 == s2 (slice can only be compared to nil)
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

失控的真相

失控的真相

[美] 迈克尔·帕特里克·林奇 / 赵亚男 / 中信出版社 / 2017-6 / 42.00元

编辑推荐 在信息泛滥的时代,知识变得无处不在。鼠标轻轻一点,我们就坐拥一座巨型图书馆。然而,我们并没有因此就离真相更近。相反,互联网的普及使人们早已习惯于凡事问搜索引擎,并形成了一种“搜索即相信”的认知模式。当社交网络把数字人类带入一个个彼此隔绝的线上群体中,我们清楚地看到,真相与谎言在互联网中交织,知识与观念混为一谈,情绪宣泄掩盖了事实分析。联网的世界让我们更容易看到彼此的观点,但同时也制......一起来看看 《失控的真相》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具