golang编程注意事项

1.不能在[]byte和string之间随意转化,如果要使用请使用[]byte来操作字符,非必要的情况下不要使用转化
    因为GO中的string类型是只读不可改变的类型,实际中我们经常会遇到改变一个字符串中的某几个字符,如果通过go中不可变的string类型来做比较麻烦,可以让原数据是[]byte类型,在改变其中几个字符的时候直接通过下标修改[]byte里面的内容,在需要string的时候通过string([]byte)生成,这有可能提高效率,还不会产生太多的子字符串浪费内存,同时导致GC任务加重。这个操作需要注意的是,string([]byte)新生成的string是重新开辟了一块内存来保存(s1 := string(byte1)),所以在强制转换之后,如果修改原来[]byte的某几个字符(byte1[1] = 'x'),这强制转换之后的string不会跟随改变(s1[1]还是原来的字符,而不是后来改变的'x')。看如下分析过程。
2.频繁创建和销毁的变量需要创建变量池
3.多协成操作公共变量需要对其加锁或者采用原子性操作,防止数据竞争。
4.尽量少使用interface{}类型的变量作为参数
5.尽量减少变量逃逸到堆
6.cgo中字符转化一定要释放内存
7.字符串的拼接最好使用strings.Builder,避免使用+拼接字符,string是一个不可变类型,+一次需要重新分配内存。
8.使用jsoniter包来处理json数据的转化

减少对象分配 所谓减少对象的分配,实际上是尽量做到,对象的重用。 比如像如下的两个函数定义:

第一个函数没有形参,每次调用的时候返回一个 []byte,第二个函数在每次调用的时候,形参是一个 buf []byte 类型的对象,之后返回读入的 byte 的数目。

第一个函数在每次调用的时候都会分配一段空间,这会给 gc 造成额外的压力。第二个函数在每次迪调用的时候,会重用形参声明。

老生常谈 string 与 []byte 转化 在 stirng 与 []byte 之间进行转换,会给 gc 造成压力 通过 gdb,可以先对比下两者的数据结构:

两者发生转换的时候,底层数据结结构会进行复制,因此导致 gc 效率会变低。解决策略上,一种方式是一直使用 []byte,特别是在数据传输方面,[]byte 中也包含着许多 string 会常用到的有效的操作。另一种是使用更为底层的操作直接进行转化,避免复制行为的发生。

少量使用+连接 string 由于采用 + 来进行 string 的连接会生成新的对象,降低 gc 的效率,好的方式是通过 append 函数来进行。

append操作 在使用了append操作之后,数组的空间由1024增长到了1312,所以如果能提前知道数组的长度的话,最好在最初分配空间的时候就做好空间规划操作,会增加一些代码管理的成本,同时也会降低gc的压力,提升代码的效率。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值