这是一篇如何编写高效Golang语言程序的文章。这是从一些开发者的经验总结中整理出来的。根据这篇文章,你可以编写出一篇更高效的Golang程序。
尽量使用直接的类型
interface{}提供了golang中的interface类似于java的interface、PHP的interface或C++的纯虚基类。通过这种方式可以提供更快捷的编码。但是这种方式也带来了一些问题,最大的问题还是性能问题。
// method 1
a.AA()
// method 2
v.(InterfaceA).AA()
// method 3
switch v.(type) {
case InterfaceA:
v.(InterfaceA).AA()
}
这三组方法性能逐个下降,最好的方式是直接进行类型引用。
指针传参效率更高
指针传参会减少对象复制过程,效率更高。
func Call(a *Struct) uint64 {
return a.Ba
}
创建对象时避免创建引用
上面的方法效率要比下面的方法效率更高:
// method 1
new(Struct)
Struct{}
// method 2
&BigStruct{}
range遍历
常见的range方式通常是如下的方式:
for k,v := range slices {
log.Println(v)
}
或者是省略k,使用v就可以遍历整个slices。但是,实际上下面这个方法会更快,原因是这里面节省了v的拷贝,速度要比拷贝更快:
for k,_ := range slices {
log.Println(slices[k])
}
更快的运算
除法运算更慢,尝试变成乘法吧。嗯,就是这样。
更快的结构体
map方式的结构体,其他的数据方式,性能方式相差不大。效率上,硬编码 > 指针slice的range循环 > for循环,需要根据具体环境选择,毕竟相差不大。
反射会影响性能
除非必要情况下,减少反射可以提升程序的整体性能。
避免大量重复创建对象
会对GC造成负担,目前Golang的GC会导致程序暂停。连续小内存分配会导致大量的cpu消耗在scanblock这个函数上;连续make([]T, size)来分配slice还会额外导致cpu消耗在 runtime.memclr函数上。
有疑问加站长微信联系(非本文作者)