GO语言进阶与依赖管理 | 青训营笔记

87 阅读2分钟

在讲解1.1 Goroutine的快速打印 hello goroutine : 0~hello goroutine : 4 中,在函数 hello 中的打印 println("hello goroutine:" + fmt.Sprint(i)) 在 golang 中会报 Cannot use '"hello goroutine:" + fmt.Sprint(i)' (type string) as the type int 的错误。这个错误是因为在尝试将一个字符串类型的值和一个整数类型的值相加时,Go 语言编译器会抛出一个类型不兼容的错误。不过可以运行成功。我们可以将它改成 fmt.Printf("hello goroutine:%v\n", i) ,这样就不会报错了。

字符串的拼接

第一种

字符串的拼接最常用的方法就是使用"+"进行连接,这种方式使用起来最简单,基本所有语言都有提供这种方式,使用+操作符进行拼接时,会对字符串进行遍历,计算并开辟一个新的空间来存储原来的两个字符串。例如:

s := "第一部分" + "第二部分"
fmt.Println(s)
var s string
s += "一二三"
s += "四五六"
fmt.Println(s)

第二种

使用 sprintf 拼接字符串,可以实现任意数据类型的拼接。fmt.Sprintf实现原理主要是使用到了反射,反射会产生性能的损耗。例如:

const name, age = "kim", 22
a := "二十二"
b := age
A := fmt.Sprintf("%s is %d(%s) years old.\n", name, b, a)
fmt.Println(A)

第三种

使用 Strings.builder 进行字符拼接。Strings.builder 是 Go 语言提供了一个专门操作字符串的库 strings ,使用 strings.Builder 可以进行字符串拼接,提供了 writeString 方法拼接字符串。例如:

s1 := "hello"
s2 := "world"
var stringBuilder strings.Builder
stringBuilder.WriteString(s1)
stringBuilder.WriteString(s2)
fmt.Printf("拼接后的字符串:%s\n", stringBuilder.String())

第四种

使用 join 函数拼接,使用 Join 拼接字符串,实际上是将字符串数组连接起来,还可以将一个 string 类型的切片拼接成一个字符串,另外 strings.join 也是基于 strings.builder 来实现的。例如:

str1 := "hello"
str2 := "world"
var str = []string{str1, str2}
str3 := strings.Join(str, "")
fmt.Println("str3 =", str3)
baseSlice := []string{"hello", "world"}
s := strings.Join(baseSlice, "")
fmt.Println(s)

总结

  • 当进行少量字符串拼接时,直接使用"+"操作符进行拼接字符串,效率还是挺高的,但是当要拼接的字符串数量上来时,"+"操作符的性能就比较低了。
  • 函数 fmt.Sprintf 还是不适合进行字符串拼接,无论拼接字符串数量多少,性能损耗都很大,还是老老实实做他的字符串格式化就好了;
  • strings.Builder 无论是少量字符串的拼接还是大量的字符串拼接,性能一直都能稳定,这也是为什么 Go 语言官方推荐使用 strings.builder 进行字符串拼接的原因,在使用 strings.builder 时最好使用 Grow 方法进行初步的容量分配。因为使用了 grow 方法,提前分配好内存,在字符串拼接的过程中,不需要进行字符串的拷贝,也不需要分配新的内存,这样使用 strings.builder 性能最好,且内存消耗最小。