跳到主要内容

go-包

  • Go 的 包(package) 可以理解成:用来组织代码、隔离命名空间、实现代码复用的一种机制
  • 每个 Go 文件都必须声明 package xxx
  • 同一个目录下的 Go 文件通常属于同一个 package
  • 调用其他包内容:包名.xxx
  • 大写开头可以跨 package 使用,小写只能包内部使用
  • 包路径 = go.mod 的 module + 目录路径

导入包​

  • Go 使用 import 导入包
  • Go 里导入多个包,推荐使用括号
go
// 推荐写法,通过括号导入多个包
import (
"fmt"
"strings"
"time"
)

// 分开写导入包
import "fmt"
import "strings"

第三方包​

  • 只需在代码中导入 Gin,Go 会在构建时自动获取它
  • 也可以通过go mod tidy 来检查依赖获取
go
import "github.com/gin-gonic/gin"

导入其他目录包​

  • 导入路径:模块路径 + 包目录相对路径
  • 跨包访问其他包,大写开头才可以访问
    • 首字母的大写的函数或者变量可以给其他包调用
go
import "ai-go-demo/internal/service"

import 的几种特殊写法​

  • 普通导入
  • 别名导入
  • _ 空白导入、表示不使用包里面的函数
    • 导入这个包,但是不直接使用它的函数或变量,只执行包的初始化逻辑
go
// 普通导入
import "fmt"
fmt.Println()

// 别名导入
import f "fmt"
f.Println()

// 空白导入
import _ "github.com/go-sql-driver/mysql"

package main​

  • 表示这个 package 是一个可执行程序入口包
  • 用于Go 程序的入口函数

包规则​

  • 每个 .go 文件必须声明 package
  • 同一个目录下,通常属于同一个 package
    • Go 的包基本是以目录为单位组织的。
    • 如下这3个文件,都需要声明package user
go
user/
├── user.go
├── service.go
└── repository.go
  • 跨包访问时,大写开头才可以访问
    • 首字母的大写的函数或者变量可以给其他包调用
    • 首字母小写的,只能在内部包访问
go
package user

var Name = "Tom"
var age = 18

func GetUser() {}
func getUser() {}
  • 在其他包里
go
package main

import "myapp/user"

func main() {
println(user.Name) // ✅ 可以
println(user.age) // ❌ 不可以

user.GetUser() // ✅ 可以
user.getUser() // ❌ 不可以
}