包导入 #

一、导入语法 #

1.1 单行导入 #

go
import "fmt"
import "os"

1.2 批量导入 #

go
import (
    "fmt"
    "os"
    "net/http"
)

二、导入方式 #

2.1 标准导入 #

go
import "fmt"

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

2.2 别名导入 #

go
import f "fmt"

func main() {
    f.Println("Hello")
}

使用场景:

  • 包名冲突
  • 简化长包名
go
import (
    "github.com/gin-gonic/gin"
    g "github.com/gin-gonic/gin"  // 别名
)

func main() {
    r := g.Default()
}

2.3 匿名导入 #

go
import _ "github.com/lib/pq"

只执行包的init函数,不使用包的其他功能。

常见用途:

  • 数据库驱动注册
  • 插件加载
go
import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, _ := sql.Open("mysql", "dsn")
}

2.4 点导入 #

go
import . "fmt"

func main() {
    Println("Hello")  // 不需要包名前缀
}

使用场景:

  • 测试文件
  • DSL领域特定语言
go
import . "github.com/onsi/gomega"

func TestSomething(t *testing.T) {
    Expect(1).To(Equal(1))
}

三、导入路径 #

3.1 标准库 #

go
import (
    "fmt"
    "os"
    "net/http"
    "encoding/json"
)

3.2 第三方包 #

go
import (
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

3.3 内部包 #

go
import (
    "myapp/internal/database"
    "myapp/internal/service"
)

3.4 相对路径(不推荐) #

go
import "./utils"  // 不推荐

四、远程包导入 #

4.1 自动下载 #

go
import "github.com/gin-gonic/gin"
bash
go mod tidy  # 自动下载

4.2 指定版本 #

go
import "github.com/gin-gonic/gin"
bash
go get github.com/gin-gonic/gin@v1.9.1

4.3 私有仓库 #

bash
go env -w GOPRIVATE=github.com/mycompany/*

五、导入组织 #

5.1 分组导入 #

go
import (
    // 标准库
    "fmt"
    "os"
    
    // 第三方库
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
    
    // 内部包
    "myapp/internal/database"
    "myapp/pkg/utils"
)

5.2 导入顺序 #

  1. 标准库
  2. 第三方库
  3. 内部包

5.3 工具格式化 #

bash
goimports -w main.go

六、常见问题 #

6.1 未使用的导入 #

go
import "fmt"  // 错误:imported and not used

6.2 循环导入 #

go
// package a
import "myapp/b"

// package b
import "myapp/a"  // 循环导入

解决方案:

  • 提取公共接口
  • 使用依赖注入

6.3 包名冲突 #

go
import (
    "path"           // 标准库path
    "github.com/user/path"  // 冲突
)

// 解决:使用别名
import (
    "path"
    mypath "github.com/user/path"
)

七、实际应用 #

7.1 Web应用 #

go
import (
    "net/http"
    
    "github.com/gin-gonic/gin"
    
    "myapp/internal/handler"
    "myapp/internal/middleware"
)

func main() {
    r := gin.Default()
    r.Use(middleware.Logger())
    r.GET("/", handler.Home)
    r.Run(":8080")
}

7.2 数据库应用 #

go
import (
    "database/sql"
    
    _ "github.com/go-sql-driver/mysql"
    "gorm.io/gorm"
    
    "myapp/internal/model"
)

func main() {
    db, _ := gorm.Open(mysql.Open("dsn"), &gorm.Config{})
    db.AutoMigrate(&model.User{})
}

7.3 CLI应用 #

go
import (
    "os"
    
    "github.com/spf13/cobra"
    
    "myapp/cmd"
)

func main() {
    rootCmd := &cobra.Command{Use: "myapp"}
    rootCmd.AddCommand(cmd.NewVersionCmd())
    rootCmd.Execute()
}

八、最佳实践 #

8.1 使用goimports #

bash
go install golang.org/x/tools/cmd/goimports@latest

8.2 分组导入 #

go
import (
    // 标准库
    "fmt"
    
    // 第三方
    "github.com/gin-gonic/gin"
    
    // 内部
    "myapp/internal"
)

8.3 避免点导入 #

go
// 避免
import . "fmt"

// 推荐
import "fmt"

九、总结 #

包导入要点:

方式 语法 说明
标准 import “pkg” 正常导入
别名 import x “pkg” 重命名
匿名 import _ “pkg” 只执行init
import . “pkg” 省略包名

关键点:

  1. 导入路径:标准库、第三方、内部包
  2. 导入方式:标准、别名、匿名、点导入
  3. 导入组织:分组、排序
  4. 工具支持:goimports
  5. 避免循环:合理设计包结构

准备好学习常用标准库了吗?让我们进入下一章!

最后更新:2026-03-26