Go游戏服务器开发的一些思考(一):语言层面
来源:互联网 发布:怎么装潢淘宝店铺 编辑:程序博客网 时间:2024/04/29 23:02
Go是比C++更好用的高级语言
使用Go作为服务器开发的主语言前,首先需要对Go语言做下定性。在接触Go前,可能给人的印象(至少是我),Go是一门脚本语言。看了 官方文档 ,才知道Go是一门高级语言。与C++相比,它有以下优势:
面向接口的编程
没有C++复杂的面向对象语法,如类、继承、多态、虚函数等等。Go中只有结构与接口,从语言层面上,直接指导功能与功能间的解耦。直接且语法简单
提供语言反射机制
提供了弱反射机制,虽然没能像脚本语言那样可以动态创建属性、方法等。但也提供了能通过字符串来操作结构体、接口的能力
编译速度很快
虽然没有同等量级的C++、Go项目做比较。但是可以明确说 Go编译速度比C++快非常多
丰富的功能包
意味着可以用更少的代码实现相同的功能
简化并发模式
暂时没仔细研究,但在做网络模块等前,需要详细了解
因此从某种角度来说,可以得出这样的结论,Go是一个比C++跟好用的高级编程语言
那么,同为高级语言,对于C++程序出身的、有服务器开发经验的人,显然所有服务器相关的概念全部可以搬过来。并可以使用Go,以更少代码量的方式实现之
引擎模块、应用逻辑框架与具体业务代码的分割线
C++服务器框架通常会使用C++来编写引擎模块、应用逻辑框架;使用脚本语言来制作具体业务逻辑。这样的好处非常明显,不管项目如何迭代,引擎模块、应用逻辑框架始终有高级程序员来维护,从而保持了服务器框架的质量
Go也可以使用 Go + 脚本语言 的方式。github上的确有go-python、golua开源项目。考虑到Go在语法、用法上,都有意朝脚本语言上靠。因此个人认为 Go + 脚本语言 的做法有些本末倒置。
Go语言提供的接口编程,天生可以很好的解决这个问题。
首先以下方式很常见:
引擎模块、应用逻辑框架 单独成包
(Go中的包类似于C++中的库)
业务逻辑层的程序应避免直接修改 引擎模块、应用逻辑框架。因为过手的人越多,最终会变得无法维护提供应用程序框架,并定义 启动 具体应用 的 接口
适配器模式。实现适配接口的具体应用,就可以通过引擎框架启动运行Go语言反射机制可以让引擎框架自动启动具体应用
结合以上功能点,Go服务器在架构上可以分成3部分:
1. 以包形式分发的Go服务器引擎 可以是源码包 也可以是go build后的2进制包文件2. 应用程序框架 利用反射机制加载具体应用(Go中表现为具体结构),并根据事先定义好的适配接口,启动具体应用 该框架实际上也会随 Go服务器引擎 一起分发,单独拎出来,主要在于它其桥梁作用,不可或缺,必须介绍3. 具体应用
ps. 上面的3部分还可以做下变形,变成 Go基础服务节点 + 具体应用的2进制包 的方式提供(类似 mysql服务器 加载 某存储引擎,如 MyISAM 、InnoDB)。我们不做某类型服务 云提供商,因此这种变形基本上是不会用到的
总结
本节主要从 Go语言性质 说起,介绍了一种 使用Go语言开发,并严格限定 引擎模块 和 具体应用的 界限。
接下来的文章,将思考Go游戏服务器应当具备哪些功能和开发路径等问题
- Go游戏服务器开发的一些思考(一):语言层面
- Go游戏服务器开发的一些思考(二十一):Go语言的两处脑残设定
- Go游戏服务器开发的一些思考(二十三):Go语言Log库封装技巧
- Go游戏服务器开发的一些思考(七):Redis
- Go游戏服务器开发的一些思考(十六):IO游戏服务器架构
- Go游戏服务器开发的一些思考(二十六):Go Redis ORM库
- Go游戏服务器开发的一些思考(十四):IO游戏同步(二)
- Go游戏服务器开发的一些思考(十七):IO游戏同步(三)
- Go游戏服务器开发的一些思考(十一):IO游戏同步
- Go游戏服务器开发的一些思考(十三):behavior3go的一些坑(备忘)
- Go游戏服务器开发的一些思考(十九):服务器架构之服务发现
- Go游戏服务器开发的一些思考(五):goroutine看似美好的陷阱
- Go游戏服务器开发的一些思考(二十五):Redis的Docker Swarm部署
- Go游戏服务器开发的一些思考(二):综合考察(上)
- Go游戏服务器开发的一些思考(三):综合考察(中)
- Go游戏服务器开发的一些思考(四):综合考察(下)
- Go游戏服务器开发的一些思考(十八):Docker内网环境搭建(备忘)
- Go游戏服务器开发的一些思考(六):Docker Swarm Mode
- thread17
- 【程序员面试金典】回文链表
- 【Spring学习笔记】依赖注入
- 视图
- typescript /javascript 中 将秒转化成时分秒
- Go游戏服务器开发的一些思考(一):语言层面
- MPAndroidChart常见设置属性(一)——应用层
- IOS Swift3.1 界面中画定位线
- webview的使用
- java范型的理解
- 336. Palindrome Pairs
- 加密解密的学习与理解
- ubuntu系统制作免费https教程
- redis