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]
另外,以我之前说的抽象的角度来看
你的这个代码应该抽象出一个 struct Point{x,y int}
然后Point上实现 GetX和GetY的方法。Cricle和Rect里匿名嵌入 Point
当然,我知道这不是实际的业务场景。但根据你的业务场景的描述,出现interface{}是不合适的。
#9
更多评论
首先,go本身目前的生态就是个高效并发的脚本语言。不能无代价抽象,该用c/rust的地方当然要用。
其次,type当然可以保存啊,reflect.Type,你的点在哪里?
第三 ,你是要实现ecs模型?
#1