如何使go build与嵌套目录一起工作
在学习围棋的过程中,我一直在玩弄自己的图书馆。下面是我所做的:在我的$GOPATH/src中,我有两个文件夹:如何使go build与嵌套目录一起工作,go,Go,在学习围棋的过程中,我一直在玩弄自己的图书馆。下面是我所做的:在我的$GOPATH/src中,我有两个文件夹:mylibs和test。test文件夹有一个名为test.go的文件,其中包含 package test import "mylibs/hi/saysHi" func main() { saysHi.SayHi() } mylibs文件夹包含另一个名为hi的文件夹,其中有一个名为saysHi.go的文件,其中包含: package saysHi import "fmt"
mylibs
和test
。test
文件夹有一个名为test.go
的文件,其中包含
package test
import "mylibs/hi/saysHi"
func main() {
saysHi.SayHi()
}
mylibs
文件夹包含另一个名为hi
的文件夹,其中有一个名为saysHi.go
的文件,其中包含:
package saysHi
import "fmt"
func SayHi() {
fmt.Printf("Hi\n")
}
因此,目录结构如下所示:
- GOPATH/src
- 试验
- 试一试
- 迈里布斯
- 嗨
- 说吧
测试时,它会抱怨说
cannot find package "mylibs/hi/saysHi" in any of:
[...]
$GOPATH/src/mylibs/hi/saysHi (from $GOPATH)
我故意使目录结构比必要的更深入。如果我在$GOPATH/saysHi/saysHi.go
中放置saysHi.go
的目录结构更简单,那么它就工作了
但我看不出为什么这不起作用。有什么想法吗?一般来说,您的目录名应该与包名匹配。所以如果你定义
package saysHi
并希望将其与
导入“mylibs/hi/saysHi”
应将其放置在如下结构中:
- 迈里布斯
- 嗨
- 赛希
- 说吧
包中.go
文件的名称对导入路径没有影响,因此您可以随意调用.go
文件
为了进一步解释,您使用的导入路径应该是包含包的目录的名称。但是,如果在该目录中定义了不同的包名,则应该使用该名称访问代码中的包。这可能会让人困惑,所以最好避免使用它,直到您了解它的最佳使用位置为止(提示:包版本控制)
这会让人困惑,例如,如果您的包在路径中
- 迈里布斯
- 嗨
- 说吧
和内部saysHi.go
定义
package saysHi
然后在test.go中,您将使用
import "mylibs/hi"
和它一起使用
saysHi.SayHi()
请注意,您是如何在最终目录为hi
的情况下导入它的,但将其与名称saysHi
一起使用
最后说明
以防万一,您不知道以下内容:您的测试文件名为test.go
,如果它只是一个示例,而不是saysHi.go
的实际测试文件,那就好了。但是,如果它是/曾经是一个包含saysHi.go
测试的文件,那么公认的go标准是将该文件命名为saysHi\u test.go
,并将其与saysHi.go
放在同一个包中
还有最后一个音符
我提到了如何允许您从目录名中选择不同的包名。但实际上有一种编写代码的方法,这样就不会那么混乱:
import (
saysHi "mylibs/hi"
)
将它从mylibs/hi
目录导入,并记下它应该与saysHi
一起使用的事实,这样代码的读者就不必去看mylibs/hi
代码了 一般来说,目录名应该与包名匹配。所以如果你定义
package saysHi
并希望将其与
导入“mylibs/hi/saysHi”
应将其放置在如下结构中:
- 迈里布斯
- 嗨
- 赛希
- 说吧
包中.go
文件的名称对导入路径没有影响,因此您可以随意调用.go
文件
为了进一步解释,您使用的导入路径应该是包含包的目录的名称。但是,如果在该目录中定义了不同的包名,则应该使用该名称访问代码中的包。这可能会让人困惑,所以最好避免使用它,直到您了解它的最佳使用位置为止(提示:包版本控制)
这会让人困惑,例如,如果您的包在路径中
- 迈里布斯
- 嗨
- 说吧
和内部saysHi.go
定义
package saysHi
然后在test.go中,您将使用
import "mylibs/hi"
和它一起使用
saysHi.SayHi()
请注意,您是如何在最终目录为hi
的情况下导入它的,但将其与名称saysHi
一起使用
最后说明
以防万一,您不知道以下内容:您的测试文件名为test.go
,如果它只是一个示例,而不是saysHi.go
的实际测试文件,那就好了。但是,如果它是/曾经是一个包含saysHi.go
测试的文件,那么公认的go标准是将该文件命名为saysHi\u test.go
,并将其与saysHi.go
放在同一个包中
还有最后一个音符
我提到了如何允许您从目录名中选择不同的包名。但实际上有一种编写代码的方法,这样就不会那么混乱:
import (
saysHi "mylibs/hi"
)
将它从mylibs/hi
目录导入,并记下它应该与saysHi
一起使用的事实,这样代码的读者就不必去看mylibs/hi
代码了 作为一个来自很多其他语言的初学者,其中的一些细微差别对我来说很难确定/提出问题。这真的帮助我更好地了解了如何处理包裹!谢谢你,我有一个来自其他很多地方的新手