1.下劃線在import中
在Golang裏,import的作用是導入其他package,但是今天在看beego框架時看到了import 下劃線,不知其意,故百度而解之。
import 下劃線(如:import _ hello/imp)的作用:當導入一個包時,該包下的文件裏所有init()函數都會被執行,然而,有些時候我們並不需要把整個包都導入進來,僅僅是是希望它執行init()函數而已。這個時候就可以使用 import _ 引用該包。即使用【import _ 包路徑】只是引用該包,僅僅是爲了調用init()函數,所以無法通過包名來調用包中的其他函數。
示例:
代碼結構
main.go
package main
import _ "hello/imp"
func main() {
//imp.Print() //編譯報錯,說:undefined: imp
}
init.go
package imp
import "fmt"
func init() {
fmt.Println("imp-init() come here.")
}
func Print() {
fmt.Println("Hello!")
}
輸出結果:
imp-init() come here.
2.下劃線在代碼中
package main
import (
"os"
)
func main() {
buf := make([]byte, 1024)
f, _ := os.Open("/Users/samchen/Music/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數據庫了。