Go 程序的性能调试问题
Let's assume you have a Go program and want to improve its performance. There are several tools available that can help with this task. These tools can help you to identify various types of hotspots (CPU, IO, memory), hotspots are the places that you...阅读全文
go语言的官方包sync.Pool的实现原理和适用场景
已经使用golang有一段时间,go的协程和gc垃圾回收特性的确会提高程序的开发效率。但是毕竟是一门新语言,如果对于它的机制不了解,用起来可能会蹦出各种潘多拉盒子。今天就讲讲我在项目中用到的sync包的Pool类的使用,以免大家混淆使用。 众所周知,go是自动垃圾回收的(garbage collector),这大大减少了程序编程负担。但gc是一把双刃剑,带来了编程的方便但同时也增加了运行时开销,使用不当甚至会严重影响程序的性能。因此性能要求高的场景不能任意产生太多的垃圾(有gc但又不能完全依赖它...阅读全文
golang go语言与C语言互调,通过cgo
1. good links: http://tonybai.com/2012/09/26/interoperability-between-go-and-c/ http://www.mischiefblog.com/2014/06/26/example-cgo-golang-app-that-calls-a-native-library-with-a-c-structure/ http://tonybai.com/2016/02/21/some-changes-in-go-1-6/ http:/...阅读全文
理解Go语言的nil
最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频。 nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于nil的时候,说明出现某些错误了,需要我们对这个错误进行一些处理,而如果等于nil说明运行正常。那什么是nil呢?查一下词典可以知道,nil的意思是无,或者是零值。零值,zero value,是不是有点...阅读全文
Go调优神器trace介绍
你想知道你的Go程序在做什么吗? go tool trace可以向你揭示:Go程序运行中的所有的运行时事件。 这种工具是Go生态系统中用于诊断性能问题时(如延迟,并行化和竞争异常)最有用的工具之一。 在我之前的博客文章中,我提到我们在Pusher中使用go tool trace来跟踪为何Go垃圾收集器有很长的停顿时间。 在这篇博文中,我更加深入的介绍go toll trace。go tool trace 试用go tool trace可以显示大量的信息,所以从哪里开始是个问题。 我们首先简要介绍...阅读全文
Golang精编100题
能力模型 级别 模型 初级primary 熟悉基本语法,能够看懂代码的意图;在他人指导下能够完成用户故事的开发,编写的代码符合CleanCode规范; 中级intermediate 能够独立完成用户故事的开发和测试;能够嗅出代码的坏味道,并知道如何重构达成目标; 高级senior 能够开发出高质量高性能的代码;能够熟练使用高级特性,开发编程框架或测试框架; 选择题 [primary] 下面属于关键字的是()A. funcB. defC. structD. class 参考答案:AC [prima...阅读全文
Go语言TCP网络编程(详细)
一、序言 Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,so...阅读全文
[译] 服务端I/O性能大比拼:Node、PHP、Java和Go
服务端I/O性能大比拼:Node、PHP、Java和Go 原文请见:Server-side I/O Performance: Node vs. PHP vs. Java vs. Go。 理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异。若应用程序比较小,也没有服务于很高的负载,也许它影响甚微。但随着应用程序的负载逐渐上涨,采用错误的I/O模型有可能会让你到处踩坑,伤痕累累。 正如大部分存在多种解决途径的场景一样,重点不在于哪一种途径更好,而是在于理解如...阅读全文
CentOS6.8配置GO语言开发环境
鉴于越来越多的开源项目都采用Go为开发语言,本文介绍Linux(CentOS 6.8)下GO开发环境的搭建与使用。 一、Go安装使用 1、下载Go源码包 https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz 上传到/usr/local/src目录下 2、编译安装Go到/usr/local tar zxvf go1.6.3.linux-amd64.tar.gz -C /usr/local/ #注:必须使用root账户或者使...阅读全文
仅需简单 5 步,给你的 Golang 程序添加 GUI (使用 Electron )
创建一个 Golang app 是一件简单又轻松的事情,但是有时候你想给你的应用锦上添花:创建一个 GUI! 在本篇文章中,我将通过使用 astilectron 工具中的 bootstrap 以及 bundler 给一个简单的 Golang 程序添加 GUI。 我们的带有 GUI 的 Golang app 能够打开一个文件夹并且展示其中的内容。 你可以在这里找到完成后的 [代码](https://github.com/asticode/go-astilectron-demo) ...阅读全文
Golang命名规范
Golang命名规范 image 文件名 整个应用或包的主入口文件应当是 main.go 或与应用名称简写相同。例如:Gogs 的主入口文件名为 gogs.go。 函数或方法 若函数或方法为判断类型(返回值主要为 bool 类型),则名称应以 Has, Is, Can 或 Allow 等判断性动词开头: func HasPrefix(name string, prefixes []string) bool { ... } func IsEntry(name string, entries []s...阅读全文
Go 函数调用 ━ 栈和寄存器视角
函数的调用过程主要要点在于借助寄存器和内存帧栈传递参数和返回值。虽然同为编译型语言,Go 相较 C 对寄存器和栈的使用有一些差别,同时,Go 语言自带协程并引入 defer 等语句,在调用过程上显得更加复杂。 理解Go函数调用在CPU指令层的过程有助于编写高效的代码,在性能优化、Bug排查的时候,能更迅速的确定要点。本文以简短的示例代码和对应的汇编代码演示了Go的调用过程,展示了不同数据类型的参数的实际传递过程,同时分析了匿名函数、闭包作为参数或者返回值传递时,在内存上的实际数据结构。对于协程对...阅读全文