Golang设计/编码选择:方法链与反射的对比
Golang设计/编码选择:方法链与反射的对比 我需要创建一个UI(最终输出为HTML),正在尝试决定是使用方法链来创建UI,还是使用带有结构体标签别名(类似于我用过的标准JSON)的结构体。
方法链看起来像这样(这是可行的):
// 创建块
server_log := library.NewBlockType("server.log", "misc", setup)
// 添加一个显示'Log '的文本输出
server_log.Add(text.New("Log "))
// 下面可以生成一个HTML文本/字符串输入
// 附带一个名为'greeting'的空消息
server_log.Add(stringinput.New("greeting").Empty("greeting"))
结构体别名方法看起来会像这样(尚未编写):
type UI struct {
_ widget.Text `Log `
Greeting widget.String `empty:"greeting"`
}
...
server_log := library.NewBlockType("server.log", "misc", setup, UI{})
在我看来,结构体方法:
- 优点:自动添加’字段’的名称,如果在结构体中重复,会引发编译错误。
- 优点:看起来更整洁。
- 缺点:反射可能会带来性能问题(对我的用途来说可能性不大)。
- 缺点:没有对设置UI结构和HTML名称/键的结构体标签/别名进行编译时检查。
- 这很可能是运行时错误的来源。
方法链:
- 优点:包含对UI创建方法的编译时检查。
- 优点:如果需要,功能更强大(它只是代码)。
- 缺点:看起来不那么整洁,包含更多代码/文本。
- 缺点:必须指定名称,但该名称的重复性没有编译时检查。
- 这很可能是运行时错误的来源——有一个运行时检查可以发出警告/错误/引发恐慌。
我需要在我的应用程序中创建数百个(但不是数千个)这样的UI,它们位于各自的包中,并附带自定义的Go函数(通过setup),我正在努力减少此处的技术债务。
我认为性能并不重要,因为任何反射都只会在服务器启动时运行一次(实例数<1000)。
欢迎任何建议或个人经验分享——谢谢!
更多关于Golang设计/编码选择:方法链与反射的对比的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
另一个问题是字段顺序可能无法得到保证。
这会完全破坏我的应用程序……
参见 https://stackoverflow.com/questions/32392311/reflect-type-field-order
更多关于Golang设计/编码选择:方法链与反射的对比的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我刚刚发现一个问题——wasm(通过tinygo)不支持反射?!
实际上——tinygo 并不完全支持反射,例如下面的代码在 tinygo 沙盒中可以运行:
package main
import (
"fmt"
"reflect"
)
type Idb struct {
txt string `example`
greeting string `empty:greeting`
}
func main() {
r := reflect.TypeOf(Id{})
fmt.Println(r.Name())
for i := 0; i < r.NumField(); i++ {
fmt.Println(r.Field(i).Name, r.Field(i).Tag)
}
}
输出:
Id
txt example
greeting empty:greeting


