golang-数组、切片、映射

1.数组

  数组存放同种数据类型的集合, 可以通过索引去访问 ,长度不可以被改变 ,容量等于长度

  数组是值类型 ,赋值会拷贝副本

  数组作为参数 ,函数收到的是数组拷贝而不是指针

 1 package main
 2 
 3 import (
 4    "fmt"
 5    "reflect"
 6 )
 7 
 8 func main() {
 9    var numbers [3]int
10    var numbers1 = [2]int{1, 2}             //直接写数组值
11    numbers3 := [...]int{1, 2, 3, 4, 5}       //自动计算长度
12 
13    numbers[0] = 1
14    for _, i := range numbers {
15       fmt.Println(i, reflect.TypeOf(i))
16    }
17    fmt.Println(numbers[0])
18    fmt.Println(numbers)
19    fmt.Println(numbers1)
20    fmt.Println(numbers3)
21 }
View Code

2.切片

  切片底层是数组中连续的一个片段 ,切片由三部分组成: "指向数组的指针" "容量" "长度" 

  切片比数组更加灵活 ,可以新增删除插入复制切片能自动调整大小

  识别切片和数组 ,切片长度

  创建方式: 可以创建空切片 ,创建带值的切片 ,使用make创建还可以指定初始长度

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6    slice1 := []int{}
 7    slice2 := []string{"1","2","3"}
 8    slice3 := make([]string,3)          //初始化长度为3 ,后面还可以指定容量,不指定默认为length=capacity
 9    fmt.Println(slice1,slice2,slice3)
10 }
View Code

  切片通过索引切出来的切片 ,虽然是新的切片但是底层同属一个数组 ,修改会影响所有

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     slice1 := make([]string, 3)
 7     slice1[0], slice1[1], slice1[2] = "A", "B", "C"
 8     slice2 := slice1[:1]
 9     fmt.Println(slice1,slice2)
10     slice2[0] = "O"
11     fmt.Println(slice1,slice2)
12 }
View Code

  切片通过索引来修改值

  append函数完成切片的 : 追加  删除  插入      append实际上就是将参数中的切片拼接

    追加 ,可追加多个元素

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     slice1 := make([]string, 3)
 7     slice1[0], slice1[1], slice1[2] = "A", "B", "C"
 8     slice1 = append(slice1, "A","A","A")
 9     fmt.Println(slice1)
10 }
View Code

    删除 

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     slice1 := make([]string, 3)
 7     slice1[0], slice1[1], slice1[2] = "A", "B", "C"
 8     slice1 = append(slice1[:1],slice1[1+1:]...)
 9     fmt.Println(slice1)
10 }
View Code

    插入 ,需要使用copy函数将切片复制出来避免操作同一数组

 1 package main
 2 
 3 import "fmt"
 4 
 5 func insert(slice1 []string, index int, val string) []string {
 6     temp_q := slice1[:index]
 7     temp_h := make([]string, len(slice1[index:]))
 8     copy(temp_h, slice1[index:])
 9     temp_q = append(temp_q, val)
10     slice1 = append(temp_q, temp_h...)
11     return slice1
12 }
13 
14 func main() {
15     slice1 := make([]string, 3)
16     slice1[0], slice1[1], slice1[2] = "A", "B", "C"
17     slice1 = insert(slice1, 1, "BH")
18     fmt.Println(slice1)
19 }
View Code

  copy函数完成切片复制 

  copy(目标切片 ,源切片)        #目标切片创建必须使用make函数 ,并指定长度等于源切片  

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     slice2 := []string{"1","2"}
 7     slice1 := make([]string,len(slice2))
 8     copy(slice1,slice2)
 9     fmt.Println(slice1)
10 }
View Code

   判断切片是否为空可以判断切片类型是否为nil

3.映射

  go的映射就是字典 ,通过hash表实现 ,可以通过k快速访问v ,可以看做k:v的无序集合

  映射的增删改查

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     dic1 := make(map[string]int)
 7     dic1["小明"] = 18
 8     dic1["小王"] = 28
 9     dic1["小李"] = 38
10     fmt.Println(dic1)
11     fmt.Println(dic1["小明"])
12     delete(dic1, "小明")
13     fmt.Println(dic1)
14 }
View Code

4.为空校验

  切片与映射是否为空可以通过 nil 与长度是否为0判断

  数组是否为空可以通过数组的类型 ,取出[0]位置值 与该类型的零值比较判断

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     //var dic1 map[string]int          //var声明的无值为nil
 7     dic1 := make(map[string]int)        //简短声明可以用长度判断
 8     if dic1 == nil || len(dic1) == 0 {
 9         fmt.Println("字典为空")
10     }
11 }
12 
13 
14 package main
15 
16 import "fmt"
17 
18 func main() {
19    //var slice1 []string
20    slice1 := []string{}
21    if slice1 == nil || len(slice1) == 0 {
22       fmt.Println("切片为空")
23    }
24 
25 }
26 
27 package main
28 
29 import "fmt"
30 
31 func main() {
32    var arr1 [5]string
33    if arr1[0] == "" {
34       fmt.Println("数组为空")
35    }
36 }
View Code

 

 

 

    

 

posted @ 2019-10-27 20:31  屈冠文  阅读(189)  评论(0编辑  收藏  举报