有没有办法让运行时获得当前包的名称?
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)
}
但我很好奇你是否可以避免这个
答案 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)
没有提供您正在寻找的功能的runtime或reflect方法或功能。
我能找到的最接近的是:
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
}