我是新来的Go
,也对新的概念reflection
,但应该和可以的使用反映包避免Go
?是否存在reflect
不可避免的情况?
有一些问题域,反射使编写可重用库变得更容易:
编组/解组,标准库中的大量示例,例如encoding/json
,encoding/xml
格式化,例如text/template
,html/template
,fmt.Printf
.
但是,使用反射需要付出代价:
编译时错误成为运行时错误(例如fmt.Printf("%d", stringVariable)
)
表现变得更糟
通常存在一种替代解决方案,其不需要诸如代码生成之类的反射,其由诸如protobuf或thrift的编组库使用.
我同意@volker的说法,只有当你知道它会简化现有代码并了解所有缺点时,才应该使用反射.
你应该避免反思.
某些软件包(例如fmt)无法在没有反射的情况下实现,因为您无法在所有现有和即将推出的类型上进行类型切换.
如果你是Go的新手:远离反思.