// 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) }
有疑问加站长微信联系(非本文作者)