目录

    最近,我准备学习一门新的编程语言。之前写过一篇博文: 如何学习一门新的编程语言 - 以 Python 为例 ,按照这种学习思路,我们一起来学 Go。

    1. Go 的数据结构

    基础类型

    • 布尔类型:bool
    • 整型:byte、int、int8、int16、uint、uintptr
    • 浮点类型:float32、float64
    • 复数类型:complex64、complex128
    • 字符串:string
    • 字符类型:rune
    • 错误类型:error

    复合类型

    • 指针:pointer
    • 数组:array
    • 切片:slice
    • 字典:map
    • 通道:chan
    • 结构体:struct
    • 接口:interface

    Go 变量标识由字母、数字、下划线组成,其中首字母不能为数字。声明变量时,类型放在变量标识后面。一般形式为:

    // 单个变量
    var identifier type
    
    // 多个变量
    var identifier1, identifier2 type
    

    声明变量时,如果没有初始化,则默认为零值。对于有初始值的变量声明,可以省略类型,因为 Go 能推导出类型。

    var i int = 0
    var i = 0
    // 还可以省略 var 关键字,使用 := 语法糖声明变量
    i := 0
    

    2. Go 的逻辑结构

    • 循环结构 for
    for i := 0; i < 10; i++ {
        sum += i
    }
    
    sum := 0
    for sum < 1000 {
        sum += sum
    }
    
    • 条件分支 if、switch
    if x < 0 {
        return -x
    } else {
        return x
    }
    
    switch t := i.(type) {
    case bool:
        return "I'm a bool"
    case int:
        return "I'm an int"
    default:
        return "Don't know type %T", t
    }
    
    • 跳转 goto

    goto 可以无条件跳转到指定的标签

    if error {
      goto doError
    }
    // 发生错误时,跳过的代码块
    doError:
    // 发生错误时,立即执行的代码块
    
    • 推迟 defer

    defer 语句会被压入栈中,当外层函数返回之后,依次出栈执行。

    func main() {
        defer second_run()
        first_run()
    }
    

    3. Go 的模块定义

    3.1 函数

    Go 语言函数定义格式:

    func function_name( [parameter list] ) [return_types] {
        // 函数体
    }
    
    • func,函数声明关键字
    • function_name,函数名称,与参数列表一起构成了函数签名
    • parameter list,参数列表
    • return_types,返回类型

    举个例子:

    func max(num1, num2 int) int {
        if (num1 > num2) {
          return num1
        } else {
          return num2
        }
    }
    

    Go 函数还可以返回多个值:

    func addAndMult(a int, b int) (int, int){
        return a + b, a * b
    }
    

    除此,Go 中还可以声明匿名函数,直接赋值给变量:

    my_func_name := func() {
        // 函数体
    }
    

    3.2 包(package)

    Go 使用 package 来管理代码,这种方式与 Python 类似。package 是一个或多个 Go 源码文件的集合。Go 语言内置了很多 package,例如 fmt、os、io 等。

    声明包时,在文件第一行添加如下标识:

    package package_name
    

    引用时,在文件头部添加如下标识

    import "path/package_name"
    

    package 的特性:

    • 一个目录下的同级文件属于一个 package
    • 包名与目录名可以不同,但是通常会保持一致
    • 程序的入口是 main 包的 main 函数,如果没有 main 包,则不会生成可执行文件
    • 仅首字母大写的标识符,包外可以访问