Golang复习笔记

1: intro

  1. Golang: 极简单的部署方式

    1. 可直接编译成机器码
    2. 不依赖其它库
    3. 直接运行可部署
  2. Golang是一门静态类型语言 -- 编译时可检查出隐藏的问题

  3. 语言层面的并发

    1. 天生支持并发
    2. 充分利用多核
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package main

    import (
    "fmt"
    "time"
    )

    func goFunc(i int) {
    fmt.Println("goroutine ", i, " ...")
    }

    func main() {
    for i := 0; i < 10000; i++ {
    go goFunc(i) // 开启一个并发协程
    }

    time.Sleep(time.Second)
    }
  4. 强大的标准库

    1. runtime系统调度机制
    2. 高效的GC (垃圾回收)
    3. 丰富的标准库
  5. 简单易学

    1. 25个关键字
    2. 内嵌C语法支持
    3. 面向对象
    4. 跨平台
  6. Golang的强项

    1. 云计算基础设施
    2. 基础后端软件
    3. 微服务
    4. 互联网基础设施
  7. Golang的不足

    1. 包管理, 大部分包都在Github上
    2. 所有的Exception都用Error处理 (没有try-catch)
    3. 对C的降级处理并非无缝, 没有C降级到asm那么完美 (例如序列化问题)

2: basic feature

  1. package main 表示一个可独立执行的程序, 每个 Go 应用程序都包含一个名为 main 的包.

  2. golang中的表达式, 末尾的分号;可加可不加, 建议不加.

  3. import "fmt" 表示导入fmt包, fmt包里包含了格式化IO的函数.

  4. main函数式每一个可执行程序必须包含的.

  5. 注释, 类似C语言, // 单行注释; /* ... */ 块注释.

  6. fmt.Println(...)fmt.Print(...) 格式化输出. fmt.Scanln(...)fmt.Scanf(...)格式化输入.

  7. Print 类似python的语法, 而 Printf 类似C语言的用法.

  8. 变量声明: 使用var关键字

    • 指定变量类型, 若声明后不赋值, 默认值为0:
    1
    var a int
    • 根据值自行判定变量类型:
    1
    var v_name = value
    • 使用 :=, 注意, := 左边的变量不能是已经声明过的

    • 多变量声明:

    1
    2
    3
    4
    5
    6
    7
    var ( // 这种写法一般用于全局变量
    a int
    b bool
    )
    var c, d int
    var e, f = 123, "str"
    result, err := funcCall()
  9. 常量使用 const 关键字定义, 格式为: const identifier [type] = value , type可以省略, 由编译器进行类型推断.

  10. 常量的值必须是能够在编译期确定, 如:

1
2
const c1 = 1 * 2 + 3; // √
const c2 = getRes(); // x

  1. 在编译期, 自定义函数不可作为常量的赋值, 但是内置函数可以, 如: len()

  2. 数字型的常量是没有大小和符号的, 并且可以使用任何精度而不会导致溢出. (但是如果将常量赋值给某个特定类型变量, 则可能出现溢出)

  3. 常量可以用作枚举:

    1
    2
    3
    4
    5
    6
    7
    const (
    Mon, Tue, Wed = 1, 2, 3
    )
    const (
    Female = 1
    Male = 2
    )
  4. 也可以利用golang里面的常量计数器 iota , 每当const关键字出现时, 计数器清零, 然后按行常量声明值自增1.

  5. 以下是关于 itoa 的语法细节:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /* 一行多个itoa */
    const (
    a, b = iota, iota // a = b = 0
    c, d // c = d = 0
    )
    /* 跳值占位 */
    const (
    a = iota // a = 0
    _
    b // b = 2
    )
    /* 首行或中间插队 */
    const (
    a = 99
    b = iota // b = 1
    c = 97
    d = iota // d = 3
    e // 没有表达式的常量定义复用上一行的表达式
    )
  6. init 函数: 一类特殊的函数, 不能被人为调用, 而是在每个包完成初始化后自动按包的依赖关系顺序执行.

  7. 可以在init函数中对变量初始化.

3: