MST

星途 面试题库

面试题:Go中如何高效拼接多个字符串

在Go语言里,假设你有一个字符串切片,需要将切片里的所有字符串拼接成一个完整的字符串,简述实现的几种方式,并说明哪种方式在性能上更优及原因。
50.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用+操作符拼接

    package main
    
    import "fmt"
    
    func main() {
        strs := []string{"a", "b", "c"}
        result := ""
        for _, str := range strs {
            result = result + str
        }
        fmt.Println(result)
    }
    

    这种方式简单直观,但性能较差。每次使用+操作符都会创建一个新的字符串,随着拼接次数增多,内存分配和拷贝操作频繁,导致性能下降。

  2. 使用strings.Join函数

    package main
    
    import (
        "fmt"
        "strings"
    )
    
    func main() {
        strs := []string{"a", "b", "c"}
        result := strings.Join(strs, "")
        fmt.Println(result)
    }
    

    strings.Join函数预先计算出拼接后字符串的长度,一次性分配足够的内存,然后将各个字符串拷贝到新的字符串中,避免了多次内存分配和拷贝,性能较好。

  3. 使用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.Joinbytes.Buffer方式更优,其中strings.Join性能最佳。原因在于strings.Join针对字符串拼接做了优化,一次计算总长度并分配内存,而bytes.Buffer虽然也能减少内存分配,但在写入时可能会有一些额外的操作。使用+操作符由于频繁的内存分配和字符串拷贝,性能最差。