Skip to content

基本规则

Go语言-工作区和GOPATH

  • 工作区是放置Go源码文件的目录
    1. 每一个工作区的结构都类似如下所示
      1
      2
      3
      4
      5
      /home/hypermind/golib:
          src/    // 用来存放源码文件,以代码包为组织形式。
          pkg/    // 用来存放归档文件(名称以 .a 为后缀的文件)。所有归档文件都会被存放到该目录下的平台相关目录中,同样以代码包为组织形式
          bin/    // 用于存放当前工作区中的Go程序的可执行文件,当环境变量`GOBING`已有效设置是,该目录将变得没有意义。
          //  GOPATH 的值中包含多个工作区的路径时,必须设置 GOBIN,否则无法成功安装Go程序的可执行文件
      

一般情况下,Go源码文件都需要存放到工作区中。但是对于命令源码文件来说,这不是必须的

Go语言-源码文件的分类和含义

  • Go源码文件
    1. 名称以 .go 为后缀,内容为Go语言代码组织的文件。
    2. 多个 Go 代码文件是需要用代码包组织起来的。
  • 分三类
    1. 命令源码文件 (Go语言程序)
      1. 声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。
      2. 命令源码文件是 Go 程序的入口,但不建议把程序都写在一个文件中。
      3. ❗ 同一个代码包中强烈不建议直接包含多个命令源码文件。
    2. 库源码文件 (Go语言程序)
      1. 不具备命令源码文件的那两个特征的源码文件。
    3. 测试源码文件 (辅助源码文件)
      1. 不具备命令源码文件的那两个特征的源码文件。名称以 _test.go 为后缀。
      2. 其中至少有一个函数的名称以 TestBenchmark 位前缀。并且,该函数接受一个类型为 *testing.T*testing.B 的指针类型的参数
        1
        2
        3
        4
        // 功能测试函数
        func TestFind(t *testing.T) {
            // ...
        }
        
        1
        2
        3
        4
        // 基准、性能测试函数
        func BenchmarkFind(b *testing.B) {
            // ...
        }
        

Go语言 - 代码包的相关知识(上)

  • 代码包的作用
    1. 编译和归档Go程序的最基本单位。(我们可以把若干个go代码程序放在一个代码包下面,然后对这个代码包进行编译或归档。)
    2. 代码划分、集结和依赖的有效组织形式,也是权限控制的辅助手段。
  • 代码包的规则
    1. 一个代码包实际上就是一个由导入路径代表的目录
    2. 导入路径即 <工作区目录> /src 或 <工作区目录> / pkg / <平台相关目录> 之下的某段子路径
    3. 例如:代码包 hypermind.cn 可以对应于
      1. /home/hypermind/golib/src/hypermind.cn 目录(其中 /home/hypermind/golib 是一个工作区目录。)
  • 代码包的声明
    1. 每个源代码文件必须声明其所属的代码包
    2. 同一个代码包中的所有源码文件声明的代码包应该是相同的
  • 代码包声明与代码包导入路径的区别
    1. 代码包声明语句中的包名称应该是该代码包的导入路径的最右子路径,例如hypermind.cn/pkgtool -> package pkgtool
  • 代码包的导入
    1. 代码包导入语句中使用的包名称应该与其导入路径一致,例如
      // 要导入的包
      flag
      fmt
      strings
      
      // 导入写法
      import (
          "flag"
          "fmt"
          "strings"
      )
      
    2. 代码包的导入方法
      1. 带别名的导入
        1
        2
        3
        4
        // 导入写法
        // 简化调用的实体方法
        import str "strings"
        str.HasPrefix("abc", "a")
        
      2. 本地化的导入
        1
        2
        3
        import . "strings"
        // 调用方法 可以不写前缀
        HasPrefix("abc", "a")
        
      3. 仅仅初始化
        // 仅执行代码包中的初始化函数
        import _ "strings"
        

Go语言 - 代码包的相关知识(下)

  • 代码包初始化
    1. 代码包初始化函数即:无参数声明和结果声明的 init 函数
    2. init 函数可以被声明在任何文件中,且可以有多个
  • init 函数的执行时机 ---- 单一代码包内
    1. 对所有全局变量进行求值 -> 执行所有 init 函数(一个文件内有多个init 并不确定init的执行顺序)
  • init 函数的执行时机 ---- 不同代码包之间
    1. 被导入的代码包中的 init 函数 -> 执行导入它的哪个代码包的 init 函数
      1. 例如 A、B、C、三个代码包,A 导入 B,B 导入 C。执行顺序为 C -> B -> A。
      2. 注意📢:我们不应该对在同一个代码包中被导入的多个代码包的 init 函数的执行顺序做出假设!!!
  • init 函数的执行时机 ---- 所有涉及到的代码包
    1. init 执行会在main函数之前,类似构造函数,不论我们代码包导入了多少init,所有的init只会被执行一次