golang打印当前package name

有的时候需要在程序运行中打印当前package name,比如一些log系统,在每条log中希望打印出是在哪个pkg内(当然打印文件名也是可以的)。网上找了找,基本上也是先用runtime找到调用文件,然后通过path.Dir来找上级文件夹名,虽然也可以,但是总觉有点“取巧”。见:https://stackoverflow.com/questions/32163425/golang-how-to-get-the-directory-of-the-package-the-file-is-in-not-the-current-w

其实可以利用反射,见https://stackoverflow.com/questions/25262754/how-to-get-name-of-current-package-in-go

package myPkg
import (
    "fmt"
    "reflect"
)

func DumpMyName(){
    type em struct{}
    fmt.Println(reflect.TypeOf(em{}).PkgPath())
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Go 中,通过反射机制可以获取 package 中的函数。首先需要导入 "reflect" 包,然后使用 reflect.TypeOf() 和 reflect.ValueOf() 函数获取 package 对象的类型和值,最后使用类型和值对象的 Method 方法获取 package 中的函数。 ``` packageName := "github.com/your/package" packageValue := reflect.ValueOf(packageName) packageType := packageValue.Type() // 获取 package 中所有方法 for i := 0; i < packageType.NumMethod(); i++ { method := packageType.Method(i) fmt.Println(method.Name) } ``` 如上代码可以获取 packageName 包内所有的函数名。 ### 回答2: 在Go语言中,可以通过反射机制来获取一个package中的函数。 首先,我们需要使用`reflect`包来进行反射操作。然后,使用`reflect`包中的`PackageOf`函数来获取指定包的`reflect.Value`类型。例如,假设我们要获取`fmt`包中的所有函数,可以这样操作: ```go package main import ( "fmt" "reflect" ) func main() { pack := reflect.TypeOf(fmt.Print).PkgPath() // 获取fmt包的路径 pkg, err := reflect.Import(pack) // 导入fmt包 if err != nil { fmt.Println(err) return } funcs := pkg.Funcs() // 获取包中的所有函数 for _, f := range funcs { fmt.Println(f.Name) } } ``` 上述代码中,首先使用`reflect.TypeOf`函数获取`fmt.Print`函数的类型,并通过`PkgPath`方法获取`fmt`包的路径。然后,使用`reflect.Import`函数来导入该包。最后,使用`Funcs`方法获取包中的所有函数,并通过遍历打印出函数名。 需要注意的是,反射操作可能会在性能上有所损耗,因此在实际使用中要谨慎使用。 ### 回答3: 在golang中,可以使用反射来获取一个package内部的func。首先,需要使用`reflect`包来进行反射操作。 我们可以通过`reflect`包的`Package`类型,使用`reflect.ValueOf()`函数传入一个对应的package,并返回一个表示package的`Value`对象。然后,我们可以使用`Value`对象的`NumMethod()`方法获取package中方法的数量。接着,我们可以使用`Value`对象的`Type()`方法获取package的类型信息,包括所有方法的名称和签名。最后,我们可以使用`Value`对象的`Method()`方法获取特定索引的方法对象。 下面是一个示例代码,演示如何根据package获取里面的func: ```go package main import ( "fmt" "reflect" ) func main() { // 获取reflect.Value对象 pkgValue := reflect.ValueOf(fmt) // 获取方法数量 numMethods := pkgValue.NumMethod() // 输出方法名称和签名 for i := 0; i < numMethods; i++ { method := pkgValue.Type().Method(i) fmt.Println("Method:", method.Name) fmt.Println("Signature:", method.Type) } // 获取特定索引的方法对象 methodValue := pkgValue.Method(0) fmt.Println("Method Object:", methodValue) } ``` 以上代码使用了reflect包来获取`fmt`包内的方法,并输出了方法名称和签名。注意,这里使用了`fmt`包作为示例,你可以替换为其他的包名。 需要注意的是,使用反射来获取package内部的func是一种高级操作,并且在实际开发中并不常用。在大多数情况下,我们可以直接通过常规代码来调用package内部的func。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值