package mainimport "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]} # n2 J- a( Z/ J* c F# I$ Z
错误: K4 o F; Y( _' P4 T8 ]) @prog.go:18: 无效操作:v[property](*Vertex 类型的索引) m$ Z/ f! R8 e' n" j4 C我想用它的名字来访问 Vertex X 属性。如果我这样做,v.X但是v["X"]不会。 + G* m& r3 A+ Y$ {) H有人能告诉我如何做这项工作吗?+ g% f8 [+ a) n: _3 v% z8 U0 C
3 [* m8 E1 B9 _6 ^% P* N% x 解决方案: 5 k, N& p1 }& i! v
大多数代码不应该需要这种动态搜索。它的效率低于直接访问(编译器知道 Vertex 结构中 X 字段偏移,可以使 vX 编译成单机指令,动态搜索需要一些哈希表或类似的实现)。它还禁止静态类型:编译器无法检查你是否尝试动态访问未知字段,也无法知道结果类型应该是什么。 & j) E5 L3 F' G但是......这种语言为你很少需要它的情况提供了一个反射模块。" C0 F6 ]/ g; [
[code]package mainimport "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()code]这里没有错误的检查,所以如果你要求一个不存在的字段,或者这个字段不是 int 类型,你会感到恐慌。查看文档以获取更多详细信息。