【问题标题】:How can you dynamically resolve or introspect variables如何动态解析或内省变量
【发布时间】:2020-04-18 08:31:36
【问题描述】:

有没有办法解决或反省从名称字符串中识别的变量?

例如,如果我有一个字符串值 strVal := "s" 对应于同一函数中的变量名称,例如 var s string 的范围,我可以动态查找s变量的值吗?

我知道如果这些是结构的字段,我可以使用反射,但对于我的用例,我正在处理不属于结构或映射的局部范围变量。

【问题讨论】:

  • 我认为有效的方法是将这些局部变量的指针保存到全局注册表变量(map[string]interface)中,并在其之上实现一些并发安全的访问器函数或方法。这种解决方案被许多图书馆采用......我认为是最惯用的/推广的一个
  • “golang 中的随机变量” - 你能解释一下你是如何想象识别随机变量的吗?例如,从其名称的字符串?
  • 是的,来自其名称的字符串。

标签: go dynamic reflection


【解决方案1】:

您似乎从结构中提取了这些信息。

package main

import (
    "fmt"
    "reflect"

)

type Article struct {
    Id    int   
    Title string
    Price float32
    Authors []string    
}

func main() {

    article := Article{}

    e := reflect.ValueOf(&article).Elem()

    for i := 0; i < e.NumField(); i++ {
        name := e.Type().Field(i).Name
        varType := e.Type().Field(i).Type
        value := e.Field(i).Interface()
        fmt.Printf("%v %v %v\n", name, varType, value)
    }
}

例子:

https://play.golang.org/p/vWkRzpvWKYn

【讨论】:

  • 据我所知,这在 Go 中已经是最好的了。谢谢!
  • 他们在 Github 上讨论了 go2 即将推出的许多新功能。也许你可以创建一个问题 -> github.com/golang/go/labels/Go2
【解决方案2】:

如果你想在运行时分析一个变量,那么你可以使用像 delve 这样的调试器

参考:https://github.com/go-delve/delve

【讨论】:

  • 是否可以通过编程方式(在运行时)使用 delve 按名称识别变量的值?
  • 你的想法很奇怪,但也许你可以直接调用 delve API 来获取这些信息,但我认为这不是最佳实践 -> blog.jetbrains.com/go/2018/04/30/…
  • 是的,看来我会逆流而上。我的用例是我想启用类似于Eval 的元编程,但这似乎并不容易,我应该完全避免这种情况。
  • 你也许可以 fork 这个解释器的一些概念和代码片段-> github.com/containous/yaegi
【解决方案3】:

[I]如果我有一个字符串值 strVal := "s" 对应于同一范围内的 var s 字符串的名称,我可以动态查找 s 的值吗?

没有。一个简单的死号。

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多