go中,甚至最直接的程序都会包的一部分。通常情况下默认包是main包,目前为止一直使用的包。如果程序是main包的一部分,go会生成二进制文件,运行该文件时,他将调用main()函数
当使用main包时,程序将生成独立的可执行文件,但当程序非是main包的一部分是,go不会生成二进制文件,它生成包存档文件.a文件
go中,包名称需遵循约定,包使用其导入路径的最后一部分作为名称,go标准库包含math/cmplx包,
import "math/cmplx"
cmplx.Inf()
1.14之后的版本已经没有了go root /go path的概念了,go mod 就行。现在你的项目路径
go mod init dir 就行了,如果不go mod init ,import包的时候就认不到包
你现在可以开始编写包的函数和变量,不同于其他编程语言,go不会提供共有私有关键字,以指示是否外部调用。
package cal
var logMessage = "[LOG]"
var Version = "1.0"
func internalSum(number int) int {
return number - 1
}
func Sum(number1, number2 int) int {
return number1 + number2
}
上行代码因为没有main函数,go build 后不会生产.exe
让我们看一下该代码中的一些事项,只能从包调用logMessage 变量。可以从任何位置访问Version变量。包内调用internalSum函数,可以从任何位置访问Sum函数。
现在将包放到模块中,go mod 通常包含可提供相关功能的包,包的模块还指定了go运行你组合在一起的代码所需的上下文。go mod有助于其他研发人员引用代码的特定版本,并更轻松的处理依赖项,另一个优点是,我们的程序源代码无序严格存在放gopath/src目录中。
运行此命令后,就会变成mod的名称,其他程序中,将使用该名称进行引用,命令还会创建一个名为go.mod的新文件。
../helloworld/main.go
package main
import (
"fmt"
"gocodeing/gotest/cal"
)
func main() {
total := cal.Sum(3, 5)
fmt.Println(total)
fmt.Println("Version:", cal.Version)
}
go mod init helloworld
replace 关键字指定使用本地目录,而不是模块的远程位置。这种情况下,由于helloworld和cal程序在同一父文件夹中,因此../cal