undefined

Golang 中下划线的语义

1. 忽略返回值

1
v1, _ := function(...)

某个函数第二个参数不关心

2. 接口断言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type Foo interface {
Say()
}

type Dog struct {
}

func (d *Dog) Say() {
fmt.Println("hello world")
}

func main() {
var _ Foo = &Dog{}
}

如上,main 函数中中希望判断 Dog 这个 struct 是否实现了 Foo 这个 interface 。用作类型断言,如果 Dog 没有实现 Foo,则会报编译错误

3. 引入包时进行初始化

被引入包 foo 定义

1
2
3
4
5
6
7
8
9
10
11
12
package foo

import "fmt"

type Foo struct {
Id int
Name string
}
func init() {
f := &Foo{Id: 123, Name: "abc"}
fmt.Printf("init foo object: %v\n", f)
}

引入 foo 包

1
2
3
4
5
6
7
8
9
10
package main

import (
"fmt"
_ "foo"
)

func main() {
fmt.Println("main world")
}

最终会打印:

1
2
init foo object: &{123 abc}
main world

结论:如果定义 import _ "foo" 这个语义表示在执行本段代码之前会先调用 foo 包中的初始化函数(init)。这种方式仅让导入的包做初始化,而不使用包中其他功能。