如何获取当前包的名称?

时间:2014-08-12 11:08:59

标签: go

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

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)
}

但我很好奇你是否可以避免这个

4 个答案:

答案 0 :(得分:21)

这是我的记录器包的一部分。它检索有关日志记录函数调用者的信息,以便稍后在输出中显示它。

func retrieveCallInfo() *callInfo {
    pc, file, line, _ := runtime.Caller(2)
    _, fileName := path.Split(file)
    parts := strings.Split(runtime.FuncForPC(pc).Name(), ".")
    pl := len(parts)
    packageName := ""
    funcName := parts[pl-1]

    if parts[pl-2][0] == '(' {
        funcName = parts[pl-2] + "." + funcName
        packageName = strings.Join(parts[0:pl-2], ".")
    } else {
        packageName = strings.Join(parts[0:pl-1], ".")
    }

    return &callInfo{
        packageName: packageName,
        fileName:    fileName,
        funcName:    funcName,
        line:        line,
    }
}

如您所见,它也会返回包名称。

答案 1 :(得分:19)

没有提供您正在寻找的功能的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))
}

答案 2 :(得分:5)

为了可靠地获取包名,您可以使用go编译器的解析器来仅解析包子句。

CREATE UNIQUE INDEX monthly_table_my_index
ON monthly_table (u1, u2, u3);

CREATE UNIQUE INDEX information_table_my_index
ON information_table (u1, u2, u3);

答案 3 :(得分:0)

这可能会有所帮助:

import (
    "runtime"
    "strings"
)

func Package() string {
    pc, _, _, _ := runtime.Caller(1)
    parts := strings.Split(runtime.FuncForPC(pc).Name(), ".")
    pl := len(parts)
    pkage := ""
    funcName := parts[pl-1]
    if parts[pl-2][0] == '(' {
        funcName = parts[pl-2] + "." + funcName
        pkage = strings.Join(parts[0:pl-2], ".")
    } else {
        pkage = strings.Join(parts[0:pl-1], ".")
    }
    return pkage
}