加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

GoLang:按名称访问struct属性

发布时间:2020-12-16 09:42:07 所属栏目:大数据 来源:网络整理
导读:这里是一个简单的go程序不工作: 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]} 错误:prog.go
这里是一个简单的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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读