如何使go build与嵌套目录一起工作

如何使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"

在学习围棋的过程中,我一直在玩弄自己的图书馆。下面是我所做的:在我的$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"

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
代码了

作为一个来自很多其他语言的初学者,其中的一些细微差别对我来说很难确定/提出问题。这真的帮助我更好地了解了如何处理包裹!谢谢你,我有一个来自其他很多地方的新手