面试题答案
一键面试-
使用
+
操作符拼接:package main import "fmt" func main() { strs := []string{"a", "b", "c"} result := "" for _, str := range strs { result = result + str } fmt.Println(result) }
这种方式简单直观,但性能较差。每次使用
+
操作符都会创建一个新的字符串,随着拼接次数增多,内存分配和拷贝操作频繁,导致性能下降。 -
使用
strings.Join
函数:package main import ( "fmt" "strings" ) func main() { strs := []string{"a", "b", "c"} result := strings.Join(strs, "") fmt.Println(result) }
strings.Join
函数预先计算出拼接后字符串的长度,一次性分配足够的内存,然后将各个字符串拷贝到新的字符串中,避免了多次内存分配和拷贝,性能较好。 -
使用
bytes.Buffer
:package main import ( "bytes" "fmt" ) func main() { strs := []string{"a", "b", "c"} var buffer bytes.Buffer for _, str := range strs { buffer.WriteString(str) } result := buffer.String() fmt.Println(result) }
bytes.Buffer
也会预先分配足够的内存,在写入字符串时,通过不断扩展缓冲区来容纳新的数据,减少了内存分配次数,性能较好。
性能比较及原因:在性能上,strings.Join
和bytes.Buffer
方式更优,其中strings.Join
性能最佳。原因在于strings.Join
针对字符串拼接做了优化,一次计算总长度并分配内存,而bytes.Buffer
虽然也能减少内存分配,但在写入时可能会有一些额外的操作。使用+
操作符由于频繁的内存分配和字符串拷贝,性能最差。