Go基础语法复习 | 青训营笔记

30 阅读3分钟

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

今天正式结束了青训营的后端大项目开发,青训营工作人员也是上传了相应的青训营复习文档。作为一名转码选手,在写完大项目后我发现自己还是对 Go 语言的基础语法掌握不足,所以又重头复习了一遍 Go 的基础语法

Go 语言的优点

  • 语法简单:没有继承、多态等复杂概念
  • 静态编译:编译完成后可以直接在服务器上运行
  • 自动回收:无需用户自己处理 gc
  • 高效并发:go 官方在语法层面上支持并发

init 函数与 main 函数

init 函数:仅仅在包的初始化时执行的函数,其主要特征有:

  • init 函数不可以被其他函数调用
  • init 函数在 main 函数开始之前执行完毕
  • init 函数执行的先后顺序由各个包的依赖关系决定
  • 一个包内可以有多个 init 函数

main 函数:go 语言的默认入口函数

运算符

go 语言中没有三元运算符

算数运算符

    - 相减
    * 相乘
    / 相除
    % 取余

逻辑运算符

    || 或
    !  非

关系运算符

    != 不等
    >  大于
    <  小于
    >= 大于等于
    <  小于
    <= 小于等于

位运算符

    |  位或
    ^  位异或
    << 左移
    >> 右移

幅值运算符

go 语言还支持 += -= 等赋值运算符

下划线

  • -下划线用于忽略运算结果
  • 如果在导包时在包名前加上了 - 表示只执行包内的 init 函数

数组 Array

  • 是一种定长序列,数组长度必须为常量
  • 可以通过下标访问元素,数组下标从0开始计数
  • 数组访问不能用越界 0 ~ len-1
  • 对数组进行赋值穿三时会复制整个数组,而非只传递数组首地址指针
  • 支持 == != 等操作符
  • 声明 var a [len]int

切片

  • 切片是引用类型
  • 切片长度可变,类似于vector
  • 切片可以通过下标访问元素
  • 切片可以为 nil
  • 声明 var arr []int

指针

Go 语言的指针与 C++ 类似,但是不支持便宜和运算,是安全指针

Map

Go 中的 map 是一种无序 key-value 结构,如果想要排序的 map,往往需要搭配 sort slice 实现 map 的声明

scoreMap := make(map[string]int, 8)

结构体

定义方式

    type name struct {
        字段名 字段类型
        字段名 字段类型
        …
    }

流程控制

if-else

Go 中 if else 结构忽略了括号,但是所有的结构体以及后续 else if 与 else 必须紧跟

if n := "abc"; x > 0 {
    println(n[2])
} else if x < 0 { //必须紧跟
    println(n[1])
} else {
    println(n[0])
}

switch-case

go 中的每个 case 执行后不会再执行其他 case 所以不需要我们手动 break

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

select

select 会速记执行一个可运行 case, 在通信,阻塞中使用较多

for循环

   // 类比 for(i = 0; i < n; i++) {}
   for a := 0; a < 10; a++ {
      fmt.Printf("a 的值为: %d\n", a)
   }
   // 类比 while()
   for a < b {
      a++
      fmt.Printf("a 的值为: %d\n", a)
      }
   // 类比 for(num := nums) {}
   for i,x:= range numbers {
      fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
   }   

range

for key, value := range oldMap {
    newMap[key] = value
}