内容简介:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chao2016/article/details/81537007
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chao2016/article/details/81537007
内建容器有数组和Map
这里讲三个概念:数组、切片、Map
1. 数组
数组是值类型
- [10]int和[20]int是不同的类型
- 调用func f(arr [10]int)会拷贝数组。想改变原数组的值,用指针类型参数
- golang一般不直接使用数组
arrays.go:
package main import "fmt" func printArray(arr *[5]int) { arr[0] = 100 for i, v := range arr { fmt.Println(i, v) } } func main() { var arr1 [5]int arr2 := [3]int{1, 3, 5} arr3 := [...]int{2, 4, 6, 8, 10} var grid [4][5]int // 多维数组,4个长度为5的int数组 // 打印数组 fmt.Println(arr1, arr2, arr3) fmt.Println(grid) // 遍历数组 for i:= 0; i < len(arr3); i++ { fmt.Print(arr3[i]) } fmt.Println() // 遍历数组可以用range关键字 // 获得下标 for i := range arr3 { fmt.Print(arr3[i]) } fmt.Println() // 获得值 for _, v := range arr3 { fmt.Print(v) } fmt.Println() // 获得数组下标和值 for i, v := range arr3 { fmt.Println(i, v) } fmt.Println("printArray(arr1):") printArray(&arr1) fmt.Println("printArray(arr3):") printArray(&arr3) fmt.Println("arr1 and arr3:") fmt.Println(arr1, arr3) }
输出:
[0 0 0 0 0] [1 3 5] [2 4 6 8 10] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] 246810 246810 246810 0 2 1 4 2 6 3 8 4 10 printArray(arr1): 0 100 1 0 2 0 3 0 4 0 printArray(arr3): 0 100 1 4 2 6 3 8 4 10 arr1 and arr3: [100 0 0 0 0] [100 4 6 8 10]
2. 切片(Slice)
2.1 slices.go:
package main import "fmt" func updateSlice(s []int) { s[0] = 100 } func main() { arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} fmt.Println("arr[2:6] =", arr[2:6]) fmt.Println("arr[:6] =", arr[:6]) s1 := arr[2:] fmt.Println("arr[2:] =", s1) s2 := arr[:] fmt.Println("arr[:] =", s2) fmt.Println() fmt.Println("After updateSlice(s1):") updateSlice(s1) fmt.Println(s1) fmt.Println(arr) fmt.Println() fmt.Println("After updateSlice(s2):") updateSlice(s2) fmt.Println(s2) fmt.Println(arr) fmt.Println() fmt.Println("Reslice:") fmt.Println(s2) s2 = s2[:5] fmt.Println(s2) s2 = s2[2:] fmt.Println(s2) fmt.Println("Extending slice") arr[0], arr[2] = 0, 2 s1 = arr[2:6] s2 = s1[3:5] // 取的[s1[3], s1[4]] //fmt.Println(s1[4]) // 会报错 fmt.Println("s1 =", s1) fmt.Println("s2 =", s2) fmt.Println() // slice可以向后扩展,不可以向前扩展 // s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s) fmt.Println("arr =", arr) fmt.Printf("s1 = %v, len(s1) = %d, cap(s1) = %d\n", s1, len(s1), cap(s1)) fmt.Printf("s2 = %v, len(s2) = %d, cap(s2) = %d\n", s2, len(s2), cap(s2)) fmt.Println() s3 := append(s2, 10) s4 := append(s3, 11) s5 := append(s4, 12) fmt.Println("s3, s4, s5 =", s3, s4, s5) // s4和s5不再是arr的view // 添加元素时如果超越cap,系统会重新分配更大的底层数组 fmt.Println("arr =", arr) }
输出:
arr[2:6] = [2 3 4 5] arr[:6] = [0 1 2 3 4 5] arr[2:] = [2 3 4 5 6 7] arr[:] = [0 1 2 3 4 5 6 7] After updateSlice(s1): [100 3 4 5 6 7] [0 1 100 3 4 5 6 7] After updateSlice(s2): [100 1 100 3 4 5 6 7] [100 1 100 3 4 5 6 7] Reslice: [100 1 100 3 4 5 6 7] [100 1 100 3 4] [100 3 4] Extending slice s1 = [2 3 4 5] s2 = [5 6] arr = [0 1 2 3 4 5 6 7] s1 = [2 3 4 5], len(s1) = 4, cap(s1) = 6 s2 = [5 6], len(s2) = 2, cap(s2) = 3 s3, s4, s5 = [5 6 10] [5 6 10 11] [5 6 10 11 12] arr = [0 1 2 3 4 5 6 10]
2.2 sliceops.go:
package main import "fmt" func printSlice(s []int) { fmt.Printf("%v\n len=%d, cap=%d\n", s, len(s), cap(s)) } func main() { fmt.Println("Creating slice:") var s []int // Zero value for slice is nil for i := 0; i < 100; i++ { s = append(s, 2*i+1) } fmt.Println(s) s1 := []int{2, 4, 6, 8} printSlice(s1) s2 := make([]int, 16) printSlice(s2) s3 := make([]int, 10, 32) printSlice(s3) fmt.Println("Copying slice:") copy(s2, s1) printSlice(s2) fmt.Println("Deleting elements from slice:") s2 = append(s2[:3], s2[4:]...) printSlice(s2) fmt.Println("Popping from front:") front := s2[0] s2 = s2[1:] fmt.Println(front) printSlice(s2) fmt.Println("Popping from back:") tail := s2[len(s2) - 1] s2 = s2[:len(s2) - 1] fmt.Println(tail) printSlice(s2) }
输出:
Creating slice: [1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99] [2 4 6 8] len=4, cap=4 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] len=16, cap=16 [0 0 0 0 0 0 0 0 0 0] len=10, cap=32 Copying slice: [2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0] len=16, cap=16 Deleting elements from slice: [2 4 6 0 0 0 0 0 0 0 0 0 0 0 0] len=15, cap=16 Popping from front: 2 [4 6 0 0 0 0 0 0 0 0 0 0 0 0] len=14, cap=15 Popping from back: 0 [4 6 0 0 0 0 0 0 0 0 0 0 0] len=13, cap=15
3. Map
map的操作:
- 创建:make(map[string]int)
- 获取元素:m[key]
- key不存在时,获得Value类型的初始值
- 用value, ok:=m[key]来判断是否存在key
- 用delete删除一个key
- 使用len获得元素个数
map的遍历:
- 用range遍历key,或者遍历key-value对
- 不保证遍历顺利,如需顺序,需手动对key排序
map的key:
- map使用哈希表,必须可以比较相等
- 除了slice,map,function的内建类型都可以作为key
- Struct类型不包含上述三个字段,也可作为key
maps.go:
package main import "fmt" // map的操作 // 1. 创建:make(map[string]int) // 2. 获取元素:m[key] // 3. key不存在时,获得Value类型的初始值 // 4. 用value, ok:=m[key]来判断是否存在key // 5. 用delete删除一个key // 6. 使用len获得元素个数 // map的遍历 // 1. 用range遍历key,或者遍历key-value对 // 2. 不保证遍历顺利,如需顺序,需手动对key排序 // map的key // 1. map使用哈希表,必须可以比较相等 // 2. 除了slice,map,function的内建类型都可以作为key // 3. Struct类型不包含上述三个字段,也可作为key func main() { fmt.Println("Creating map:") m := map[string]string { "name": "chao", "course": "golang", "site": "aliyun", "qualicty": "notbad", } m2 := make(map[string]int) // m2 == empty map var m3 map[string]int // m3 == nil,go的nil与其他语言的None不同,它可以进行计算 fmt.Println(m) fmt.Println(m2) fmt.Println(m3) fmt.Println() // hashmap,key值是无序的 fmt.Println("Traversing map:") for k, v := range m { fmt.Println(k, v) } fmt.Println() fmt.Println("Getting values:") courseName := m["course"] fmt.Println(courseName) causeName, ok := m["cause"] fmt.Println(causeName, ok) // key不存在时,获得Value类型的初始值 if causeName, ok = m["cause"]; ok { fmt.Println(causeName) } else { fmt.Println("key does not exist") } fmt.Println() fmt.Println("Deleting values:") name, ok := m["name"] fmt.Println(name, ok) delete(m, "name") name, ok = m["name"] fmt.Println(name, ok) }
输出:
Creating map: map[name:chao course:golang site:aliyun qualicty:notbad] map[] map[] Traversing map: name chao course golang site aliyun qualicty notbad Getting values: golang false key does not exist Deleting values: chao true false
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Writing Apache Modules with Perl and C
Lincoln Stein、Doug MacEachern / O'Reilly Media, Inc. / 1999-03 / USD 39.95
Apache is the most popular Web server on the Internet because it is free, reliable, and extensible. The availability of the source code and the modular design of Apache makes it possible to extend Web......一起来看看 《Writing Apache Modules with Perl and C》 这本书的介绍吧!