Golang中如何调用同包不同目录下的函数

Golang中如何调用同包不同目录下的函数 大家好,

我有以下代码结构,并且我正在尝试调用定义在同一个包(main)下但位于不同文件夹中的函数(我不确定这是否有效)。如果这是有效的,那么我的理解是,我应该能够在 main.go 中直接使用定义在另一个“folder1”中的函数,而无需显式导入,对吗?

代码结构: dummy | | ---- main.go | ---- folder_1 | | ---- random.go

image

错误: 未声明的名称


更多关于Golang中如何调用同包不同目录下的函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

非常感谢 @christophberger 的极速回复。我会重新修改我的代码。

更多关于Golang中如何调用同包不同目录下的函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


@telo_tade 感谢回复。folder_1 在 dummy 文件夹下(即它是子目录),所以我原本以为既然 dummy 是父文件夹,它应该能够直接使用 folder_1 中的函数而无需显式导入,但我无法做到。

正如 @christophberger 所说,你基本上有两个包:dummy/main 和 folder_1/main。你处理的是两个包,它们恰好都叫做 main。

另请注意,在你的仓库中(例如 myRepo.com/myApp),你可以在第三个包中导入这两个 main 包,并使用它们中的代码,像这样:

import "myRepo.com/myApp/dummy"
import "myRepo.com/myApp/folder_1"

@Manish,欢迎来到论坛。

Manish: 同一个包(main)但在不同的文件夹中(我不确定这是否有效)

不,这是无效的。根据语言参考,属于同一个包的所有文件必须位于同一个文件夹中:

共享相同 PackageName 的一组文件构成了一个包的实现。实现可能要求一个包的所有源文件都位于同一个目录中。

包 - Go 编程语言,强调部分由我添加。)

(这里的“实现”指的是 Go 工具链的实现。)

关键在于,导入路径映射到目录。因此,如果你在项目中添加一个目录,它就代表一个新的导入路径。

在Go语言中,同一个包下的所有文件共享相同的包命名空间,无论它们位于哪个目录。这意味着你可以在main.go中直接调用folder_1/random.go中定义的函数,前提是这两个文件都声明为同一个包(例如package main),并且这些函数是导出的(以大写字母开头)。

示例代码结构:

dummy/
├── main.go
└── folder_1/
    └── random.go

folder_1/random.go:

package main

import "fmt"

// 导出的函数(大写字母开头)
func RandomFunction() {
    fmt.Println("调用了 folder_1 中的函数")
}

// 未导出的函数(小写字母开头)无法在包外部访问
func privateFunction() {
    fmt.Println("私有函数")
}

main.go:

package main

func main() {
    // 直接调用同包下的函数
    RandomFunction() // 正确:函数已导出
    // privateFunction() // 错误:未导出的函数不可访问
}

关键点:

  1. 两个文件必须声明相同的包名(例如package main)。
  2. 要调用的函数必须以大写字母开头(导出)。
  3. 无需导入语句,因为它们在同一个包中。
  4. 使用go rungo build时,需要指定所有文件:
    go run main.go folder_1/random.go
    
    或使用通配符:
    go run ./...
    

如果你的代码结构符合上述要求但仍遇到“未声明的名称”错误,请检查:

  • 函数名是否以大写字母开头。
  • 两个文件是否都声明了相同的包名。
  • 构建命令是否包含了所有相关文件。

如果问题仍然存在,请提供具体的代码片段以便进一步排查。

回到顶部