zoukankan      html  css  js  c++  java
  • 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

        

  • 相关阅读:
    [转]fedora国内源常见配置
    [转]Fedora 添加国内源(sohu, 163)
    keepalived
    lvs详解
    ansible详解
    练习题:计算传入字符串中的【数字】、【字母】、【空格】和【其他】的个数
    面向对象(继承、重写、多态)以及异常处理
    面向对象详解以及封装案例解答
    进程、线程与GIL全局解释器锁详解
    python函数与模块(paramiko、socket模块、文件处理、装饰器、迭代器等)
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11748864.html
Copyright © 2011-2022 走看看