02 - 理解项目结构中的包的文件

一、 项目结构

1. Package

GO 语言当中的包和其他语言的库或者模块很类似,都是为了支持模块化、封装、单独编译和代码重用。
package的使用原则:

  1. 一个包的源代码在一个或者多个以.go 为后缀名的源文件当中. 例如 包 gopl/ch1/helloworld 对应的路径就是 $GOPATH/src/gopl/ch1/helloworld;
  2. 因为每一个包必须对应一个独立的空间 ( 通俗的理解,就是每一个包必须有一个独立的路径,并且那个路径下的最后的子目录就是必须包名 )
  3. 除了包的导入路径,每个包还有一个包名,包名一般是短小的名字(并不要求包名是唯一的),包名在包的声明处指定。按照惯例,一个包的名字和包的导入路径的最后一个字段相同

2. import

包的import方式

//方式一
import "pkg1"
import "pkg2"
import "pkg3"

//方式2
import (
	"pkg1"
	"pkg2"
	"pkg3"
)
  1. 如果一个main导入其他的包,包会被顺序导入;
  2. 如果导入的包(pkg1)依赖其他的包(包pkg2),会首先导入pkg2,然后初始化pkg2中的常量与变量,如果pkg2中有init函数,会自动执行init;
  3. 所有包导入完成后才会对main的常量和变量进行初始化,然后执行main中的init函数(如果有的话),最后执行main函数;
  4. 如果一个包被导入多次实际上只会导入一次

包引用图

3. 运算函数库编写

calc 目录结构

  • 首先我们变成了包为mathAdd Sub Mod 这三个函数
// add.go
package math

func Add(x, y int) int{
   return  x + y
}
//sub.go
package math

func Sub(x, y int) int {
    return x - y
}
// mod.go
package math

func Mod(x, y int) int{
 return  x % y
}
  • calcmain.go
package main

import (
    "fmt"
    "gopl/ch1/calc/math"
)

func main() {
    var x int = 5
    var y int = 7
    fmt.Printf("%d + %d = %d\n", x, y, math.Add(x, y))
    fmt.Printf("%d - %d = %d\n", x, y, math.Sub(x, y))
    fmt.Printf("%d %% %d = %d\n", x, y, math.Mod(x, y))
}

运行结果

在 因为 package mainxx.go 文件在 calcmain 目录下面,我们可以通过以下命令来运行该程度

$ go run xx.go  //直接运行
$ go build xx.go   // 构建生成可执行文件
  • 如图
    运行结果

二、 包和文件分析

  • 3 中的小实验里面,我们通过实现了 加减和求余 的运算。
  • 本次小实验我们可以看做一个小项目,该项目的路径是放在 $GOPATH/src/gopl/ch1 目录下,在此子目录下建立了一名为 calc 的项目,在此子目录 (ch1目录) 下面我们还可以创建其他目录,后续将会有补充
  • calcmain.go 中, 我们引入了包
import (
    "fmt"
    "gopl/ch1/calc/math"
)

该包中,我们使用 gopl/ch1/calc/math 不是一个包,而是一个路径; 该路径下所有的包都被导入到程序当中,但是为了方便理解我们通常都是在一个路径下面表示一个包,而路径的后缀就是包名 (这是golang 工程师铁打不变的编程基本素质)

我们不推荐 引入包的时候是 import “gopl/ch1/calc/hello”, 而在使用的时候是math.xx() 这种的情况,因为引入路径的后缀和包名不一致,这对于编程人员来说是非人类的存在

// calcmain.go
package main

calcmain.go 文件中, 这是文件是整个程序唯一入口, 类始于C/C++ 中的main函数一样

总结

  • 理解 import 引入路径的后缀名和 package 之间的关系
  • 理清 GOPATH 的项目文件之间的区别
  • 还可以在 math 目录下编程其他运算的函数
  • 切记,包中的函数或者变量如果要在其他包中被调用,其首写字母必须是大写

猜你喜欢

转载自blog.csdn.net/xiaomiCJH/article/details/85246194
02