// 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)
}
Go语言学习八:切片(slice)和范围(range)
最新推荐文章于 2022-07-31 02:42:00 发布