2.1.3 空白标识符

在Go语言中还定义了一些特殊标识符,在安装目录doc文件夹的go_spec.html文件中能找到相应说明,如图2-3所示。

图2-3 预定义标识符

官方文档将标识符分为4种类型,分别是空白标识符(Blank identifier)、预声明标识符(Pre declared identifiers)、导出标识符(Exported identifiers)和唯一标识符(Uniqueness of identifiers)。

空白标识符仅由下划线(_)表示,作为匿名占位符,因为Go语言定义变量且不被使用的时候,程序会提示异常,对于不被使用且存在的变量,可以使用空白标识符表示,并且能减少内存空间开支,一般用于3种场合,具体说明如下:

1)导入某个包,只执行包的初始化函数init(),不调用包的任何变量或函数,使用import _ XXX可以避免编译错误。

2)函数设有多个返回值,但程序中只使用一个返回值,不被使用的返回值可以使用空白标识符表示。

3)类型断言,判断某个类型是否实现了接口,否则编译出错。

根据上述3种应用场合,在chapter2.1.3.go文件中分别使用代码加以说明,代码如下:

    package main
    // 场合一
    // 只使用net/http/pprof的初始化函数init()
    import (
        "fmt"
        _ "net/http/pprof"
    )
    
    func myfunc() (int, string){
        // 自定义函数,设置两个返回值
        a := 10
        b := "golang"
        return a, b
    }
    
    type Foo interface {
        // 定义接口
        Say()
    }
    type Dog struct {
        // 定义结构体
        name string
    }
    func (d Dog) Say() {
        // 结构体实现接口Foo的使用
        fmt.Println(d.name + " say hi")
    }
    
    func main(){
        // 场合二
        // 调用函数myfunc()并只获取第一个返回值
        a, _ := myfunc()
        fmt.Printf("只获取函数myfunc的第一个返回值%d:\n", a)
    
        // 场合三
        // 判断结构体Dog是否实现接口Foo的使用
        // 等同于判定有没有定义func (d Dog) Say(){}
        // 用作类型断言,如果Dog没有实现Foo,则会报编译错误
        var _ Foo = Dog{"black dog"}
    }