🌞

Golang系列教程--基础概念

📜本文内容


👽包的概念package

  • 每个go文件仅属于一个包,一个包可以多个go文件
  • 所有包名为小写字母
  • 包编译完为pack1.a,包的依赖关系决定程序构建顺序,包为编译单元,每个目录只包含一个包
  • 包内文件或重新编译有修改,引用该包的其他程序也要重新编译
  • 包名也可作为命名空间使用,eg:pack1.Id, pack2.Id
  • 包名自命名,eg:import fm "fmt" fm.Println("hello")
  • 导入未使用的包时会报错,导入包的语句后可以定义全局变量,在本包内都可访问
  • 包编译完为pack1.a

👽Go程序的结构

  1. import包
  2. 声明常量、全局变量、类型定义
  3. init()若含有,则包首先执行init()且只执行一次,任何文件可以包含任意多个init(),按照声明的顺序执行

    1
    
    func init() { /*........*/ }
  4. 若是main包,此处写main函数

  5. 其他函数

👽Go的执行

  1. 按顺序导入所有被main包引用的包,每个包执行以下流程:
    • 若该包又引入了其他包,从1继续,但每个包只能导入一次
    • 相反的顺序初始化变量、常量,有init()执行init()
  2. 回到main执行一样的初始化和init()过程

👽可见性规则

  • 类似java中的public、private关键字
  • 标识符以大写字母开头,外部包即可访问,eg:struct Person{},Person对象即可被外部包访问(导出/public)
  • 以小写字母,即private,仅包内可见可用
  • 在导入一个外部包后,只能够访问该包中导出的对象

👽Go的编译过程

  • run: compile and run Go program
    • go run执行完后生成归档文件和可执行文件
    • go run -a强制编译所有代码
  • build: compile packages and dependencies
    • go build在目录中执行,将产生与目录同名的可执行文件
    • 若编译库源码文件,build完不产生任何结果,build只检查库源码文件的有效性,不输出任何文件
    • go build 后不接路径则默认编译的包的路径为当前目录
    • -o 指定输出名称
    • 过程与go run相似,但最后会将生成的可执行文件移动(不是复制,go run产生的exe不存在了)到目录下
  • install: download and install packages and dependencies
    • 编译并安装指定的代码包、依赖包
    • go install将build命令生成的可执行文件移动到GOPATH/bin下
    • 过程与go build类似,但最后安装编译后的结果文件到指定目录
    • 命令后可接路径
    • 不支持对库源码文件的安装
  • get: download and install packages and dependencies
    • go get从远程仓库下载
    • -d只做下载操作不安装
updatedupdated2019-12-162019-12-16