Go语言学习八:切片(slice)和范围(range)

shawncheer · · 10875 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

// Go 语言切片是对数组的抽象。切片的单词来源于可以对其他数组和切片进行片段截取


// Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,
// Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),
// 与数组相比切片的长度是不固定的,可以追加元素,
// 在追加时可能使切片的容量增大。


package main


import "fmt"


func main() {
	// 切片的长度和容量
	var numbers = make([]int, 3, 5) //用make创建切片
	printSlice(numbers)


	// 空(nil)切片
	// 切片在未初始化时默认是nil,长度是0,容量也是0
	var numbers1 []int
	printSlice(numbers1)
	if numbers1 == nil {
		fmt.Printf("切片是空的")
	}


	//切片截取
	numbers2 := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
	/* 打印子切片从索引1(包含) 到索引4(不包含)*/
	fmt.Println("numbers2[1:4] ==", numbers2[1:4])


	fmt.Println("numbers2[:3] ==", numbers2[:3]) //索引是从0开始的


	fmt.Println("numbers2[4:] ==", numbers2[4:])


	numbers3 := make([]int, 0, 5)
	printSlice(numbers3)


	numbers4 := numbers2[:2] //索引  0(包含) 到索引 2(不包含),这是为了计算数量更方便
	printSlice(numbers4)


	// append() 和 copy() 函数
	var numbers5 []int
	printSlice(numbers5)


	numbers5 = append(numbers5, 0) //容量是2的n次方
	printSlice(numbers5)


	numbers5 = append(numbers5, 1)
	printSlice(numbers5)


	numbers5 = append(numbers5, 2, 3, 4)
	printSlice(numbers5)


	// 创建两倍容量的切片
	numbers6 := make([]int, len(numbers5), (cap(numbers5))*2)


	copy(numbers6, numbers5) //前面是目标,后面是要复制的内容,把原来的覆盖、
	printSlice(numbers6)


	// Go 语言中 range 关键字用于for循环中迭代数组(array)、切片(slice)、
	// 链表(channel)或集合(map)的元素。在数组和切片中它返回元素的索引值,
	// 在集合中返回 key-value 对的 key 值。


	//range是取出两值


	nums := []int{2, 3, 4}
	sum := 0
	for _, num := range nums {
		sum += num
	}
	fmt.Println("sum:", sum)
	//在数组上使用range将传入index和值两个变量。
	// 上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。
	// 有时侯我们确实需要知道它的索引。
	for i1, num1 := range nums {
		if num1 == 3 {
			fmt.Println("index:", i1) //索引从0开始
		}
	}


	//range也可以用在map的键值对上。
	kvs := map[string]string{"a": "apple", "b": "banana"}
	for k, v := range kvs {
		fmt.Printf("%s -> %s\n", k, v)
	}
	//range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
	for i2, c := range "go" {
		fmt.Println(i2, c)//得出的c是ASCII值
	}


}


func printSlice(x []int) {
	//这里的len()是用来获得现在切片数据的长度,而cap()则为了求总容量
	fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:shawncheer

查看原文:Go语言学习八:切片(slice)和范围(range)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

10875 次点击  
加入收藏 微博
1 回复  |  直到 2017-10-10 14:12:19
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传