Go游戏服务器开发的一些思考(二十一):Go语言的两处脑残设定
2017-11-04 09:28
806 查看
总体来说,使用Go语言开发,可以极大的提高生产力。
然而也有几处脑残设定,让人诟病不已。
这种特性可以带来很多优点:
类结构清晰,方便阅读代码
支持模块间相互引用的问题
可以隐藏实现,只提供.h和.a的方式来提供库
上面的几个优点,可能对于大多数程序来说,这不是很平常的事吗,是语言不是都有这样的功能吗…
其实不是的。
Go语言的声明与实现是不可分离的(除了interface)。因此要实现上述功能。在Go中都需要做不少额外的事情。
模块间相互引用的问题
唯一的方法,设计接口类、工厂模式,来解耦2个模块间的相互引用问题。使用不当会增加不少多余的编码量
提供库问题
唯一的方法,将Go库编译成C库(会自动生成.h文件)。然后再使用Go与C混合编程。这会极大的增加编码量
因此使用Go语言来进行游戏开发时,下面2件事情通常会是一个头疼的问题:
隐藏核心代码
添加子目录,整理归类代码文件
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,提示编译失败
循环此操作… 直到编译通过…
然后记下这个库原来要使用那个库的某某版本…
已无力吐槽中…
通常遇到这种情况,最终你会输出类似下面的脚本,来避免自己重新痛苦一遍:
然而也有几处脑残设定,让人诟病不已。
声明与实现不分离
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游戏服务器开发的一些思考(一):语言层面
- Go游戏服务器开发的一些思考(二十四):命令行库封装技巧
- Go游戏服务器开发的一些思考(三十):排行榜服务器设计思路
- Go游戏服务器开发的一些思考(二十二):Godep包管理介绍
- Go游戏服务器开发的一些思考(二):综合考察(上)
- Go游戏服务器开发的一些思考(二十八):登录流程(一)
- Go游戏服务器开发的一些思考(三十六):无缝世界场景构建与同步(三)
- Go游戏服务器开发的一些思考(十二):行为树behavior3go介绍
- Go游戏服务器开发的一些思考(三十二):关于无缝世界的一些思考
- Go游戏服务器开发的一些思考(五):goroutine看似美好的陷阱
- Go游戏服务器开发的一些思考(三十一):排行榜服务器设计思路(二)
- Go游戏服务器开发的一些思考(二十三):Go语言Log库封装技巧
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
- Go游戏服务器开发的一些思考(七):Redis
- Go游戏服务器开发的一些思考(十六):IO游戏服务器架构
- Go游戏服务器开发的一些思考(二十六):Go Redis ORM库
- Go游戏服务器开发的一些思考(十八):Docker内网环境搭建(备忘)
- Go游戏服务器开发的一些思考(三十七):无缝世界场景构建与同步(四)
- Go游戏服务器开发的一些思考(三十四):无缝世界场景构建与同步(一)
- Go游戏服务器开发的一些思考(十四):IO游戏同步(二)