作用:利用包的副作用,即执行包内的init函数,但是不直接使用该包导出的任何变量或函数

常见使用场景:

  • 数据库注册驱动
1
2
3
4
5
6
7
8
9
10
11
12
13
    package main

import (
"database/sql"
"fmt"
// 匿名导入 MySQL 驱动
// 我们代码里不需要直接写 mysql.Connect,所以用
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 这里可以直接使用 mysql 驱动,因为上面的匿名导入已经把它注册进去了
db, err := sql.Open("mysql", "user:password@/dbname")
}

原理:在包内部有一个init函数,这个内部init执行,data/sql就知道如何处理“mysql”类型的连接了

如果想换数据库,只需要改动import路径

  • 图片格式解码:如果需要读取PNG,JEPG图片,需要匿名导入包
1
2
3
4
5
6
7
8
9
10
import (
"image"
_ "image/png" // 注册 PNG 解码器
_ "image/jpeg" // 注册 JPEG 解码器
"os"
)
func main() {
f, _ := os.Open("avatar.png")
img, _, _ := image.Decode(f)
}
  • HTTP性能分析
    当需要分析Go程序性能时,只需要匿名导入net/http/pprof,它就会自动注册HTTP路由