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]
我的推测是
提问者可能不熟悉oop或者类似强oop语言的代码写法,不知道遇到场景要先抽象。
什么都放map[string]interface{]在 类oop的代码里是不理性的。很可能之前写的是动态/脚本语言。
然后,就算是脚本语言,在提问者的场景下,只要函数是第一成员,也应该使使用函数数组(比如js,而且js本身就面对渲染,有完整的event机制)。 不需要下标完全没有使用map的必要,怎么看都应该是被语言限制了。
然后,如果我的推测的成立的话,脚本语言,函数不是第一成员,array和hash表不敏感……
我猜提问者可能之前是写php的,想做一个自己的游戏引擎,想选择一个高性能的开发语言,但发现按他的想法写出来很麻烦(性能这东西要实际引擎运行起来跑benchmark才有意义)。
属于无端猜测,仅供一笑……
#5
更多评论
首先,go本身目前的生态就是个高效并发的脚本语言。不能无代价抽象,该用c/rust的地方当然要用。
其次,type当然可以保存啊,reflect.Type,你的点在哪里?
第三 ,你是要实现ecs模型?
#1