我在阅读《Go编程语言》(Donovan和Kernighan所著)这本书,关于他们的例子echo1,他们说:"这是一个二次过程,如果参数数量很大,可能会很昂贵,但对于echo来说,这是不太可能的"。什么是二次过程?如果有大量参数,它为什么会很昂贵?
谢谢。
一般来说,二次方会涉及到平方数。在这个上下文中,它意味着过程的成本与输入大小的平方成正比。这是因为使用+=
操作符对字符串进行连接在Go中很昂贵,因为字符串是不可变的,并且每次连接都必须在内存中创建一个新的字符串。更有效的字符串连接方法包括将其写入bytes.Buffer
并将其转换为字符串或使用strings.Join
函数。
+
(或+=
)运算符,那么我们现在有一个问题。你从"H" + "e"
开始,创建一个长度为2的新数组,在其中复制“H”和“e”。现在你有了"He" + "l"
。新数组长度为3,拷贝进去“He”和“l”。重复这个过程直到没有字符串了。每次都会创建一个新数组,因为字符串是不可变的,所以连接操作必须创建一个新的字符串,从而创建一个新的基础数组。这意味着需要大量的分配和复制,特别是对于较早的字符串。 - Kaedys