敲代码三年了,刚从Java开始,我就一直秉持着当使用循环时我尽量把临时的局部变量定义再循环体外,因为这样可以节约内存的开销,毕竟没声明一个变量,系统都要给他分配地址,都要消耗内存,请看下面代码:
for i := 0; i < 100; i++ {
var tmp = strconv.Itoa(i)
fmt.Println(&tmp,":",tmp)
}
fmt.Println("*****************************************")
var tmp string
for i := 0; i < 100; i++ {
tmp = strconv.Itoa(i)
fmt.Println(&tmp,":",tmp)
}
打印:
在这点代码里,上面的for循环会为tmp内存开辟一百个地址!而下面的始终只分配了一个地址,变化的只是值。
为了代码的质量,我一直把变量的定义放在循环体外。直到今天,直到刚刚,昨晚我用go去读取一个本地的大数据文本,是一个1.5G的txt文件,我要把里面的数据读取到MySQL中去,昨天就写好了,可是执行后我发现总是有重复的写入!我又把业务逻辑梳理了一遍,一遍又一遍,从打开数据库建立连接,打开大数据文本,bufio的读取,数据的截取,转换go数据,写入通道(因为数据量庞大,我开了1000的并发协程,把通道的容量设定为10e6)……一遍又一遍的把业务逻辑梳理了,最后我坚