【问题标题】:How to get path of imported package如何获取导入包的路径
【发布时间】:2020-03-02 06:44:46
【问题描述】:

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

这是我做的。

项目结构

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

来自lib/lib.goos.Getwd() 的结果仍然与主路径相同。我想要的是包的真实路径/Users/novalagung/Documents/go/src/test-import/lib/

我该怎么办?有可能吗?

【问题讨论】:

  • os.Getwd 在运行时返回与当前目录对应的根路径名。它与仅在编译时工作的源路径无关。也许告诉我们您需要解决什么问题。
  • @JiangYD “也许告诉我们您需要解决什么问题”,基本上我创建了一些应用程序,其中包含子应用程序,其中包含彼此不同的包。如果我能得到子文件夹的名称,它会让我更容易维护路线
  • @JiangYD 没关系,大卫回答解决了我的问题

标签: go path


【解决方案1】:

如果你可以得到包中某物的引用,你可以使用反射来获取导入路径。

这是Play上的一个例子:

package main

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2023-03-29
      • 2016-03-09
      • 1970-01-01
      • 2019-01-27
      相关资源
      最近更新 更多