GO的下划线
下划线“_”
import中的下划线
// demo01.go
package main
import _ "fmt"
func main() {
fmt.Println("Println......")
}
此时直接go build demo01.go
会出现编译错误
anson@dengrongsendeMacBook-Pro golangdemo % go build demo01.go
# command-line-arguments
./demo01.go:6:5: undefined: fmt
anson@dengrongsendeMacBook-Pro golangdemo %
这是因为import _ "{包名}"
并没有导入{包名}下的所有函数,因此无法通过fmt.Println("Println......")
来调用fmt包下的Println()函数。
所以
import _ "{包名}"
:并没有导入{包名}下的函数,而是仅仅由go自动执行了该包下的init函数,用于初始化该包的变量。
init函数和main函数都是go自动调用的
init函数可以存在于任何包下,而main函数只能存在于main包下
代码中的下划线
// demo02.go
package main
import "os"
func main() {
buf := make([]byte,1024)
f,_ := os.Open("/Users/anson/Pictures/pap.er/lK28145Vh_E.jpg")
// defer f.close()
for {
n,_ := f.Read(buf)
if n == 0 {
break
}
os.Stdout.Write(buf[:n])
}
}
其中os.Open("xxx")
,返回的是*os.File指针和error,如果获取了err,既 f,err := …,那么会出现编译错误,go不允许出现未使用的变量。因此代码中的下划线充当占位符的作用。它的作用我认为是为了适配go的函数多返回的特性。
总结
下划线在import中的作用是:不导入包的函数,而仅仅由go自动调用该包下的init函数来初始化包变量;
下划线在代码中的作用是:充当占位符,不处理函数返回的某个值。
仅个人愚见,望指正