Go -- 数组 + 切片

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

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

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

查看所有标签

猜你喜欢:

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

PHP 5完全攻略

PHP 5完全攻略

杜江 / 2010-5 / 79.00元

《PHP 5完全攻略(畅销书升级版)》是目前第一本真正介绍PHP 5及MySQL 5新增语法与功能的中文版本权威宝典!《PHP 5完全攻略(畅销书升级版)》本着精、全、要三宗旨,从理论中延伸,从实践中深入,翔实并完善地描述了PHP 5的开发特性与MySQL 5数据库。《PHP 5完全攻略(畅销书升级版)》分为两大部分,第1部分主要阐述PHP开发的基础知识,如PHP数组与表单处理、PHP 5面向对象......一起来看看 《PHP 5完全攻略》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具