说明

零值或零初始化很容易实现。来自像 Java 这样的语言可能看起来很复杂,某些值可能是 nil 而其他值则不是。总结零值:Go 编程语言规范

指针,函数,接口,切片,通道和贴图是唯一可以为零的类型。其余的根据各自的类型初始化为 false,zero 或空字符串。

如果检查某些条件的函数可能会出现问题:

func isAlive() bool {
    //Not implemented yet
    return false
}

即使在实现之前,零值也将为 false。依赖于此函数返回的单元测试可能会产生误报/否定。

一个典型的解决方法是返回一个错误,这在 Go 中是惯用的:

package main

import "fmt"

func isAlive() (bool, error) {
    //Not implemented yet
    return false, fmt.Errorf("Not implemented yet")
}

func main() {
    _, err := isAlive()
    if err != nil {
        fmt.Printf("ERR: %s\n", err.Error())
    }
    
}

在操场上玩

当返回结构和错误时,你需要一个用户返回的结构,这不是很优雅。有两种反选择:

  • 使用接口:通过返回接口返回 nil。
  • 使用指针:指针可以nil

例如,以下代码返回一个指针:

func(d *DB) GetUser(id uint64) (*User, error) {
    //Some error ocurred
    return nil, err
}