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  
描述