Golang package 关键字
最后修改于 2025 年 5 月 7 日
本教程讲解如何在 Go 中使用 package
关键字。我们将通过组织 Go 代码的实际示例来涵盖 package 的基础知识。
package
声明在 Go 中定义了代码模块的命名空间。每个 Go 文件都必须以 package 声明开头。它将相关功能分组。
在 Go 中,packages 是代码组织和重用的主要机制。它们实现了模块化编程并控制包外部标识符的可见性。
基本 package 声明
最简单的 package 声明创建一个可执行程序。main
package 在 Go 中是特殊的,因为它定义了一个可执行文件。
package main import "fmt" func main() { fmt.Println("Hello from main package") }
这是可执行 Go 程序的最小 package 声明。当 package 被编译时,main
函数是入口点。
创建 library package
Library packages 提供可重用的功能。此示例展示了一个简单的数学实用程序包。
package mathutil // Add returns the sum of two integers func Add(a, b int) int { return a + b } // Subtract returns the difference of two integers func Subtract(a, b int) int { return a - b }
package 名称 mathutil
成为导入路径标识符。导出的函数以大写字母开头,使它们可以公开访问。
导入和使用 packages
此示例演示了如何从另一个文件导入和使用我们自定义的 mathutil
package。
package main import ( "fmt" "./mathutil" ) func main() { sum := mathutil.Add(5, 3) diff := mathutil.Subtract(5, 3) fmt.Printf("Sum: %d, Difference: %d\n", sum, diff) }
import
语句加载 mathutil
package。我们使用 package 名称作为前缀来访问其函数。./
表示本地 package。
Package 初始化
Packages 可以使用 init
函数具有初始化逻辑。此示例展示了 package 级别的变量和初始化。
package config import "fmt" var AppName string var Version string func init() { AppName = "MyApp" Version = "1.0.0" fmt.Println("Config package initialized") }
package main import ( "fmt" "./config" ) func main() { fmt.Printf("%s v%s\n", config.AppName, config.Version) }
当 package 被导入时,init
函数会自动运行。package 中的多个 init
函数按声明顺序执行。
嵌套 package 结构
Go 支持嵌套 package 结构以实现更好的组织。此示例展示了一个嵌套的 package 层级。
package stringutil // Reverse returns its argument string reversed func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r) }
package main import ( "fmt" "mylib/stringutil" ) func main() { fmt.Println(stringutil.Reverse("Hello, world!")) }
使用完整路径导入嵌套的 stringutil
package。Go 工具在模块系统中自动处理嵌套 package。
内部 packages
Go 的内部 packages 将可见性限制在特定的父 packages。此示例演示了内部 package 机制。
package internal // SecretKey is only visible to mylib and its subpackages var SecretKey = "very-secret-key" // GetKey returns the secret key func GetKey() string { return SecretKey }
package auth import "mylib/internal" func Authenticate() string { return internal.GetKey() }
internal
package 只能被 mylib
目录树内的 packages 导入。这为内部实现细节提供了封装。
Package 文档
Go packages 支持内置文档。此示例展示了正确的 package 文档实践。
// Package greeting provides functions for creating greetings. // It demonstrates proper Go documentation conventions. package greeting import "fmt" // Greet returns a personalized greeting func Greet(name string) string { return fmt.Sprintf("Hello, %s!", name) } // GreetTime returns a greeting with current time func GreetTime(name string, hour int) string { var timeOfDay string switch { case hour < 12: timeOfDay = "morning" case hour < 18: timeOfDay = "afternoon" default: timeOfDay = "evening" } return fmt.Sprintf("Good %s, %s!", timeOfDay, name) }
package 注释出现在 package 声明的正上方。函数注释以函数名开头。这些会出现在生成的文档中。
来源
本教程通过代码组织和模块化开发的实际示例,讲解了 Go 中的 package
关键字。