go包的理解

Posted hellohello

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go包的理解相关的知识,希望对你有一定的参考价值。

结论:

  1. import时指定的字符串,是相对于$GOPATH的目录路径,告诉了go,要去加载这个目录下所有的包文件(不包括子目录中的文件)
  2. 一个目录中所有的源文件(不包括子目录)代表了单独的一个包,这些源文件内的package关键字指出的包名,必须一致,否则无法被使用
  3. import指定的加载目录、目录中的源文件名字、源文件内通过package关键字指定的包名。这三者可以不一样。导入后,根据package指定的包名,来使用包中的导出成员。
  4. 导入两个目录,这两个目录中的源文件内指定的包名,如果出现相同,则导入目录时会失败
  5. 当源文件被加载时,文件内的init函数会被自动执行:
    1. 通过import来加载一个目录时,如果这个目录中有多个源文件,则这些源文件中的init函数都会执行,但文件之间的init函数的执行次序不确定,看go加载文件是的顺序
    2. 一个源文件内可以定义多个init函数,多个init函数会按顺序从上往下执行。虽然一个文件内可以定义多个init,但是没有这个必要,把逻辑都集中在一个init函数中,效果一样

测试A

$GOPATH目录如下:

├─pkg
└─src
  └─app.go
  └─m1
    └─k1.go

app.go:

package main

import "m1"

func main() {
    x1.Show()
}

 k1.go:

package x1

import "fmt"

func Show(){
    fmt.Println("show call")
}

 运行app.go:输出 show call。这里对应结论3.

测试B

在以上的m1目录中,创建一个文件k2.go

package x2

import "fmt"

func Show(){
    fmt.Println("show call")
}

运行app.go提示:app.go:3:8: found packages x1 (k1.go) and x2 (k2.go) in D:\\GoPath\\src\\m1

这里对应结论2

测试C

技术图片

k1和k2文件中,都通过package指定包名为x1。app.go中导入这两个目录,运行报错:

.\\app.go:4:8: x1 redeclared as imported package name
previous declaration at .\\app.go:3:8
.\\app.go:7:2: undefined: "m2".FnInK1

 解决办法:导入的时候,将冲突的包名,重命名为另一个值即可,如以下k2pkg

技术图片

 

以上是关于go包的理解的主要内容,如果未能解决你的问题,请参考以下文章

Go Web编程实战(10)----模板引擎库text/template包的使用

Go Web编程实战(10)----模板引擎库text/template包的使用

10.Go语言基础之包

Go语言基础之包的概念

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段