switch val:= inf.(type){
case A: val.sum = val.x+val.y+val.z
case B: val.sum = val.x+val.y+val.z
case C: val.sum = val.x+val.y+val.z
case D: val.sum = val.x+val.y+val.z
case E: val.sum = val.x+val.y+val.z
}
我写的是游戏服务器, 模拟物理引擎. 有几十种形状, 形状的属性还有各种差异, 又要把这些形状分组存放到map[][interface]中;
总之十分复杂;
a. 使用接口模式: 比如获取形状type, 使用getType()接口, 然后呢? .(type)又没法存储, 如何转换为具体类型? 只能是switch, 就像上面代码那样.
b.所有属性获取全部接口化, 这浪费性能, 也无意义;
在没有泛型的情况下, 复杂项目如何解决这interface类型转换问题?
难道只能switch val:= inf.(type), 甚至每个方法都要加上这复杂的代码? // 注: 用switch val:= inf.(type) 比直接使用接口性能更好.
没有泛型真是没法开发, 只能用interface{} + 重复代码, 或 switch val:= inf.(type) 浪费性能曲线解决问题;
所以, 是不是要换语言, 直接上C++ / RUST?
用C++代码演示我想要的功能:
![捕获.PNG](https://static.studygolang.com/210204/4bcc54bfb7eaa51672a5ead2eed007c0.PNG)![捕获.PNG]
说到内存逃逸,其实GC类的语言都避免不了这个问题的, 一味的追求所有分配都在协程的小栈上是不现实的也是没必要的. 如果逻辑对性能实时性要求很高, 是不适合使用GC类的语言开发的.如果不喜欢java的臃肿, 或许你可以试试现在被吹成神的.net core. 在oo方面应该比go 好太多了. go其实不是为了解决业务模型问题出现的.它只是一个带反射和GC的C语言增强版而已. 以后go的发展也未必按照取代java或者其他OO的语言的路数走.趁着还热乎, 不如就换了吧. 小声建议尝试一下.net core.
#16
更多评论
首先,go本身目前的生态就是个高效并发的脚本语言。不能无代价抽象,该用c/rust的地方当然要用。
其次,type当然可以保存啊,reflect.Type,你的点在哪里?
第三 ,你是要实现ecs模型?
#1