这里是一个简单的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”]不。
有人可以告诉我如何使这项工作?
大多数代码不应该需要这种动态查找。与直接访问(编译器知道Vertex结构中的X字段的偏移量,它可以将v.X编译为单个机器指令,而动态查找将需要某种类型的哈希表实现或类似)相比,它是低效的。它也禁止静态类型:编译器没有办法检查你是否试图动态访问未知字段,它不知道结果类型应该是什么。
但是…语言提供了一个reflect模块,在很少的时候,你需要这个。
package main import "fmt" import "reflect" type Vertex struct { X int Y int } func main() { v := Vertex{1,2} fmt.Println(getField(&v,"X")) } func getField(v *Vertex,field string) int { r := reflect.ValueOf(v) f := reflect.Indirect(r).FieldByName(field) return int(f.Int()) }
这里没有错误检查,所以如果你要求一个不存在的字段,或者字段不是int类型,你会得到一个恐慌。详情请查询the documentation for reflect。
原文地址:https://www.jb51.cc/go/187616.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。