内容简介:版权声明:本文为博主原创文章,未经博主允许不得转载。 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
RGB转16进制工具
RGB HEX 互转工具
SHA 加密
SHA 加密工具