前言
在go语言中,因为字符串只能被访问,不能被修改,所以进行字符串拼接的时候,golang都需要进行内存拷贝,造成一定的性能消耗。
方式1:操作符 +
特点:简单,可读性良好。每次拼接都会产生内存拷贝,性能一般。仅适用于字符串类型的变量。
示例代码:
str1 := "hello " str2 := "world" fmt.Println(str1 + str2) // hello world
方式2:strings.Join
特点:只能用于拼接字符串类型的切片。
示例:
slice1 := []string{"a","b","c"} fmt.Println(strings.Join(slice1," ")) // a b c fmt.Println(strings.Join(slice1,"")) // abc
方式3:fmt.Sprint
标准库 fmt 中的 Sprint,Sprintf 和 Sprintln 方法,也是比较常用的一种字符串拼接方式,它的特点是可以拼接其它类型,涉及类型转换,底层实现使用 []byte
字节切片,但是性能一般,所以,该方式适用于少量包含其它非字符串类型变量进行字符串拼接的场景。
示例:
str1 := "hello " str2 := "world" str4 := fmt.Sprint(str1,str2) fmt.Println(str4) str5 := fmt.Sprintf("name is %s, and age is %d \n",str2, 17) fmt.Println(str5)
方式4:bytes.Buffer类型
标准库 bytes 中的 Buffer 类型,该类型中 WriteString 方法和 String 方法配合使用,也可以实现字符串拼接,它的特点是可以拼接字符串、字符和 Unicode,底层实现使用 []byte
,但是涉及 string
和 []byte
之间的转换,性能一般,因为 WriteString 方法使用的 buffer 太长,会导致 panic,所以,该方式适用于少量字符变量和字符串变量进行字符串拼接的场景。
示例代码:
import "bytes" var b bytes.Buffer b.WriteString("My ") b.WriteString("name ") b.WriteString("is ") b.WriteString("Bob.") str6 := b.String() fmt.Println(str6) // My name is Bob.
方式5:strings.Builder 类型
标准库 strings 中的 Builder 类型,该类型中 WriteString 方法和 String 方法配合使用,也可以实现字符串拼接,使用方式和 bytes.Buffer 相同,可以拼接字符串、字符和 Unicode,也会涉及 string
和 []byte
之间的转换,但是,它使用 unsafe.Pointer
优化了 string
和 []byte
之间的转换,所以,在大量字符串拼接的场景,推荐使用该种方式。
示例代码:
var c strings.Builder c.WriteString("My ") c.WriteString("name ") c.WriteString("is ") c.WriteString("Hanlei.") str7 := c.String() fmt.Println(str7) // My name is Hanlei.