回答

收藏

按名称访问结构属性

技术问答 技术问答 256 人阅读 | 0 人回复 | 2023-09-12

这是一个无效的简单 go 程序:( X- _; K8 \  r) D% O# }1 E
    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]}, ?# O! C1 K& _
错误:
/ f# E( j3 [6 m# R8 t* t  Vprog.go:18: 无效操作:v[property](*Vertex 类型的索引), v+ s/ ]8 A/ [: Q/ B
我想用它的名字来访问 Vertex X 属性。如果我这样做,v.X但是v["X"]不会。' B7 e0 C) z& @9 {6 `
有人能告诉我如何做这项工作吗?- B3 r$ O; J* C* c
                                                                6 ?6 c9 f/ j8 `$ @. i
    解决方案:                                                               
: h5 d0 O. Y- r  \* [5 n0 _                                                                大多数代码不应该需要这种动态搜索。它的效率低于直接访问(编译器知道 Vertex 结构中 X 字段偏移,可以使 vX 编译成单机指令,动态搜索需要一些哈希表或类似的实现)。它还禁止静态类型:编译器无法检查你是否尝试动态访问未知字段,也无法知道结果类型应该是什么。
& N0 N8 `! i- F& m但是......这种语言为你很少需要它的情况提供了一个反射模块。+ u. I1 Q0 r$ W& z" _
[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 类型,你会感到恐慌。查看文档以获取更多详细信息。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则