回答

收藏

按名称访问结构属性

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

这是一个无效的简单 go 程序:, |) T* R6 V  X, A2 ?/ {
    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 类型,你会感到恐慌。查看文档以获取更多详细信息。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则