Go基础学习三之数组array、切片slice、map
一、数组Array
示例: package main import "fmt" func main() { // var a [2]int a := [2]int{1,2} fmt.Println(a) } 打印结果: [1 2] new 创建数据 // var a [2]int a := [10]int{} a[1] = 2 fmt.Println(a) p := new([10]int) p[1] = 2 fmt.Println(p) 打印结果: ? run arr.go [0 2 0 0 0 0 0 0 0 0] &[0 2 0 0 0 0 0 0 0 0] 看一下,上边有什么不同吗?第二行结果带了一个地址符 多维数组 a := [2][3]int{ {1,2,3},{4,5,6}} fmt.Println(a) 打印结果: [[1 2 3] [4 5 6]] 冒泡排序法: package main import "fmt" // 冒泡排序 func main() { // ...可以表示不确定的元素数 a := [...]int{1,4,9,20,13,3} fmt.Println(a) // 计算数组的长度 num := len(a) for i := 0; i < num; i++ { // 外边的循环,每循环一次,会将最大的值排在前边 for j := i + 1; j < num; j++ { if a[i] < a[j] { temp := a[i] a[i] = a[j] a[j] = temp } } } fmt.Println(a) } 打印结果: [1 4 9 2 5 0 20 13 3] [20 13 9 5 4 3 2 1 0] 二、切片Slice
示例: package main import "fmt" func main() { // var s1 []int; a := [10]int{1,3,6,7,8,9} fmt.Println(a) s1 := a[5:10] // a[5,9] 注意:包含5,不包含10[) fmt.Println(s1) } 打印结果: ? myfirstgo go run slice.go [1 2 3 4 5 6 7 8 9 0] [6 7 8 9 0] 创建切片: // 第一个参数表示数组类型,第二个参数表示元素个数,第三个参数表示容量,先分配10个连续的内存,如果不设置容量默认为元素个数 s1 := make([]int,10) fmt.Println(len(s1),cap(s1)) 打印结果: ? myfirstgo go run slice.go 3 10 Reslice,即再次slice
a := []byte{'a','b','c','d','e','f','g','h'} sa := a[2:5] sb := sa[1:3] fmt.Println(sb) // 打印出:[100 101] fmt.Println(string(sb)) // 打印出:de 如果sb的数组下标越界: a := []byte{'a','h','i','j'} sa := a[2:5] fmt.Println(sa) fmt.Println(len(sa),cap(sa)) // 打印sa的元素个数和容量 sb := sa[3:5] // 超过sa的下标 // fmt.Println(sb) fmt.Println(string(sb)) 打印结果: ? myfirstgo go run slice.go [99 100 101] 3 8 [102 103] fg
Append
s1 := make([]int,6) fmt.Printf("%pn",s1) // 打印出内存地址: 0xc420016180 s1 = append(s1,1,3) fmt.Printf("%v %pn",s1,s1) // 打印出内存地址:0xc420016180 s1 = append(s1,s1) // 打印出内存地址:0xc420066060 打印结果: ? myfirstgo go run slice.go 0xc420016180 [0 0 0 1 2 3] 0xc420016180 [0 0 0 1 2 3 1 2 3] 0xc420066060
Copy s1 := []int{1,5} s2 := []int{7,9} // 拷贝s2的元素到s1中 copy(s1,s2) // copy(s2,s1) fmt.Println(s1) 打印结果: [7 8 9 4 5] 三、map(集合)Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
1、定义 Map可以使用内建函数 make 也可以使用 map 关键字来定义 Map: /* 声明变量,默认 map 是 nil */ var map_variable map[key_data_type]value_data_type /* 使用 make 函数 */ map_variable := make(map[key_data_type]value_data_type) 如果不初始化 map,那么就会创建一个 举例: package main import "fmt" func main() { // 声明map变量 // var m map[int]string // m = map[int]string{} // m = make(map[int]string) m := make(map[int]string) // 赋值 m[1] = "love" // 删除 delete(m,1) fmt.Println(m) } 打印: ? myfirstgo go run map.go map[] 多个map嵌套: var m map[int]map[int]string m = make(map[int]map[int]string) a,ok := m[2][1] if !ok { m[2] = make(map[int]string) } m[2][1] = "MeiM" a = m[2][1] fmt.Println(a,ok) 打印: ? myfirstgo go run map.go MeiM false 迭代 sm := make([]map[int]string,5) for _,v := range sm { v = make(map[int]string,1) // 此处的v为拷贝,而不是引用,不会改变原值 v[1] = "OK" fmt.Println(v) } fmt.Println(sm) 打印: ? myfirstgo go run map.go map[1:OK] map[1:OK] map[1:OK] map[1:OK] map[1:OK] [map[] map[] map[] map[] map[]] 2、小试牛刀根据 需要转换为下面的例子: m1 := map[int]string{1:"a",2:"b",3:"c"} m2 := map[string]int{"a":1,"b":2,"c":3} 示例: m1 := map[int]string{1:"a",3:"c"} // m2 := map[string]int{"a":1,"c":3} m2 := make(map[string]int) for key,v := range m1 { // fmt.Println(key) // fmt.Println(v) m2[v] = key } fmt.Println(m2) 打印结果: ? myfirstgo go run map.go map[a:1 b:2 c:3] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |