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

2023-05-17 22:34:36 +08:00
 happy11

var p Person {}

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

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

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

1413 次点击
所在节点    Go 编程语言
8 条回复
codehz
2023-05-18 00:37:44 +08:00
主要是能做到这件事的,by definition 就是叫反射(
Js 可以做是因为按定义,js object 就是 hash table
lisongeee
2023-05-18 01:33:17 +08:00
呃呃,不知道 go 有没有编译插件,编译的时候扫描 AST ,直接生成你想要的方法就行,这样也不需要反射
aloxaf
2023-05-18 09:01:27 +08:00
编译后的代码访问 p.name 时靠的是偏移,而不是成员名。假设 p 的地址是 0x1234 ,那访问 p.name 可能就编译成 *(0x1234 + 0)、p.age 就编译成 *(0x1234 + 8)、p.gender 编译成 *(0x1234 + 12)……
要想通过成员名称来访问,你就得自己算这个偏移关系,对于有些语言,你或许还得自己维护一份符号表——然后你的这个行为,就叫反射
NessajCN
2023-05-18 09:03:04 +08:00
你要用变量当 key 为啥不用 map
matrix1010
2023-05-18 09:47:04 +08:00
Go 不是 js 不追求灵活性。获取 struct 的 field 直接.name 肯定是最明确的,额外增加一种方法反而会提高语言复杂度和开发者阅读 /维护成本
bugfan
2023-05-18 09:56:47 +08:00
可以的,去研究一下 golang 的 reflect 包,实例化之后依然可以通过反射更改里面的属性或者方法。很多框架都是基于反射做的。
https://github.com/bugfan/rest
这个是我做的自动生成 curd api 的框架,其中就用到了大量反射😄
guonaihong
2023-05-18 11:07:12 +08:00
用反射库做,看下 FieldByName 这个 api 。当然反射性能差,慎用。
jones2000
2023-05-18 14:36:06 +08:00
把类里所有变量,都建立对应的变量指针, 放到 map 里面, 这样通过名字就可以获取到这些变量指针, 然后就可以用了。重载[]这个操作符, 基本就可以了,也不需要什么反射了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/940829

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX