当前位置: 首页 > 面试题库 >

通过名称访问结构属性

司空宣
2023-03-14
问题内容

这是一个不起作用的简单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字段的偏移量,可以将vX编译为单个机器指令,而动态查找则需要某种哈希表实现或类似方法)。它还禁止静态类型输入:编译器无法检查您是否没有尝试动态访问未知字段,并且它不知道结果类型应该是什么。

但是…语言为您很少需要的时候提供了一个反射模块。

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,您将感到恐慌。检查文档以了解更多详细信息。



 类似资料:
  • 问题内容: 我正在尝试反序列化JSON。我的根对象具有单个属性“ en.pickthall”。我正在使用动态类型读取JSON。我以为我可以取消“。” 在属性中,因为它是本地JSON文件,但是必须有某种方法可以访问此类属性 问题答案: C#没有任何引用标识符的方式。如果不是有效的标识符,则唯一的选择就是反射。 但是,您的JSON解串器返回的对象可能会更改了标识符,以使其在C#中可用- 您可能希望枚举

  • 问题内容: 如何使用JavaScript(纯文本或jQuery)获取和设置CSS自定义属性(在样式表中使用过的属性)? 这是我失败的尝试:单击按钮会更改常规属性,但不会更改自定义属性: 问题答案: 您可以使用:

  • 反射值对象(reflect.Value)提供对结构体访问的方法,通过这些方法可以完成对结构体任意值的访问,如下表所示。 反射值对象的成员访问方法 方  法 备  注 Field(i int) Value 根据索引,返回索引对应的结构体成员字段的反射值对象。当值不是结构体或索引超界时发生宕机 NumField() int 返回结构体成员字段数量。当值不是结构体或索引超界时发生宕机 FieldByNa

  • 问题内容: 我在这里找到了一个函数调用http://golang.org/pkg/reflect/#Value.MethodByName,但这并不是我想要的!(也许是因为我不知道如何使用它……我找不到任何示例)。我想要的是: 所以我想,首先我需要类似的东西,然后将其用于,对!! 问题答案: 要在对象上调用方法,请先使用。然后按名称查找方法,然后最后调用找到的方法。例如:

  • 例如,我有照片、公司、汽车等实体。我知道它们有同名的列,我可以通过QueryBuilder访问它们。我不知道我将处理哪个存储库,但它像字符串参数一样传递给我的函数。这样地: 事实上,我想检查用户是否可以通过单独的函数访问给定ID的实体,而不是绑定到一个实体。 是否可以仅通过字符串初始化TypeORM中实体的存储库或QueryBuilder?

  • 问题内容: 我正在使用JSON将一些值从外部源获取到变量中。 我有一个这样的类型,将值放入: 解组后,我可以通过以下方式访问类型: 但是如果我尝试做类似的事情: 编译器抱怨没有这样的值。 所以我的问题是,我如何根据某些条件引用我知道会存在的Go属性? 做到这一点: 但这不是很灵活,因为我将收到不同的。 问题答案: 会尽力将数据放置在最适合您的类型的位置。从技术上讲,您的第一个示例将起作用,但是即使