[ Golang编程基础2 | 青训营笔记]

91 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

【后端专场 学习资料一】第五届字节跳动青训营 - 掘金 (juejin.cn)

前言 · Go语言圣经 (studygolang.com)

‍⁢⁤‌⁣‬‌⁡⁡⁣⁤‬‌⁣⁣⁡⁣‍‌⁡⁣⁢⁡‬⁡⁣⁡⁤⁡‌⁢⁤‍⁢Go 语言上手 - 基础语法 .pptx - 飞书云文档 (feishu.cn)

函数

  1. 函数定义语法

    func name(parameter-list) (result-list) {
        body
    }
    
  2. Go语言不支持函数重载

  3. 函数可以作为参数传递

    func f1(a, b, c int){}
    func f2(a, b int) (int, int, int){}
    // 调用
    func main(){
        f1(f2(1, 2))
    }
    
  4. Go的函数支持多值返回,大部分业务代码都会返回两个参数,一个是所需数据data,一个是错误信息err

  5. Go的函数支持命名返回值的特性

    func f1(input int) (a int, b int){
        a = 2*input
        b = 3*input
        // 常规返回写法
        //return a, b
        
        // 特性写法
        return
    }
    
  6. 可变长参数语法

    // 语法
    func functionName(value1 type, value2 ...type)
    
    // 示例
    func main() {
        x := min(1, 2, 3, 4)
        fmt.Printf("The minimum is: %d\n", x)  // 打印:The minimum is: 0
        arr := []int{7,9,3,5,1}
        x = min(arr...)
        fmt.Printf("The minimum in the array is: %d", x) //打印:The minimum in the array is: 1
    }
    func min(a ...int) int {
        if len(a)==0 {
            return 0
        }
        min := a[0]
        for _, v := range a {
            if v < min {
                min = v
            }
        }
        return min
    }
    
  7. 关键字defer:允许我们推迟到函数返回之前一刻才执行某个语句或函数,如果return语句中包含一些操作,则会先操作完再执行defer标记的命令

  8. 多个 defer 行为被注册时,它们会以逆序执行

    func f(){
        for i := 0; i < 5; i++ {
            defer fmt.Printf("%d ", i)
        }
    }
    // 打印:4 3 2 1 0
    
  9. 匿名函数,可以赋值于某个变量,也可以直接对匿名函数进行调用

    func(x, y int) int { return x + y }(0, 2)
    
    add := func(x, y int) int { return x + y }
    add(0, 2)
    

切片

  1. Go中数组申明语法

    var arrName [len]type
    
    // 求数组长度
    len(arr)
    
    // for-range语法
    for value, _ := range arr{
        ....
    }
    
  2. 切片(slice)是对数组一个连续片段的引用

  3. 切片是可索引的,并且可以由 len() 函数获取长度

  4. 切片提供了计算容量的函数 cap() 可以测量切片最长可以达到多少,且不等式永远成立: 0 <= len(s) <= cap(s)

  5. 切片申明格式

    // 不需说明长度
    var sliceName []type
    
  6. 一个切片在未初始化之前默认为 nil,长度为 0

  7. make()创建切片

    // 创建长度为50,容量为100的切片
    v := make([]int, 50, 100)
    
  8. 切片的for-range语法:第一个返回值 ix 是数组或者切片的索引,第二个是在该索引位置的值

    for ix, value := range slice1 {}
    
  9. 切片追加

    s = append(s, 1, 2, 3, 4)
    
  10. 字符串生成切片

    c := []byte(s) 
    
  11. 利用切片修改字符串中某个位置字符

    s := "hello"
    c := []byte(s)
    c[0] = ’c’
    s2 := string(c) // s2 == "cello"
    

Map

  1. map 是引用类型,声明语法:

    var map1 map[keytype]valuetype
    map2 := make(map[keytype]valuetype, cap)
    
  2. 未初始化的 map 的值是 nil

  3. map第二个值表示这对key-value是否存在

     value, ok := map1[key1] // 如果key1存在则ok == true,否则ok为false
    
  4. map的for-range语法

    for key, value := range map1 {
    	...
    }