V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
happy11
V2EX  ›  Go 编程语言

已经实例化的结构体,能不能不使用反射,通过变量的方法来访问?

  •  
  •   happy11 · 351 天前 via iPhone · 1281 次点击
    这是一个创建于 351 天前的主题,其中的信息可能已经有所发展或是发生改变。

    var p Person {}

    p.name 这个 name 能不能通过字符串变量来代替访问?

    类似 js 的 p[“aa”+bb]

    请问这样设计的考虑是什么? 因为 p 和 p 的成员在编译的时候都已经确定了 为什么还不能通过变量来确定访问的是哪一个?

    8 条回复    2023-05-18 14:36:06 +08:00
    codehz
        1
    codehz  
       351 天前 via iPhone
    主要是能做到这件事的,by definition 就是叫反射(
    Js 可以做是因为按定义,js object 就是 hash table
    lisongeee
        2
    lisongeee  
       351 天前
    呃呃,不知道 go 有没有编译插件,编译的时候扫描 AST ,直接生成你想要的方法就行,这样也不需要反射
    aloxaf
        3
    aloxaf  
       350 天前   ❤️ 1
    编译后的代码访问 p.name 时靠的是偏移,而不是成员名。假设 p 的地址是 0x1234 ,那访问 p.name 可能就编译成 *(0x1234 + 0)、p.age 就编译成 *(0x1234 + 8)、p.gender 编译成 *(0x1234 + 12)……
    要想通过成员名称来访问,你就得自己算这个偏移关系,对于有些语言,你或许还得自己维护一份符号表——然后你的这个行为,就叫反射
    NessajCN
        4
    NessajCN  
       350 天前
    你要用变量当 key 为啥不用 map
    matrix1010
        5
    matrix1010  
       350 天前
    Go 不是 js 不追求灵活性。获取 struct 的 field 直接.name 肯定是最明确的,额外增加一种方法反而会提高语言复杂度和开发者阅读 /维护成本
    bugfan
        6
    bugfan  
       350 天前
    可以的,去研究一下 golang 的 reflect 包,实例化之后依然可以通过反射更改里面的属性或者方法。很多框架都是基于反射做的。
    https://github.com/bugfan/rest
    这个是我做的自动生成 curd api 的框架,其中就用到了大量反射😄
    guonaihong
        7
    guonaihong  
       350 天前
    用反射库做,看下 FieldByName 这个 api 。当然反射性能差,慎用。
    jones2000
        8
    jones2000  
       350 天前
    把类里所有变量,都建立对应的变量指针, 放到 map 里面, 这样通过名字就可以获取到这些变量指针, 然后就可以用了。重载[]这个操作符, 基本就可以了,也不需要什么反射了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   958 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:32 · PVG 07:32 · LAX 16:32 · JFK 19:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.