热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang的坑(持续更新中....)

使用golang开发新项目有一段时间了,现在逐渐对go有点失望了,但还好没有绝望。最开始草草翻阅《go语音编程》(许式伟)时,最让我眼前一亮的其实并不是协程(这个已经听了太多太多…),而

使用golang开发新项目有一段时间了,现在逐渐对go有点失望了,但还好没有绝望。

最开始草草翻阅《go语音编程》( 许式伟)时,最让我眼前一亮的其实并不是协程(这个已经听了太多太多…),而是其中对json的marshal和unmarshal,然后就了解到go可以对struct成员设置tag的特性。简单思考了一下,发现这个特性如果能够移植到我们现在的python代码中会让代码看起来更优雅一点。

随着项目的进行,对go的特性逐渐有了更深入的了解,然后越来越觉得之前有些看起来很棒的地方其实并没有想象中的那么好了。

现在开喷
  • 由于golang是一门强类型语言,所以在json unmarshal时,如果struct的定义里不是指针,那么是无法区分到底是接收到了一个默认值还是json包中没有这个参数。这个其实问题也不算太严重,只是编程时需要小心的地方之一。

  • 由于用惯了peewee,导致对golang的几个orm实现并不是很满意。在peewee中,model背后隐藏了一个dirty成员,这个成员可以记录你对那些列进行了修改,各种黑魔法(比如修改对象成员时可以通知对象)也使python实现的orm用起来十分自然、灵活。

  • go虽然说为了保持语法的简单,使用了极少的关键字,然而实际上,为了实现某些功能,又隐藏了一些奇奇怪怪的东西在里边:比如iota,以_test.go结尾的测试代码,link的时候可以指定某些变量的值….不知道随着学习的深入,还会有哪些奇怪的东西在某一天忽然跳出来。不过想想应该会比c++少吧 :)

  • 为了不让使用者随意使用go routine id做些事情,于是把go routine id给隐藏起来….官方的说法时,使用goroutine local storage时,万一忘了清理,就会很麻烦。这里有一个比较好用的gls库:tylerb/gls

  • 最值得吐槽的就是官方库的实现了吧。log包几乎没有一点实用价值,相比于python logging包中的各种handler、formatter,你会深深觉得这个东西写的太随意。这里推荐一个觉得比较好用的log包:inconshreveable/log15。后续我大概有可能会根据这个实现一个log16吧 : )

  • 对于go新颖的包导入方式….最终还是无法避免不同版本之间的兼容问题,于是搞了一个vendor。但这并不算完,曾经编译一个项目的时候提示找不到一个包,然后跑到对应的git仓库上一看,作者说”have moved to xxxx”…

  • 假设你的项目中用到了一个开源库A,并且用到了另外一个开源库B,其中B也用到了A,但是这个A是放置在B的vendor中的,那么在编译你的代码时,golang其实会把这两个当做不同的包编译进去的。好了,这其实不算是什么问题,但是万一A用到了另外一个包C中的一个全局变量!! GG

说点好的

喷了这么多,golang里边的很多包有时候还是会给人带来很意外的惊喜的,从设计上或实现的功能上,让人眼前一亮。

  • golang.org/x/net/trace:你可以通过创建一个trace对象,然后使用traceObj.LazyPrintf记录一些日志信息,同时启动默认的http server,这样你就可以在http://default-server/debug/requests这个页面查看所有正在活动中和已关闭的trace对象及其信息。


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
当即和谐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有