- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我目前对 golang 反射包的行为感到绝望,对我来说这似乎根本不一致。
1) 据我了解,reflect.Value 似乎带有指向基础值的指针。例如。如果我打电话
var s string
v1 := reflect.ValueOf(&s).Elem()
v2 := v1
v2.SetString("Hello World!")
fmt.Println(s)
它打印出“Hello World!”。但是,这似乎不适用于通过调用 Field() 获得的 reflect.Value。
val := ... //Assign a reflect.Value to it
nextval := val.Field(0) //Make sure that Field exists and is of type map
nextval = reflect.MakeMap(reflect.MapOf(KEY, ELEM))
nextval.SetMapIndex(Some_value_of_type_KEY, Something_of_type_ELEM)
fmt.Println(nextval.MapKeys()
fmt.Println(val.Field(index).MapKeys())
这打印
[Some_value_of_type_KEY]
[]
这是一个主要的烦恼。有谁知道为什么会这样吗?
============================================= ====
2)考虑函数
func Test(v interface{}) {
val := reflect.ValueOf(v)
if val.Kind() != reflect.Struct {
fmt.Println("It is a struct")
}
}
如果我用任何结构作为参数调用它,它会打印“This is a struct”。但是,我将无法使用 val 为 v 中的内容分配新值,由于该值不可寻址。通过以下解决方法:
func Test(v interface{}) {
val := reflect.ValueOf(&v).Elem()
if val.Kind() != reflect.Struct {
fmt.Println("This never get's printed!")
}
}
根据文档,我会假设,通过使用 '&' 我使用指向 v 的指针并通过调用 Elem() 我得到它指向的元素,因此 val.Kind() 应该仍然返回同样的事情。它没有。 val.Kind() 现在是一个 reflect.Interface。
有没有办法不用走
valForTestingKind := reflect.ValueOf(v)
valForSettingNewValue := reflect.ValueOf(&v).Elem()
因为这在某种程度上感觉不对。
最佳答案
第 1 部分:
通过分配给 nextval
,您将打破它与原始 val
的关联。相反,请使用 Set()
方法。
nextval.Set(reflect.MakeMap(reflect.MapOf(KEY, ELEM)))
Set()
相当于反射世界中的赋值。当然,您必须像在第一个代码示例中那样使用 reflect.ValueOf(&v).Elem()
确保它是可分配的。
第 2 部分:
这里的问题是您有另一个间接级别。 v
是 interface{} 类型,并且有一个具体值,其类型是 Kind 结构。就像每个接受接口(interface)类型参数的函数一样,当您调用 reflect.ValueOf
时,参数会自动转换为该类型。但是,将一个接口(interface)转换为另一个接口(interface)会导致在新接口(interface)类型中重新装箱具体值。重新装箱前的类型信息丢失。例如,接受 io.Writer 的函数不知道调用函数将其视为 io.ReaderWriter。
在此上下文中,这意味着 reflect.ValueOf 无法判断您传递的是 os.File(某个结构)还是封装在接口(interface){}中的文件。它假设您传递了一个 os.File 并向您展示了 Kind“struct”。
但是,当您将指针传递给 interface{} 时,您传递的是一个可以修改的 interface{} 变量。您没有传递底层的具体类型,这会产生重要的后果。您可以 .Set()
任何东西,而不仅仅是原始具体类型所允许的。您也无法编辑单个字段,因为界面中的任何内容都不可分配。{}如果具体类型实际上是一个指针,您可以执行第四次取消引用 (.Elem()
) 并从那里修改字段。
那么,这在代码方面意味着什么?
//let v = an interface{} with a concrete type of SomeStruct
val := reflect.ValueOf(&v).Elem()
fmt.Println(val.Elem().Kind()) // struct
val.Elem().Field(0).Set(10) // PANIC! Field isn't assignable.
val.Set("a string which is not a SomeStruct")
fmt.Println(val.Elem().Kind()) // string
我在这里做了一个例子:http://play.golang.org/p/6MULn3KoNh
关于reflection - Golang 反射.值行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17385994/
我有: func NewMethodDescriptor(typ interface{}) *MethodDescriptor { reflectedMethod := reflect.Val
我需要确定地检查 reflect.Type 是否是一个错误。 错误没有反射(reflect)类型。在 go reflect 中检查类型错误的正式/惯用方式是什么? Go Playground Full
根据 reflect 文档 reflect.Value.MapIndex() 应返回一个 reflect.Value,它表示存储在 map 特定键处的数据的值.所以我的理解是以下两个表达式应该是相同的
与 reflect pkg 有点混淆 所有示例都使用 reflect.NewValue() 来获取 var 的 reflect.Value,但是 func NewValue 未记录在 http://g
在计算机语言的上下文中,我从未找到关于反射的词源的明确解释,所以我想在这里澄清一下。 “Reflection”源于拉丁语,有以下definitions : bend back turn back tu
我写了一个漂亮的函数,它可以接受 system.object ,反射(reflect)其属性并将对象序列化为 JSON 字符串。它看起来像这样: public class JSONSerializer
我正在尝试创建一个函数 import Language.Reflection foo : Type -> TT 我尝试使用reflect 策略: foo = proof { intro t
最近我和一位同事谈论 C++,感叹没有办法获取带有类字段名称的字符串并提取具有该名称的字段;换句话说,它缺乏反射(reflection)。他困惑地看着我,并问什么时候有人需要做这样的事情。 除了“嘿,
我正在考虑允许模块与属性文件中的类一起使用的想法;像 availableModules.properties Contact=org.addressbook.ContactMain Business=
这个问题特别与为具有大量字段的对象覆盖 equals() 方法有关。首先,让我说这个大对象不能在不违反 OO 原则的情况下分解成多个组件,所以告诉我“没有类应该有超过 x 个字段”无济于事。 继续前进
例子 router.Get(path, handler) // works fine methodStr = "Get" router.methodStr(path, handler) // e
我一直坚持使用反射库的问题。由于很多推荐,我决定使用它,但我只是在学习,有些部分并不是很容易.. 我有这部分代码: func countDataByName(sourceName string, s
我有一个包含一些 url 参数的特定结构,我想使用 reflect 构建一个 url 参数字符串以遍历结构字段,这样我就不会关心结构真正包含什么。 假设我有一个这样的结构: type Student
我正在尝试从 reflect.Value 中检索字符串值, 我希望 value.String()成为okok但我得到了相反。 我错过了什么吗? package main import ( "f
为了避免创建 org.reflections.Reflections 类的多个实例,我只想创建一个并根据需要重用。有谁知道这个类是否是线程安全的? 如果它不是线程安全的,我知道我可以使用 Java 的
我最近对引用、具体化和反射(reflection)感到困惑。有人可以很好地解释他们的关系和差异(如果有的话)吗? 最佳答案 引用 这可能是最简单的一个。考虑一下当您在 REPL 中键入以下内容时会发生
less main.go输出: ``` package main import ( "reflect" "net/url" "fmt" ) type User struct {
我在 golang 中使用 gorm 包 ( https://github.com/jinzhu/gorm ) 作为我的数据库库。我有很多类(数据库表),如“酒店”或“套餐”。复制代码不是好的编程习惯
我有代码 var t reflect.Type = LaunchController(route.controller) // create controller ptr . var
是否有可能以及如何在不从类型创建对象并调用它的情况下获取类型的 reflect.Type reflect.TypeOf(obj) Java 中的内容是:MyType.class 最佳答案 您可以使用以
我是一名优秀的程序员,十分优秀!