Golang教程:(七)包
原文:https://golangbot.com/packages/ 这是本Golang系列教程的第七篇。 什么是包?为什么使用包?到目前为止我们见到的 Go 程序都只有一个文件,文件中包含了一个main函数和几个其他函数。在实际中这种将所有代码都放在一个文件里的组织方式是不可行的。这样的组织方式使得代码变得无法重用和维护困难。包(package)用于解决这样的问题。 包用于组织Go源代码,以获得更好的重用性和可读性。包提供了代码封装的机制从而使得Go应用程序易于维护。例如,假设我们正在开发一个图像处理应用,它提供了诸如图像裁剪,锐化,模糊和增色等功能。一种组织代码的方式是将所有实现同一功能的代码放在一个独立的包中。例如裁剪功能可以放在一个单独包中,而锐化功能可以放在另一个包中。这种做法的优点是:增色功能可能需要做一些锐化的处理,那么增色代码中可以简单地导入(我们即将讨论导入)锐化包,使用其中提供的功能即可。这种方式使得代码变得更容易重用。 我们将逐步创建一个计算矩形面积和对角线的应用程序。 通过构建该程序,我们将更好的理解包。 main函数与main包每个可执行的Go程序都必须包含一个 指定一个特定源文件属于一个包的语法为: 下面让我们开始创建 编写 //geometry.go
package main
import "fmt"
func main() {
fmt.Println("Geometrical shape properties")
}
执行 src/
geometry/
geometry.go
bin/
geometry
执行 Geometrical shape properties
创建自定义包下面我们将创建一个 属于同一个包的源文件应该放在独立的文件夹中,按照Go的惯例,该文件夹的名字应该与包名相同。 因此让我们在 在 //rectprops.go
package rectangle
import "math"
func Area(len,wid float64) float64 {
area := len * wid
return area
}
func Diagonal(len,wid float64) float64 {
diagonal := math.Sqrt((len * len) + (wid * wid))
return diagonal
}
在上面的代码中我们实现了两个函数 注意上面实现的两个函数的函数名 导入自定义包为了使用自定义包我们必须先导入它。用来导入自定义包的语法为: src/
geometry/
geometry.go
rectangle/
rectangle.go
语句 在 //geometry.go
package main
import (
"fmt"
"geometry/rectangle" //importing custom package
)
func main() {
var rectLen,rectWidth float64 = 6, 7
fmt.Println("Geometrical shape properties")
/*Area function of rectangle package used */
fmt.Printf("area of rectangle %.2fn",rectangle.Area(rectLen,rectWidth))
/*Diagonal function of rectangle package used */
fmt.Printf("diagonal of the rectangle %.2f ",rectangle.Diagonal(rectLen,rectWidth))
}
上面的代码导入了 Geometrical shape properties
area of rectangle 42.00
diagonal of the rectangle 9.22
导出名字我们将 如果将 init 函数每一个包都可以包含一个 func init() {
}
一个包的初始化顺序如下:
如果一个包导入了另一个包,被导入的包先初始化。 尽管一个包可能被包含多次,但是它只被初始化一次。 下面让我们对我们的程序做一些修改来理解 首先在 //rectprops.go
package rectangle
import "math"
import "fmt"
/* * init function added */
func init() {
fmt.Println("rectangle package initialized")
}
func Area(len,wid float64) float64 {
diagonal := math.Sqrt((len * len) + (wid * wid))
return diagonal
}
我们添加了一个简单的 现在我们来修改 修改 //geometry.go
package main
import (
"fmt"
"geometry/rectangle" //importing custom package
"log"
)
/* * 1. package variables */
var rectLen, 7
/* *2. init function to check if length and width are greater than zero */
func init() {
println("main package initialized")
if rectLen < 0 {
log.Fatal("length is less than zero")
}
if rectWidth < 0 {
log.Fatal("width is less than zero")
}
}
func main() {
fmt.Println("Geometrical shape properties")
fmt.Printf("area of rectangle %.2fn",rectWidth))
fmt.Printf("diagonal of the rectangle %.2f ",rectWidth))
}
我们对
运行该程序,输出如下: rectangle package initialized
main package initialized
Geometrical shape properties
area of rectangle 42.00
diagonal of the rectangle 9.22
正如预期的那样, 让我们再次修改程序来学习 将 现在运行程序,得到如下结果: rectangle package initialized
main package initialized
2017/04/04 00:28:20 length is less than zero
像上面一样, 代码可以在 github 上下载。 使用空指示符在 Go 中只导入包却不在代码中使用它是非法的。如果你这么做了,编译器会报错。这样做的原因是为了避免引入过多未使用的包而导致编译时间的显著增加。将 //geometry.go
package main
import (
"geometry/rectangle" //importing custom package
)
func main() {
}
上面的程序将会报错: 但是在开发过程中,导入包却不立即使用它是很常见的。可以用空指示符( 下面的代码可以避免抛出上面的错误: package main
import (
"geometry/rectangle"
)
var _ = rectangle.Area //error silencer
func main() {
}
有时我们导入一个包只是为了确保该包初始化的发生,而我们不需要使用包中的任何函数或变量。例如,我们也许需要确保 package main
import (
_ "geometry/rectangle"
)
func main() {
}
运行上面的程序,将会得到输出: 包的介绍到此结束。感谢阅读。 目录 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |