在A包中引入B包,自动触发B包的init函数,init怎么获取到A的文件名?
在Go语言中,无法直接获取引入包的文件名。init函数在包被引入时会被自动执行,但它本身没有直接获取导入它的包的能力。
不过,您可以使用`runtime`包的`Caller()`函数来获取调用init函数的文件名。这是一种比较常见的做法,但需要注意的是,它只能获取调用init函数的文件名,而不是直接导入包的文件名。
以下是一个示例代码,演示如何使用`runtime.Caller()`函数获取调用init函数的文件名:
```go
package B
import (
"fmt"
"runtime"
)
func init() {
_, filename, _, _ := runtime.Caller(0)
fmt.Println("Caller file:", filename)
}
```
在这个例子中,当B包被引入时,init函数会被自动执行,并输出调用它的文件名。
需要注意的是,这种方法仅适用于在运行时获取调用init函数的文件名。如果您需要获取编译时的包信息,可能需要使用其他的解决方案,例如修改编译器或使用代码生成工具。
相似问题