<p align="right">2021年08月31日 13:54:49</p>
[TOC]
# 下劃線
`_`是特殊標識符,用來忽略結果
## 下劃線在import中
在Golang里,iimport的作用是導入其他package
> mport 下劃線(如:`import hello/imp`)的作用:當導入一個包時,該包下的文件里所有init()函數都會被執行,然而,有些時候我們并不需要把整個包都導入進來,僅僅是是希望它執行init()函數而已。這個時候就可以使用 import*引用該包。即使用【import \_ 包路徑】只是引用該包,僅僅是為了調用init()函數,所以無法通過包名來調用包中的其他函數。
示例:
代碼結構
```
src
|
+--- main.go
|
+--- hello
|
+--- hello.go
```
main.go
```
package main
import _ "./hello"
func main() {
// hello.Print()
//編譯報錯:./main.go:6:5: undefined: hello
}
```
hello.go
```
package hello
import "fmt"
func init() {
fmt.Println("imp-init() come here.")
}
func Print() {
fmt.Println("Hello!")
}
```
輸出結果:
```
imp-init() come here.
```
## 下劃線在代碼中
```
package main
import (
"os"
)
func main() {
buf := make([]byte, 1024)
f, _ := os.Open("/Users/***/Desktop/text.txt")
defer f.Close()
for {
n, _ := f.Read(buf)
if n == 0 {
break
}
os.Stdout.Write(buf[:n])
}
}
```
解釋1
```
下劃線意思是忽略這個變量.
比如os.Open,返回值為*os.File,error
普通寫法是f,err := os.Open("xxxxxxx")
如果此時不需要知道返回的錯誤值
就可以用f, _ := os.Open("xxxxxx")
如此則忽略了error變量
```
解釋2
```
占位符,意思是那個位置本應賦給某個值,但是咱們不需要這個值。
所以就把該值賦給下劃線,意思是丟掉不要。
這樣編譯器可以更好的優化,任何類型的單個值都可以丟給下劃線。
這種情況是占位用的,方法返回兩個結果,而你只想要一個結果。
那另一個就用 "_" 占位,而如果用變量的話,不使用,編譯器是會報錯的。
```
實例
```
import "database/sql"
import _ "github.com/go-sql-driver/mysql"
// 第二個import就是不直接使用mysql包,只是執行一下這個包的init函數,把mysql的驅動注冊到sql包里
// 然后程序里就可以使用sql包來訪問mysql數據庫了
```