登录
首页 >  Golang >  Go问答

实例化包级变量的唯一方法

来源:stackoverflow

时间:2024-03-19 15:09:28 287浏览 收藏

实例化包级变量的唯一方法是将对象类型断言为 *types.Const,然后通过其 Val 方法访问该值。该方法返回一个 ConstantValue,该值包含变量的值。这种方法对于遍历包并检查导出常量(只是字符串)的格式非常有用。

问题内容

我试图在充满常量的包中为某些导出类型添加一些简单的验证代码。我想遍历这个包,找出导出的常量(只是字符串)并验证它们的格式。

想象一下,我有一个 flags 包,它导出 consts flagdoathing = "do-a-thing"。我想遍历该包并检查这些值是什么。

作为示例,我有两个文件:

// main.go
func main() {
    cfg := &packages.config{
        mode: packages.needtypes,
    }
    pkgs, _ := packages.load(cfg, "package-inspector/other")
    pkg := pkgs[0]

    scope := pkg.types.scope()
    for _, name := range scope.names() {
        fmt.println(name)
        obj := scope.lookup(name)
        fmt.println(obj)
        fmt.println("\t", obj.id(), obj.type())
    }
}

然后在我的另一个包中

package other

const (
    exportedone = "exported_one"
    exportedtwo = "exported_two"

    privateone = "private_one"
)

在本地运行时(无法让演示喜欢我)我看到了

go run main.go
ExportedOne
const package-inspector/other.ExportedOne untyped string
         ExportedOne untyped string
ExportedTwo
const package-inspector/other.ExportedTwo untyped string
         ExportedTwo untyped string

我想做的是获取 exportedone


正确答案


您可以将对象类型断言为 *types.Const,然后通过其 Val 方法访问该值。

o := s.Lookup(name)
if c, ok := o.(*types.Const); ok {
    fmt.Println(c.Val())
}

参见示例:https://go.dev/play/p/oXX7Mo897bk

本篇关于《实例化包级变量的唯一方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>