\ 当我开始学习 Go 时,我首先想到的问题之一是:
"我该如何实际组织我的代码?"
在像 C 这样的语言中,通常会将所有内容放入单个文件中,或者将头文件和实现文件分开。但在 Go 中,项目结构非常重要:它影响着你扩展、测试和共享代码的难易程度。在本文中,我将介绍为什么结构很重要,如何从不同文件访问函数,以及我在前进过程中学到的最佳实践。
一个 Go 程序可以完全存在于单个文件中:
package main import "fmt" func main() { fmt.Println("2 + 2 =", 2+2) }
这对于"hello world"或快速实验来说很好。
但一旦你添加更多功能(减法、乘法、除法...),文件就会变得混乱且几乎无法扩展。
这就是 Go 的包和文件夹发挥作用的地方。
在 Go 中,每个文件都属于一个包。
按照惯例:
以下是我如何拆分计算器项目:
calculator/ │ ├── main.go └── calculator/ └── operations.go
\
package calculator func Add(a, b int) int { return a + b } func Subtract(a, b int) int { return a - b } func Multiply(a, b int) int { return a * b } func Divide(a, b int) (int, error) { if b == 0 { return 0, fmt.Errorf("cannot divide by zero") } return a / b, nil }
package main import ( "fmt" "GoLang-progress/calculator" ) func main() { fmt.Println("2 + 3 =", calculator.Add(2, 3)) fmt.Println("10 - 4 =", calculator.Subtract(10, 4)) fmt.Println("6 * 7 =", calculator.Multiply(6, 7)) result, err := calculator.Divide(8, 0) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("8 / 0 =", result) } }
注意main.go 现在变得干净:它不关心数学本身,只关心如何使用它。
一个常见的初学者问题:
"我如何调用另一个文件或文件夹中的函数?"
在我的仓库中,我这样组织结构:
calculator/ │ ├── main.go └── internal/ └── calc/ └── operations.go
这里,数学函数位于 internal/calc 下。
\
package calc import "fmt" func Add(a, b int) int { return a + b } func Divide(a, b int) (int, error) { if b == 0 { return 0, fmt.Errorf("cannot divide by zero") } return a / b, nil }
\
package main import ( "fmt" "github.com/turman17/GoLang-progress/calculator/internal/calc" ) func main() { fmt.Println("2 + 3 =", calc.Add(2, 3)) result, err := calc.Divide(10, 0) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("10 / 2 =", result) } }
你的导入必须匹配 go.mod 中的模块路径加上文件夹路径。
在你的仓库中,go.mod 包含:
module github.com/turman17/GoLang-progress
你想使用的计算器代码位于文件夹:
calculator/internal/calc
所以完整的导入路径是:
github.com/turman17/GoLang-progress/calculator/internal/calc
常见错误和修复
❌ import "GoLang-progress/calculator/internal/calc"
→ 缺少 GitHub 组织/用户名。必须使用完整路径。
❌ import "github.com/turman17/GoLang-progress/internal/calc"
→ 路径中缺少 calculator 目录。
❌ go: module not found errors
→ 确保 go.mod 有 module github.com/turman17/GoLang-progress 并运行 go mod tidy。
\
go run ./calculator
或
go build ./calculator
随着项目增长,你通常会看到这种模式:
project-name/ │ ├── cmd/ → 可执行文件(主入口点) ├── internal/ → 私有代码(不供外部使用) ├── pkg/ → 可重用包 ├── api/ → API 定义(gRPC、OpenAPI 等) └── go.mod
对于初学者来说,这可能有点过头。但当你进入网络应用、服务或 MLOps 工具时,这种布局变得至关重要。
我将继续分享我在探索 Go 用于MLOps 和后端开发时学到的内容。接下来:Go 中的错误处理和测试。
\ 👉 在这里查看我的仓库:https://github.com/turman17/GoLang-progress
敬请期待下一篇文章!


