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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值