Golang导入本地包和导入问题相关详解

  

  

包是去程序的基本单位,所以每个去程序源代码的开始都是一个包声明:

        包pkgName      

这就是包声明,pkgName告诉编译器,当前文件属于哪个包,一个包可以对应多个* .go源文件,标记它们属于同一包的唯一依据就是这个包声明,也就是说:无论多少个源文件,只要它们开头包的包相同,那么它们就属于同一个包,在编译后就只会生成一个。文件,并且存放在$ GOPATH/pkg文件夹下。

  

示例:   

(1)我们在$ GOPATH/目录下,创建如下结构的文件夹和文件:
  

  

 Golang导入本地包和导入问题相关详解

  

分别写入如下的代码:

  

hello.go      //hello.go   包你好      导入(   “fmt”   )      func SayHello () {   fmt.Println (“SayHello()——在Hello”)   }      

hello2.go      //hello2.go   包你好      导入(   “fmt”   )      func SayWorld () {   fmt.Println (“SayWorld()——在世界”)   }      

main.go      //main.go   主要包      导入(   “你好”   )      函数main () {   hello.SayHello ()   hello.SayWorld ()   }      

分析:   

根据hello.go/hello2.go中包的声明可知,它们俩属于同一个包-你好,那么根据分析,编译后只会生成一个*。文件。

  

执行命令:

        去安装你好      

该命令的意思大概是:编译并安装你好包,这里安装的意思是将生成的*。文件放到工作目录GOPATH美元/pkg目录下去

  

运行后:

  

 Golang导入本地包和导入问题相关详解

  

从结果看出,<强>果然只生成了一个包,并且名为hello.a

  

那么我们提出第二个问题:<强>生成的*。文件名是否就是我们定义的包名+。后缀?

  

为了验证这个问题,我们对源码做一些更改:
  将hello.go/hello2.go中包的声明改为如下:

        包hello_a      

在编译安装包之前,先清除上一次生成的包:

        去清洁我你好      

再次编译安装该包:

        去安装hello_a      

按照”正常推理”,上面这句命令是没什么问题的,因为我们已经将包名改成hello_a了啊,但是实际的运行结果是这样的:

  

 Golang导入本地包和导入问题相关详解

  

哦~不! !
  那么,我们再试试用这条命令:

        去安装你好      

卧槽! !居然成功了! !是不是? ?

  

 Golang导入本地包和导入问题相关详解

  

那么我们尝试生成一下可执行程序,看看能不能正常运行呢?

        去构建主要      

又报错了! ! !

  

 Golang导入本地包和导入问题相关详解

  

看这报错提示,好像应该改一下main.go源码,那就改成如下吧:

     //main.go   主要包      导入(   “hello_a”   )      函数main () {   hello_a.SayHello ()   hello_a.SayWorld ()   }      

改成上面这样也合情合理哈?毕竟我们把包名定义成了hello_a了!
  那就再来编译一次吧:

        去构建主要      

继续报错!
  

  

 Golang导入本地包和导入问题相关详解

  

等等! !有新的发现,对比上两次的报错信息,可见第一次还能能找到hello_a包的,更改源码后居然还TM找不到hello_a包了? ?
  好吧,那咱再改回的去,不过这回只改包的导入语句,改成:

Golang导入本地包和导入问题相关详解