您的位置:首页 > 编程语言 > Go语言

Go游戏服务器开发的一些思考(二十一):Go语言的两处脑残设定

2017-11-04 09:28 806 查看
总体来说,使用Go语言开发,可以极大的提高生产力。

然而也有几处脑残设定,让人诟病不已。

声明与实现不分离

C++中,有.h、.cpp文件的概念。即可以做到声明与实现分离。

这种特性可以带来很多优点:

类结构清晰,方便阅读代码

支持模块间相互引用的问题

可以隐藏实现,只提供.h和.a的方式来提供库

上面的几个优点,可能对于大多数程序来说,这不是很平常的事吗,是语言不是都有这样的功能吗…

其实不是的。

Go语言的声明与实现是不可分离的(除了interface)。因此要实现上述功能。在Go中都需要做不少额外的事情。

模块间相互引用的问题

唯一的方法,设计接口类、工厂模式,来解耦2个模块间的相互引用问题。使用不当会增加不少多余的编码量

提供库问题

唯一的方法,将Go库编译成C库(会自动生成.h文件)。然后再使用Go与C混合编程。这会极大的增加编码量

因此使用Go语言来进行游戏开发时,下面2件事情通常会是一个头疼的问题:

隐藏核心代码

添加子目录,整理归类代码文件

go get问题

go get在使用上给程序提供了不少便利。不过有个小缺陷,必须吐槽下!

go get 居然没有提供一个参数来指定版本号。

go get下来的都是master上的代码!

因为官方的不支持,github上作者们也似集体失忆一样的,README.md中对自己使用的依赖库都不会做版本号的备注。

因此你在使用第3库、使用go get 的过程可能是这样的:

go get github.com/xx_author/xx_lib/…

go build,提示编译失败

找原因,发现缺少某些模块

继续 go get github.com/yy_author/yyy模块/…

继续 go build,提示编译失败

继续 找原因,发现缺少某符号

翻阅第3库的依赖库,发现真没有该符号!

git checkout 第3库的依赖库的最新的tag

继续 go build,提示编译失败

继续 git checkout 第3库的依赖库的次tag

继续 go build,提示编译失败

循环此操作… 直到编译通过…

然后记下这个库原来要使用那个库的某某版本…

已无力吐槽中…

通常遇到这种情况,最终你会输出类似下面的脚本,来避免自己重新痛苦一遍:

set GOPATH=%~dp0
go get google.golang.org/grpc/...
go get github.com/coreos/etcd/clientv3/...
cd %GOPATH%/src/github.com/coreos/etcd/clientv3
git checkout --no-track -B Branch_v3.2.9 v3.2.9 --
cd %GOPATH%/src/google.golang.org/grpc
git checkout --no-track -B Branch_v1.5.2 v1.5.2 --


Godep预告

下章将介绍如何使用Godep来管理项目中的第3方库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  go语言 游戏
相关文章推荐