一尘不染

如何在go中获取当前包的名称?

go

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

package main

import "fmt"

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

…且结果应为“主要”

现在我正在使用常量,例如:

package main

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

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

但我很好奇您能否避免这种情况


阅读 426

收藏
2020-07-02

共1个答案

一尘不染

没有提供所需功能的运行时反射方法或函数。

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

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))
}
2020-07-02