Golang:获取导入包的路径

时间:2017-05-31 04:01:43

标签: go path

我在尝试获取导入包的路径时遇到了困难。当我在导入的包中打印os.Getwd()的结果时,它会显示与main包上相同的路径。

这就是我所做的。

项目结构

enter image description here

LIB / lib.go

package lib

import "os"
import "fmt"

func init() {
    dir, _ := os.Getwd()
    fmt.Println("lib.init() :", dir)
}

func GetPath() {
    dir, _ := os.Getwd()
    fmt.Println("lib.GetPath() :", dir)
}

main.go

package main

import "os"
import "fmt"
import "test-import/lib"

func main() {
    dir, _ := os.Getwd()
    fmt.Println("main :", dir)
    lib.GetPath()
}

结果

lib.init() : /Users/novalagung/Documents/go/src/test-import
main : /Users/novalagung/Documents/go/src/test-import
lib.GetPath() : /Users/novalagung/Documents/go/src/test-import

来自os.Getwd()的{​​{1}}的结果仍然与主要内容相同。我想要的是包的真实路径lib/lib.go

我该怎么办?有可能吗?

2 个答案:

答案 0 :(得分:7)

如果您可以获得对包中某些内容的引用,则可以使用reflect来获取导入路径。

以下是Play的示例:

package main

import (
    "bytes"
    "fmt"
    "reflect"
)

func main() {
    var b bytes.Buffer
    fmt.Println(reflect.TypeOf(b).PkgPath())
}

答案 1 :(得分:1)

PkgPath()仅可以检索非指针的包路径

// If the type was predeclared (string, error) or not defined (*T, struct{},
// []int, or A where A is an alias for a non-defined type), the package path
// will be the empty string.
func packageName(v interface{}) string {
    if v == nil {
        return ""
    }

    val := reflect.ValueOf(v)
    if val.Kind() == reflect.Ptr {
        return val.Elem().Type().PkgPath()
    }
    return val.Type().PkgPath()
}