Go 在同一目录下的不同目录中找不到函数

Go 在同一目录下的不同目录中找不到函数,go,Go,我只有一个包main,但我正在构建多个二进制文件: --cmd --program1 --main.go --program2 --main.go --xxx.go --yyy.go --zzz.go 我想在program1/main.go中调用xxx.go中的函数。编者说未声明的名称: 我认为我不应该导入该函数,因为它们都在同一个包main中。要执行所需操作,需要将xxx.go、yyy.go和zzz.go文件放入一个内部包中 这是您应该具有的目录布局: --

我只有一个包
main
,但我正在构建多个二进制文件:

--cmd
   --program1 
     --main.go
   --program2
     --main.go
--xxx.go
--yyy.go
--zzz.go
我想在
program1/main.go
中调用
xxx.go中的函数。编者说
未声明的名称:


我认为我不应该导入该函数,因为它们都在同一个包
main

中。要执行所需操作,需要将xxx.go、yyy.go和zzz.go文件放入一个内部包中

这是您应该具有的目录布局:

--cmd
   --program1 
     --main.go
   --program2
     --main.go
--internal
   --shared
      --xxx.go
      --yyy.go
      --zzz.go
在xxx.go、yyy.go和zzz.go文件中,您应该在文件开头共享

在文件main.go中,您应该有
import./../internal/shared“
。如果您有一个具有完全限定模块名的go.mod文件(例如github.com/me/project),那么您可以导入“github.com/me/project/internal/shared”


一旦你有了这个,你可以调用共享包的导出函数,因此从xxx.go文件,从程序的主文件。请注意,当函数名的第一个字母是大写字母时,将导出函数

不同的包路径=不同的包,与包的名称无关。此外,主程序包不打算被导入,如果您需要在与主程序包分开的程序包中声明函数,那么也不要将新的程序包命名为主程序包,您只会遇到问题。只有相邻的文件构成一个程序包,文件位于不同的目录中(无论是否嵌套,都无所谓)是一个独立的包。Go在包上工作,而不是在文件上(这不是100.0%准确,但它是思考这些事情最有用的方式)。因此,您不会从xxx.go调用函数,而是从xxx.go所属的包调用函数。您也不导入函数,而是导入包。您要使用的每个软件包都必须导入。包源存储在文件系统的何处并不重要:如果要使用包-->必须导入它。您显然有三个包,分别位于cmd、cmd/program1和cmd/program2中。