Skip to content

内建方法

内建方法--make

  • 创建 slice、map、chan
    1. slice: 类似数组,在go中定义数组后长度是不可变的,但是切片可以。
    2. map: 键值对形式
    3. chan: 管道,两个线程之间可以交互
  • 返回类型引用
  • 代码示例
    package main
    
    import "fmt"
    
    // 创建切片
    func makeSlice() {
        // make([]string 数组的值类型,长度)
        mSlice := make([]string, 3)
        mSlice[0] = "cat"
        mSlice[1] = "dog"
        mSlice[2] = "pig"
        fmt.Println(mSlice)
    }
    
    // 创建map
    func makeMap() {
        // make(map[key类型]value的类型, 长度)
        mMap := make(map[int]string)
        mMap[121] = "121"
        mMap[119] = "119"
        fmt.Println(mMap)
    }
    
    // 创建 channel 管道
    func makeChan() {
        // make(chan int处跟切片不一样 这里的3是缓存的3)
        mChan := make(chan int)
        close(mChan)
    }
    
    func main() {
        makeSlice()
        makeMap()
        makeChan()
    }
    
    
    // 输出
    MacintoshdeMacBook-Pro-139:slice elasticnotes$ go run slice.go 
    [cat dog pig]
    map[119:119 121:121]
    

内建方法--new

  • 内存置零
  • 返回传入类似的指针地址
  • 代码示例
    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    // 使用new make创建map
    func NewMap() {
        mNewMap := new(map[int]string)
        mMakeChan := make(map[int]string)
        fmt.Println(reflect.TypeOf(mNewMap))
        fmt.Println(reflect.TypeOf(mMakeChan))
    }
    
    func main() {
        NewMap()
    }
    
    
    // 输出
    MacintoshdeMacBook-Pro-139:slice elasticnotes$ go run slice.go 
    *map[int]string
    map[int]string
    

内建方法--append&copy&delete

  • slice -> append & copy
  • map -> delete
  • 代码演示
    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    // slice 追加
    func appendSlice() {
        appendSlice := make([]string, 2)
        appendSlice[0] = "1"
        appendSlice[1] = "2"
        fmt.Println(len(appendSlice))
        fmt.Println(cap(appendSlice))
        appendSlice = append(appendSlice, "3")
        fmt.Println(appendSlice)
        fmt.Println(len(appendSlice))
        fmt.Println(cap(appendSlice))
    }
    
    // copy
    func copySlice() {
        first := make([]string, 3)
        first[0] = "1"
        first[1] = "2"
        first[2] = "3"
        second := make([]string, 2)
        second[0] = "A"
        second[1] = "B"
    
        // 拷贝到的变量,被拷贝的变量
        copy(first, second)
        fmt.Println(first)
    }
    
    // 删除map
    func delMap() {
        delMap := make(map[int]string)
        delMap[0] = "A"
        delMap[1] = "B"
        delete(delMap, 1)
        fmt.Println(delMap)
    }
    
    func main() {
        appendSlice()
        copySlice()
        delMap()
    }
    
    
    // 输出
    MacintoshdeMacBook-Pro-139:slice elasticnotes$ go run slice.go 
    2
    2
    [1 2 3]
    3
    4
    [A B 3]
    map[0:A]
    

内建方法--panic&recover

  • panic 抛出异常
  • recover 捕获异常
    • 简单示例
      package main
      import "fmt"
      func reveivePanic() {
      
          defer func() {
              message := recover()
              fmt.Println(message)
          }()
      
          panic("这是一个panic")
      }
      func main() {
          reveivePanic()
      }
      
      // 输出
      MacintoshdeMacBook-Pro-139:panic elasticnotes$ go run panic.go 
      这是一个panic
      
    • 进阶示例
      package main
      import (
          "fmt"
      )
      func reveivePanic() {
          defer coverPanic()
          panic("这是一个string panic")               // 分别注释
          panic(errors.New("这是一个error panic"))    // 分别注释
          panic(1)    // 分别注释
      }
      func coverPanic() {
          message := recover()
          switch message.(type) {
          case string:
              fmt.Println("string panic:", message)
          case error:
              fmt.Println("error panic:", message)
          default:
              fmt.Println("unknow panic:", message)
          }
      }
      func main() {
          reveivePanic()
      }
      
      // 输出
      MacintoshdeMacBook-Pro-139:panic elasticnotes$ go run panic.go 
      string panic: 这是一个string panic
      MacintoshdeMacBook-Pro-139:panic elasticnotes$ go run panic.go 
      error panic: 这是一个error panic
      MacintoshdeMacBook-Pro-139:panic elasticnotes$ go run panic.go 
      unknow panic: 1
      

内建方法--len&cap&close

  • len 长度 数据长度
    • 支持的数据类型
      1. string
      2. array
      3. slice
      4. map
      5. chan
  • cap 容量
    • 支持的数据类型
      1. slice
      2. array
      3. chan
  • close 关闭

    • 只能关闭channel
  • 示例

    package main
    
    import "fmt"
    
    func getLen() {
        arr := make([]string, 2, 5)
        arr[0] = "A"
        arr[1] = "B"
        arr = append(arr, "C")
        fmt.Println("array's length is :", len(arr))
        fmt.Println("array's cap is :", cap(arr))
    
        arr = append(arr, "C")
        arr = append(arr, "C")
        arr = append(arr, "C")
        arr = append(arr, "C")
        fmt.Println("array's length is :", len(arr))
        fmt.Println("array's cap is :", cap(arr))
    }
    
    func closeChan() {
        mChan := make(chan int, 1)
        // defer意思是当前方法执行到最后再需要执行的行为  channel关闭之后就不能再往里面写数据了
        defer close(mChan)
        mChan <- 1
    }
    
    func main() {
        getLen()
        // closeChan()
    }
    
    
    // 输出
    `MacintoshdeMacBook-Pro-139:lcc elasticnotes$ go run lcc.go `
    `array's length is : 3`
    `array's cap is : 5`
    `array's length is : 7`
    `array's cap is : 10`
    

本章小结

  • 两种创建方式

    1. make
      • 返回引用类型
        • 只能针对3种数据类型来使用
          1. 数组
          2. channel
          3. map
    2. new
      • 返回指针类型
  • 常用集合类型

    1. 添加 append
    2. 删除 delete
    3. 拷贝 copy 注意拷贝的 from to
  • 错误与异常

    1. panic
    2. recover
  • 长度,可以使用长度(容量)