包基础 #

一、包概述 #

Go程序由包组成,每个Go文件都属于一个包。

二、包定义 #

2.1 包声明 #

go
package main
package utils
package models

2.2 包命名规范 #

  • 小写字母
  • 简短、有意义
  • 不使用下划线
go
package httputil
package json
package sql

2.3 目录结构 #

text
myapp/
├── main.go          (package main)
├── utils/
│   └── helper.go    (package utils)
└── models/
    └── user.go      (package models)

三、包导入 #

3.1 基本导入 #

go
import "fmt"
import "os"

// 或批量导入
import (
    "fmt"
    "os"
)

3.2 别名导入 #

go
import f "fmt"

f.Println("Hello")

3.3 匿名导入 #

go
import _ "github.com/lib/pq"  // 执行init函数

3.4 点导入 #

go
import . "fmt"

Println("Hello")  // 不需要前缀

四、可见性规则 #

4.1 导出标识符 #

首字母大写的标识符可导出:

go
package utils

var PublicVar int        // 导出
var privateVar int       // 未导出

func PublicFunc() {}     // 导出
func privateFunc() {}    // 未导出

type PublicType struct { // 导出
    PublicField  int     // 导出
    privateField int     // 未导出
}

4.2 访问规则 #

go
package main

import "myapp/utils"

func main() {
    utils.PublicVar = 1      // 正确
    utils.PublicFunc()        // 正确
    // utils.privateVar = 1  // 错误:未导出
}

五、包初始化 #

5.1 init函数 #

go
package utils

func init() {
    fmt.Println("utils initialized")
}

5.2 初始化顺序 #

  1. 包级变量初始化
  2. init函数执行
  3. main函数执行
go
package main

var a = initA()

func initA() int {
    fmt.Println("init a")
    return 1
}

func init() {
    fmt.Println("init")
}

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

// 输出:
// init a
// init
// main

5.3 多个init #

go
package main

func init() {
    fmt.Println("init 1")
}

func init() {
    fmt.Println("init 2")
}

六、包组织 #

6.1 标准库包 #

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

6.2 第三方包 #

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

6.3 内部包 #

go
import "myapp/internal/database"

七、实际应用 #

7.1 工具包 #

go
package utils

import "strings"

func TrimSpace(s string) string {
    return strings.TrimSpace(s)
}

func Contains(s, substr string) bool {
    return strings.Contains(s, substr)
}

7.2 模型包 #

go
package models

type User struct {
    ID    int
    Name  string
    Email string
}

func NewUser(name, email string) *User {
    return &User{
        Name:  name,
        Email: email,
    }
}

7.3 配置包 #

go
package config

var (
    Host     string
    Port     int
    Database string
)

func init() {
    Host = "localhost"
    Port = 8080
    Database = "mydb"
}

八、最佳实践 #

8.1 包命名 #

go
// 好
package httputil
package json

// 不好
package httpUtil
package json_utils

8.2 包组织 #

text
myapp/
├── cmd/           # 可执行程序
│   └── myapp/
│       └── main.go
├── internal/      # 私有代码
│   └── service/
├── pkg/           # 公开代码
│   └── utils/
└── go.mod

8.3 循环导入 #

避免循环导入:

go
// 错误:A导入B,B导入A
package a
import "myapp/b"

package b
import "myapp/a"

九、总结 #

包基础要点:

特性 说明
包声明 package关键字
导入 import关键字
可见性 首字母大小写
init 初始化函数

关键点:

  1. 包声明:每个文件必须声明所属包
  2. 可见性:首字母大写导出,小写私有
  3. init函数:包初始化时自动执行
  4. 导入方式:标准导入、别名、匿名、点导入
  5. 循环导入:避免循环导入

准备好学习Go Modules了吗?让我们进入下一章!

最后更新:2026-03-26