青训营X豆包MarsCode 技术训练营后端笔记——第一课:Go语言基础语法 | 豆包MarsCode AI 刷题

74 阅读4分钟

一. Go语言特点(谷歌出品)

  1. 高性能,高并发,大多只需依赖标准库或基于标准库的第三方库来开发
  2. 语法简单,类似于C语言并进行了大量简化,上手简单
  3. 标准库丰富
  4. 工具链完善,代码补充提示、单元测试等
  5. 静态链接,部署方便快捷
  6. 快速编译
  7. 跨平台,在不同系统下开发等,路由器、树莓派..
  8. 垃圾回收,无需考虑内存分配释放

二. Go开发环境

  1. 下载链接:go.dev Pasted image 20241102205152.png
  2. 编译器/IDE可以使用vscodeGoLand(收费) 在vscode中下载插件:Go Pasted image 20241102205304.png
  3. hello, world! ↓我这里使用的是vscode Pasted image 20241102205652.png

三. Go基础语法

  1. 变量
    • 变量的声明1:`var a = true
    • 变量的声明2:var a int
    • 变量的声明3:var a,b int = 0,1
    • 变量的声明3:省略varif的赋值写法——a := “guagua”,等同于var s strings = "guagua"声明+赋值两句话,也等同于var a = "guagua"或var a string = "guagua"
    • 注意:若声明了类型可不赋值,不声明类型一定要赋值(否则直接报错)
  2. 常量const:不需要声明类型,会根据使用的上下文自动确定类型
  3. 条件判断语句if else if语句类似于c语言,但是可以省略条件的括号,必须写大括号
        if num := 9; num < 0 {
            fmt.Println(num, "is negative")
        } else if num < 10 {
            fmt.Println(num, "has 1 digit")
        } else {
            fmt.Println(num, "has multiple digits")
        }
    
    输出为9 has 1 digit
  4. 循环语句for go语言的循环语句只有for循环,没有while、dowhile
    • 写法1. 死循环for{fmt.Println("loop")}
    • 写法2. 类似于c
      for i := 0; i < 10; i++{
          fmt.Println(i) 
      }
      
    • 其他:continue和break用法同其他语言
  5. 分支结构switch 类似c语言,与c的区别:1)变量名可以省略小括号,2)不需要在case里写break,3)switch支持任意类型变量,也可以不加变量,取代if else语句
        t := time.Now()
        switch {//可以不加变量
        case t.Hour() < 12:
            fmt.Println("It's before noon")//可以不写break
        default:
            fmt.Println("It's after noon")
        }
    
  6. 数组 长度固定,声明数组时需要指定类型和长度var a_list [5]int,b := [5]int{1,2,3,4,5},二维数组var td [2][3]int
  7. 切片 相比数组,切片更加常用(有点类似于python的list的感觉),切片的长度不固定
    • 使用make创建切片s := make([]string, 3)
    • 不使用make创建切片 s := []string{"a","b","c","d"} var s = []string{}
    • 使用append追加元素s = append(s,"d","e"),注意append函数返回值必须赋值给原数组
    • copy复制切片c := make([]string, len(s)) copy(c,s)
    • 切片索引类似于pythons[2:5],不同是go的切片不支持负数索引
  8. 哈希map/字典 类似于python的字典dict
    • 使用make创建map:m := make(map[string]int),string代表key,int代表value类型
    • 不使用make创建map:    m2 := map[string]int{"one": 1, "two": 2}     var m3 = map[string]int{"one": 1, "two": 2}
    • 方括号读取和写入K-V对:m["one"]=1,res, ok = m["two"],ok判断key值是否存在返回true/false
    • delete删除k-v对:delete(m, "one")
    • map的元素顺序类似于python的dict,偏随机顺序
  9. range遍历
    • 可以遍历数组、切片、map等
    • 遍历map for k, v := range m{fmt.println(k,v)} 其中返回的分别是key和value(如果只写一个返回值则只返回key)
    • 遍历切片/数组
        nums := []int{1,2,3,4}
        for i, num := range nums {//使用range遍历,i返回索引,num返回元素
            fmt.println(num)
        }
        for i := 0; i < len(nums); i++{// 效果同上
          fmt.println(nums[i])
        }
    
  10. 函数
    • 函数组成: 返回值一般还包括一个ok/error,以便输出错误信息
    func 函数名(参数1 类型1,参数2 类型2..) (返回值1 返回类型1, ..,ok bool){
            函数体
    }
    
  11. 指针 与c语言类似,使用*和&
  12. 结构体
    • 结构体是带类型的字段的集合type 结构体名 struct{name string}
    • 结构体方法
            func (形参名 结构体名) 函数名(参数名 参数类型){
                    ...
            }
    
  13. 错误处理error
    • 在函数的返回值中加上err error,若没有错误可返回nil,否则可以返回error.New("错误信息")
  14. 字符串工具函数
    • Contarins,Count,Index,Join等
    • 格式化:fmt.Println(...),fmt.Printf("%v",a)类似于c的printf,但是不需要指定%类型,同样可以使用%.2f来输出指定小数位数
  15. JSON处理
    • 使用json.Marshal对结构体进行序列化
  16. 事件处理
    • time.Now(),t = time.Date(...),求时间差t.Sub(t1),格式化时间为字符串str = t.Format("2006-01-02 15:04:05"),字符串转为时间类型time.Paese("2006-01-02 15:04:05","2024-01-02 15:04:05")时间戳time.Now().Unix()
  17. 数字解析
    • 使用strconv库来进行解析字符串
    • 常用的有strconv.ParseFloat(),strconv.ParseInt("111",10(进制),64(精度)), strconv.Atoi("123"),strconv.Itoa(123),注意,以上的返回值都有两个,一个返回值,一个err
  18. 进程信息(这一部分不太懂)