sync.once可以控制函数只能被调用一次,不能多次重复调用。 我们可以用下面的代码实现一个线程安全的单例模式 我要晨读

已有527人晨读

进程切换只发生在内核态,两步:1 切换页全局目录以安装一个新的地址空间 2 切换内核态堆栈和硬件上下文。 另一种说法类似:1 保存CPU环境(寄存器值、程序计数器、堆栈指针)2修改内存管理单元MMU的寄存器 3 转换后备缓冲器TLB中的地址转换缓存内容标记为无效。 我要晨读

已有420人晨读

最近有人在 Gopher 的 Slack Channel 上使用 cgo,对此我感到十分担心,尤其是竟然有个组织内部打算用一个项目来展示 Go,那真是一个坏主意。对此,我曾说过很多次了,因此也许你们讨厌了我的游说,所以我想到了把它写下来并且去做。 我要晨读

已有506人晨读

推荐使用net/http作为入门起步的标准库,如果你需要路由方面功能,可使用Gorilla和Gocraft/web,Revel 和 Martini有太多的依赖注入和其他魔术让人感觉舒服,Gorilla是最小的。 我要晨读

已有702人晨读

实现一个 fibonacci 函数,返回一个函数(一个闭包)可以返回连续的斐波纳契数。 我要晨读

已有826人晨读

最初我选择的方向是LXC,因为这个技术我本身比较了解,也是比较流行的技术,我花了几天时间就把POC做好了。正好这个时候公司来了个新同事叫Susan,她以前是DotCloud的销售人员,知道我在做这个事情,建议我试试Docker。于是我又开始研究Docker,感觉是这个新生事物很多理念都非常新,但客户的需求是传统虚机用法,似乎那时的Docker并没有带来特别多的好处,而且Docker Hub的用法,CloudStack里secondary storage并不能很好的支持,所以最后我们还是采用了LXC的方案。 我要晨读

已有500人晨读

持久化数据结构简介 这篇文章里, 我们对比各种可以用来实现持久化数据结构的方案,详细介绍了 Vector Trie 这种数据结构,说明了用它实现 List 优势。 HAMT 的全称是 Hash Array Mapped Trie,它和 Vector Trie 一样,都利用了前缀树(Trie)这种数据结构作为底层数据结构, 但是由于 Map 本身和 List 之间性质的差别,HAMT 在很多方面进行了特别的处理。接下来我们先从原始 Hash Table 数据结构谈起, 逐步引出 HAMT 的设计原理。 我要晨读

已有587人晨读

随着实时分析技术的发展及成本的降低,用户已经不仅仅满足于离线分析。目前我们服务的用户包括微博、微盘、云存储、弹性计算平台等十多个部门的多个产品的日志搜索分析业务,每天处理约32亿条(2TB)日志。 我要晨读

已有492人晨读

这两天网络上被Alpha Go和李世石的围棋对决刷屏,目前Alpha Go已经2-0领先。从前年开始关注研发这套系统的DeepMind公司,一直在追终他们最新的论文。深度学习这个词随着这一事件又火了一把,可是我想说的是虽然阿尔法狗确实得益于深层神经网络的发展,但是其能超过以往的围棋AI的原因是他将深度学习和强化学习结合在一起使用,再融合传统围棋AI主要使用的蒙特卡洛树搜索方法。要知道只用深度学习的方法去解决围棋问题在几年前已经有很多人在尝试,其效果却往往还不及当前最好的围棋AI(例如:Zen,Pachi等 我要晨读

已有579人晨读

最后一个非叶子节点 : root = length/2(当length为奇数的时候root向下取整) 在GO语言中的索引位置:root - 1, 左右孩子节点:child_l = 2*root,索引位置:child_l-1,右孩子的节点: 2*root+1 索引位置. 我要晨读

已有419人晨读

时下,对于大部分 IT 玩家来说, Docker 和 Mesos 都是熟悉和陌生的:熟悉在于这两个词无疑已成为大家讨论的焦点,而陌生在于这两个技术并未在生产环境得到广泛使用,因此很多人仍然不知道它们究竟有什么优势,或者能干什么。近日, John Walter 在 Dzone 上撰文 Creating a Distributed System in 300 Lines With Mesos, Docker, and Go,讲述了 Mesos、Docker 和 Go 配合带来的强大破坏力,本文由 OneAPM 我要晨读

已有398人晨读

很多人在搞ELK,很多人也在搞Storm。更多人在用传统的Nagios、Zabbix等监控工具。Jason Dixon在2012就意识到这些工具的问题是每个人都想做到大而全,实际上我们更需要的是一对小二精的组件拼装成一个个性化的解决方案。推荐大家去看一下他的演讲视频 我要晨读

已有575人晨读

继上一篇关于inject注入的笔记,理解了martini的关键核心之一:依赖注入。注入回调函数,由运行时进行主动调用执行。这一篇主要是注解martini的骨架martini.go的实现,下面先从一个简单的martini使用实例,即创建一个最简单的http服务器开始。 我要晨读

已有511人晨读

以前,一旦业务量上去,我们就不得不停下手头的开发工作,部署业务所需要的环境及线上调试,到最后,只有特别熟悉业务和代码的同事才能胜任此工作。为了解决这些问题,我们从前年开始就关注了LXC,并试着小规模地使用了一段时间,但是由于LXC本身存在一系列的问题,比如内核版本的限制及二次开发困难,没能大规模地推广。 我要晨读

已有509人晨读

Go 语言和 Erlang 都是面向并发应用的语言,都采用轻量级线程和消息传递模型。尽管Go在语法上也支持共享,但必须以通信的方式同步方能保证其正确性。Erlang则是完全不支持进程间的共享,状态信息完全需要依靠消息彼此传递。 我要晨读

已有576人晨读

我们知道Go是一门面向系统级开发的Native编程语言,与C/C++ 类似,Go的编译器会直接将程序编译、链接成本地可执行文件。理论上,它可以完成任何C/C++语言能完成的。作为支撑该特性的重要方面,Go以标准库形式提供了syscall包,用来支持OS级系统调用。 我要晨读

已有815人晨读

作为一个 Go 语言门外汉,这段时间刚刚使用 Go 实现了一个分布式索引系统的仿真实验, 这篇文章就来总结一下实现过程和经验。 分布式储存的索引技术是分布式储存的一个技术重点,为了验证一种索引的设计, 自然要设计一个仿真测试来验证各项性能指标是否令人满意。 我要晨读

已有618人晨读

经常看到很多同学在打算使用go做开发的时候会问用什么http框架比较好。其实go的 http package 非常强大,对于一般的 http rest api 开发,完全可以不用框架就可以实现想要的功能。 我要晨读

已有801人晨读

Go的gc触发条件也与JVM的gc有很大区别。JVM通常是堆的使用到达某一阀值,或发生new操作失败时gc。而Go则是当从上次gc以来,新创建的对象大小等于上次gc以后存活下来的对象时触发gc. 这样,每次gc的压力就不会像JVM那么大,STW时间理所当然会短很多,但也牺牲了吞吐量。 我要晨读

已有519人晨读