在 Go 中,String 是一种不可变的类型,不能被修改。
在 Go 语言中,字符串由 Unicode 字符组成,每个字符都可以用一个或多个字节来表示。我们使用双引号或反引号来定义字符串,使用反引号定义的字符串不会对其内容进行任何的转义(例如文本中包含 \n
时并不会进行转义)
s1 := "hello, world\n"
fmt.Print(s1)
// 使用反引号定义的原生字符串
s2 := `hello, world\n`
fmt.Print(s2)
// 使用反斜杠进行转义
s3 := "C:\\Windows\\System32\\"
fmt.Print(s3)
常见的字符串操作有:
- 获取长度:内置函数
len()
- 拼接:加号运算符
+
或fmt.Sprintf()
格式化 - 截取:切片操作
- 遍历:for 循环与 range 关键字
- 比较:比较运算符 ==、!=、<、<=、>、>=
以下是一个示例代码,演示了如何在 Go 语言中定义和使用字符串类型:
var str1 string = "Hello"
var str2 string = "world"
// 获取长度
fmt.Println(len(str1))
// 拼接
var str3 string = str1 + " " + str2
// 截取
fmt.Printf("str3[1:4]: %s\n", str3[1:4])
// 遍历
for index, char := range str3 {
fmt.Printf("str3[%d]: %c\n", index, char)
}
// 比较
if str1 == "Hello" {
fmt.Println("str1 equals Hello")
}
字符串连接性能优化:
在 Go 和 Java 中,字符串在内存中都被当作常量处理。因此,不断使用 “+” 符号拼接字符串会产生大量性能开销。针对此,我们有一些优化字符串连接的策略:
-
使用
strings.Builder
类型:这种方法适用于你没有提前准备好所有需要拼接的字符串的情况。 -
使用
strings.Join()
函数:这种方法适用于你已经准备好所有需要拼接的字符串的情况,且允许我们在拼接的字符串中插入分隔符,这在某些情况下是必需的。但是这种方法会消耗大量内存。
// 输出:11-22
join := strings.Join( []string{"11", "22"}, "-" )
以下是对这两种方法的应用示例:
// strings.Builder
start := time.Now()
var name strings.Builder
for i := 0; i < 100000; i++ {
name.WriteString(strconv.Itoa(i))
}
fmt.Println(time.Since(start))
// strings.Join()
start := time.Now()
var strs []string
for i := 0; i < 100000; i++ {
strs = append(strs, strconv.Itoa(i))
}
name := strings.Join(strs, "")
fmt.Println(time.Since(start))
fmt.Println(len(name))
在一些实验中,我们得到了以下结果:
- 原生形式:平均 1.3 秒
strings.Builder
:平均 2.3 毫秒strings.Join()
:平均 4.8 毫秒