我不知道新手go程序员在编写时可能会陷入哪些常见陷阱(无意中缓慢的go代码)。

1)首先,我知道在python中可以进行字符串连接(或曾经很昂贵),在尝试向字符串中添加一个元素时,这样做是一样的吗?如"你好" +"世界"。

2)另一个问题是,我发现自己经常不得不用更多字节(而不是一次1字节)的列表扩展切片。我通过执行以下操作来添加它的"肮脏"方式:

newStr := string(arrayOfBytes) + string(newBytesToAppend)

这比做类似的事情慢吗?

还是有更好的方法将整个切片附加到其他切片,或者采用内置方式?在我看来,我什至不得不编写自己的扩展函数(甚至对其进行基准测试)似乎有些奇怪。

另外,有时我最终不得不遍历字节片的每个元素,并且出于可读性考虑,我将当前字节的类型更改为字符串。如:

3)我想知道,在go中转换类型是否昂贵(特别是在字符串到数组之间),并且这是否可能是导致代码变慢的因素之一。顺便说一句,有时我几乎每次迭代都会更改类型(更改为字符串)。

但是更笼统地说,我试图在网络上搜索一些提示,这些提示通常是使go程序运行缓慢的原因,并试图对其进行更改,以使它不会(但运气不佳)。我非常清楚这取决于应用程序,但是我想知道是否有关于通常使"新手"执行代码变慢的"专家"建议。

4)我能想到的最后一件事是,有时我确实事先知道切片的长度,因此我可以只使用固定长度的数组。那会改变什么吗?

5)我也做了自己的类型,如下所示:

要么

这些会妨碍表现吗?

6)是否有一般的启发式清单需要注意以进行代码优化?例如,是否取消引用了C语言中可能存在的问题?

使用bytes.Buffer / Buffer.Write,它可以为您调整内部切片的大小,这是迄今为止管理多个[]byte的最有效方法。

关于第二个问题,使用简单的基准很容易回答。