Go -- 数组 + 切片

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

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)
}

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

查看所有标签

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

Operating System Algorithms

Operating System Algorithms

Nathan Adams、Elisha Chirchir / CreateSpace Independent Publishing Platform / 2017-4-21 / USD 39.15

Operating System Algorithms will walk you through in depth examples of algorithms that you would find in an operating system. Selected algorithms include process and disk scheduling.一起来看看 《Operating System Algorithms》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试