在Golang项目里,自定义包是组织代码的基本单元。通过把功能相关的函数、结构体放到同一个包中,可以实现模块化并方便地在多个地方复用。下面直接说明如何从零创建一个自定义包并在主程序中调用。

一、规划目录结构
假设我们要做一个字符串处理工具包,项目结构可以如下:
myproject/
├── go.mod
├── main.go
└── strutil/
└── strutil.go
其中 go.mod 定义了模块名,strutil 就是我们的自定义包目录。
二、编写自定义包
在 strutil/strutil.go 中,使用 package 声明包名,并以大写字母开头定义需要导出的函数:
package strutil
import "strings"
// Reverse 将输入字符串反转
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
// IsEmpty 判断字符串是否为空或纯空格
func IsEmpty(s string) bool {
return strings.TrimSpace(s) == ""
}
注意:只有首字母大写的标识符才能被其他包导入使用,这是Go语言的导出规则。
三、初始化模块并引用包
在 myproject 根目录执行命令初始化模块:
go mod init myproject
然后在 main.go 中导入并使用 strutil 包:
package main
import (
"fmt"
"myproject/strutil"
)
func main() {
text := "hello golang"
fmt.Println(strutil.Reverse(text))
fmt.Println(strutil.IsEmpty(" "))
}
四、运行与复用
执行 go run main.go 就能看到输出结果。如果其他项目也需要这些字符串工具,只需把 strutil 目录复制过去并在 go.mod 中配置好模块路径,或直接发布为私有模块引用,便完成了模块化代码复用。
常见注意点
- 包名通常与目录名一致,但不强制。
- 同一个目录下的所有 go 文件必须属于同一个 package。
- 循环导入会造成编译错误,设计包依赖时需避免。
合理使用自定义包,不仅能减少重复代码,还能让单元测试更聚焦,提升整体工程质量。