有没有办法在运行时获得当前包的名称?

package main

import "fmt"

func main() {
    pkgName := {some magic here:)}
    fmt.Println(pkgName)
}

...结果应该是"Main"

现在我使用的常量如下:

package main

import "fmt"
const (
    pkgName = "main"
)

func main() {
    fmt.Println(pkgName)
}

但我很好奇你能不能避免

推荐答案

没有runtimereflect方法或函数可以提供您想要的功能.

我能找到的最接近的东西是:

package main

import (
    "azul3d.org/lmath.v1"
    "fmt"
    "reflect"
)

type Empty struct{}

func main() {
    fmt.Println(reflect.TypeOf(Empty{}).PkgPath())
    fmt.Println(reflect.TypeOf(lmath.Vec3{0, 0, 0}).PkgPath())
}

这将输出:

main
azul3d.org/lmath.v1

您还可以读取文件的第一行并删除"package"子字符串. (不确定这是不是最好的主意)

package main

import (
    "bufio"
    "bytes"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("so.go")
    if err != nil {
        panic(err)
    }
    r := bufio.NewReader(file)
    line, _, err := r.ReadLine()
    if err != nil {
        panic(err)
    }
    packageName := bytes.TrimPrefix(line, []byte("package "))
    fmt.Println(string(packageName))
}

Go相关问答推荐

在字符串与字符串子切片上使用len进行位转移产生意外输出

golang父进程的副本无法进行https/tls调用并获得tls:未能验证证书""

如何预编译Golang标准库?

错误&对象已被Golang在K8s操作符上修改

正确使用pgtype的方法

Go:为什么我不能比较 net.Addr

Go 是否提供了标准或事实上的方法来处理单个语句中的错误(即内联错误处理)?

如何将 goose 迁移与 pgx 一起使用?

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

有没有办法在 Golang 中使用带有 go-simple-mail lib 的代理?

如何以干净的方式在中间件中注入 repo 或服务?

Apache Beam 左加入 Go

如何使用带有方法的字符串枚举作为通用参数?

Ginkgo/Gomega panic 测试失败

正确编码 JWT

Golang API 的 HTTPS

带有 grpc 的 protobuf 用于拆分包中的 Go

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error

有没有办法停止long blocking 函数?

Go 错误处理、类型断言和 net package包