包与模块
Go 用包(package) 组织代码,模块(module) 管理依赖。
1. package 声明
每个 .go 文件首行必须是 package 名称。同一目录下的文件属于同一个包。
// 文件:mathutil/calc.go
package mathutil
func Add(a, b int) int { return a + b } // 可导出
func mul(a, b int) int { return a * b } // 私有(小写)💡大小写决定可见性
- 大写字母开头:导出(其他包可访问)
- 小写字母开头:未导出(包内私有)
2. import 路径
import (
"fmt" // 标准库
"github.com/gin-gonic/gin" // 第三方
"myproj/internal/utils" // 内部包
)3. go.mod 与 module
模块由 go.mod 文件标识:
module example.com/mylearn
go 1.22
require (
github.com/google/uuid v1.6.0
)常用命令:
go mod init example.com/mylearn # 初始化
go mod tidy # 整理依赖
go get pkg@version # 添加依赖
go mod download # 下载依赖4. 常用标准库速览
4.1 strings
package main
import (
"fmt"
"strings"
)
func main() {
s := "Hello, World!"
fmt.Println(strings.ToUpper(s))
fmt.Println(strings.Contains(s, "World"))
fmt.Println(strings.Split("a,b,c", ","))
fmt.Println(strings.Replace(s, "World", "Go", 1))
fmt.Println(strings.TrimSpace(" hi "))
fmt.Println(strings.HasPrefix(s, "Hello"))
}4.2 math/rand
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
for i := 0; i < 5; i++ {
fmt.Println(rand.Intn(100))
}
}4.3 time
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05"))
fmt.Println(now.Unix())
// 1 天后
tomorrow := now.Add(24 * time.Hour)
fmt.Println("明天:", tomorrow.Format("2006-01-02"))
}ℹ️2006-01-02 15:04:05 是 Go 的 reference time
这是 Go 独特的格式占位符(必须是这个时间点),不是随意数字。容易记错,建议保存为模板。
5. 实战:随机密码生成器
package main
import (
"fmt"
"math/rand"
"time"
)
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%"
func genPassword(length int) string {
b := make([]byte, length)
for i := range b {
b[i] = charset[rand.Intn(len(charset))]
}
return string(b)
}
func main() {
rand.Seed(time.Now().UnixNano())
for i := 0; i < 3; i++ {
fmt.Println(genPassword(12))
}
}🎯 练习
// 任务:写一个 reverse 函数,把字符串反转(不忽略中文)
// 期望:reverse("Hello, 世界") = "界世 ,olleH"
package main
import "fmt"
func reverse(s string) string {
// 提示:把 string 转 []rune 即可按码点反转
return ""
}
func main() {
fmt.Println(reverse("Hello, 世界"))
}小结
- ✅ 每个文件首行
package 名称 - ✅ 大写字母开头导出,小写私有
- ✅
go.mod定义模块 - ✅ 常用标准库:
strings/math/rand/time - ✅ 时间格式必须是
2006-01-02 15:04:05
下一章 错误处理:error 接口与 panic/recover。