回答

收藏

按名称访问结构属性

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

这是一个无效的简单 go 程序:
% F. v" U5 y, ~: ~
    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]}
    + ]* `3 q) w4 f) i! ^
错误:
# A1 ^% _& z2 W& lprog.go:18: 无效操作:v[property](*Vertex 类型的索引)" K5 b- I0 e8 f$ M+ ]  {9 M
我想用它的名字来访问 Vertex X 属性。如果我这样做,v.X但是v["X"]不会。/ C6 n# G5 I7 y3 L6 i
有人能告诉我如何做这项工作吗?* j. B5 c5 ?2 h2 b: S- H
                                                               
+ ]1 I8 \! I% L' ~8 ~% V: `    解决方案:                                                               
) q7 Q0 ~' C" P9 _* n                                                                大多数代码不应该需要这种动态搜索。它的效率低于直接访问(编译器知道 Vertex 结构中 X 字段偏移,可以使 vX 编译成单机指令,动态搜索需要一些哈希表或类似的实现)。它还禁止静态类型:编译器无法检查你是否尝试动态访问未知字段,也无法知道结果类型应该是什么。$ `6 u: \* w/ i5 \1 Q& i, a* s
但是......这种语言为你很少需要它的情况提供了一个反射模块。
; l7 @+ Z; ~3 s& b8 e[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 类型,你会感到恐慌。查看文档以获取更多详细信息。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则