Questions tagged «go-reflect»

有关实现运行时反射(允许程序处理任意类型的对象)的Go“ reflect”包的问题。

14
如何在Go中找到对象的类型?
如何在Go中找到对象的类型?在Python中,我只是typeof用来获取对象的类型。类似地,在Go中,是否可以实现相同的方法? 这是我要迭代的容器: for e := dlist.Front(); e != nil; e = e.Next() { lines := e.Value fmt.Printf(reflect.TypeOf(lines)) } 在这种情况下,我无法获取对象线的类型,即字符串数组。
387 go  go-reflect 


6
类型转换接口片
我很好奇为什么Go 不会隐式转换[]T为[]interface{},而Go 会隐式转换T为interface{}。我缺少这种转换的重要内容吗? 例: func foo([]interface{}) { /* do something */ } func main() { var a []string = []string{"hello", "world"} foo(a) } go build 抱怨 不能在函数参数中使用(类型[]字符串)作为类型[] interface {} 如果我尝试明确执行此操作,则会遇到同样的事情:b := []interface{}(a)抱怨 无法将(类型[]字符串)转换为类型[] interface {} 因此,每次我需要进行这种转换时(这似乎很多),我一直在做这样的事情: b = make([]interface{}, len(a), len(a)) for i := range a { b[i] = a[i] …

5
如何比较两个结构,切片或映射是否相等?
我想检查两个结构,切片和映射是否相等。 但是我遇到了以下代码的问题。在相关行中查看我的评论。 package main import ( "fmt" "reflect" ) type T struct { X int Y string Z []int M map[string]int } func main() { t1 := T{ X: 1, Y: "lei", Z: []int{1, 2, 3}, M: map[string]int{ "a": 1, "b": 2, }, } t2 := T{ X: 1, Y: …
131 go  go-reflect 

3
在Go中遍历结构的字段
基本上,(我知道)迭代a的字段值的唯一方法struct是这样的: type Example struct { a_number uint32 a_string string } //... r := &Example{(2 << 31) - 1, "...."}: for _, d:= range []interface{}{ r.a_number, r.a_string, } { //do something with the d } 我想知道,是否有更好,更通用的实现方法[]interface{}{ r.a_number, r.a_string, },所以我不需要单独列出每个参数,或者有没有更好的方法遍历结构? 我试图浏览一下reflect包装,但是碰到了墙,因为我不确定一旦取回该怎么办reflect.ValueOf(*r).Field(0)。 谢谢!
107 go  go-reflect 

2
使用reflect,如何设置结构字段的值?
在使用reflect包处理结构字段时遇到了麻烦。特别是,还没有弄清楚如何设置字段值。 输入t struct {fi int; fs字符串} var rt = t {123,“ jblow”} var i64 int64 = 456 获取字段i的名称-这似乎起作用 var field = reflect.TypeOf(r).Field(i).Name 以a)接口{},b)int的形式获取字段i的值-这似乎可行 var iface interface{} = reflect.ValueOf(r).Field(i).Interface() var i int = int(reflect.ValueOf(r).Field(i).Int()) 设置字段i的值-尝试一次-紧急 reflect.ValueOf(r).Field(i).SetInt( i64 ) 恐慌:使用未导出字段获得的值来反映reflect.Value·SetInt 假设它不喜欢字段名称“ id”和“ name”,因此将其重命名为“ Id”和“ Name” a)这个假设正确吗? b)如果正确,则认为没有必要,因为在同一文件/软件包中 设置字段i的值-尝试两个(字段名大写)-紧急 reflect.ValueOf(r).Field(i).SetInt( 465 ) reflect.ValueOf(r).Field(i).SetInt( …

2
如何在Go中获取函数名称?
给定一个函数,可以得到它的名字吗?说: func foo() { } func GetFunctionName(i interface{}) string { // ... } func main() { // Will print "name: foo" fmt.Println("name:", GetFunctionName(foo)) } 有人告诉我runtime.FuncForPC会有所帮助,但我不明白如何使用它。

3
接口{}的范围,它存储一个切片
给定您具有接受功能的场景t interface{}。如果确定t是切片,我如何range在该切片上? func main() { data := []string{"one","two","three"} test(data) moredata := []int{1,2,3} test(data) } func test(t interface{}) { switch reflect.TypeOf(t).Kind() { case reflect.Slice: // how do I iterate here? for _,value := range t { fmt.Println(value) } } } 前往游乐场示例:http://play.golang.org/p/DNldAlNShB

3
通过名称访问结构属性
这是一个不起作用的简单go程序: package main import "fmt" type Vertex struct { X int Y int } func main() { v := Vertex{1, 2} fmt.Println(getProperty(&v, "X")) } func getProperty(v *Vertex, property string) (string) { return v[property] } 错误: prog.go:18:无效的操作:v [属性](*顶点类型的索引) 我想要的是使用名称访问Vertex X属性。如果我这样做,v.X它会起作用,但v["X"]不会。 有人可以告诉我如何进行这项工作吗?
76 go  go-reflect 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.