Golang中的字符串是不可变的字节序列,默认采用UTF-8编码,日常开发中会频繁用到字符串处理操作,掌握基础的处理技巧能提升开发效率。字符串类型在Go中是内置的基础类型,不需要额外导入包就可以直接使用。

Golang字符串基础定义
Go语言中定义字符串非常简单,使用双引号或者反引号都可以,两者的区别是反引号定义的字符串会保留原始格式,不会处理转义字符。
package main
import "fmt"
func main() {
// 双引号定义字符串,支持转义字符
str1 := "hellonworld"
// 反引号定义字符串,保留原始格式
str2 := `hello
world`
fmt.Println(str1)
fmt.Println(str2)
}
常见字符串操作技巧
字符串拼接
Go语言中有多种字符串拼接方式,不同场景适合不同的方法:
- 使用
+号拼接:适合少量字符串拼接,简单直观 - 使用
strings.Join函数:适合字符串切片拼接,效率更高 - 使用
fmt.Sprintf:适合需要格式化拼接的场景
package main
import (
"fmt"
"strings"
)
func main() {
// +号拼接
s1 := "hello" + " " + "world"
// strings.Join拼接切片
strSlice := []string{"hello", "go", "string"}
s2 := strings.Join(strSlice, "-")
// Sprintf格式化拼接
s3 := fmt.Sprintf("%s-%d", "score", 100)
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(s3)
}
字符串截取
由于Go字符串是字节序列,截取的时候需要注意索引对应字节位置,如果是中文等多字节字符,直接按索引截取可能会出现乱码。
package main
import "fmt"
func main() {
str := "hello世界"
// 截取前5个字节,对应hello
sub1 := str[0:5]
// 截取索引5之后的内容,对应世界
sub2 := str[5:]
fmt.Println(sub1)
fmt.Println(sub2)
}
字符串遍历
遍历字符串有两种方式,一种是按字节遍历,一种是按Unicode字符遍历,处理中文的时候推荐按字符遍历。
package main
import "fmt"
func main() {
str := "hello世界"
// 按字节遍历
fmt.Println("按字节遍历:")
for i := 0; i < len(str); i++ {
fmt.Printf("%c ", str[i])
}
// 按字符遍历
fmt.Println("n按字符遍历:")
for _, c := range str {
fmt.Printf("%c ", c)
}
}
字符串比较
字符串比较可以直接使用==、!=等比较运算符,也可以使用strings.Compare函数,前者更简洁,后者会返回比较结果数值。
package main
import (
"fmt"
"strings"
)
func main() {
s1 := "hello"
s2 := "hello"
s3 := "world"
// 运算符比较
fmt.Println(s1 == s2) // true
fmt.Println(s1 != s3) // true
// strings.Compare比较,返回0表示相等,负数表示s1小于s3,正数表示s1大于s3
fmt.Println(strings.Compare(s1, s2)) // 0
fmt.Println(strings.Compare(s1, s3)) // -1
}
注意事项
因为Go字符串是不可变的,每次对字符串的修改操作都会生成新的字符串,频繁修改字符串的场景建议使用strings.Builder或者bytes.Buffer来提升性能,减少内存分配。
package main
import (
"fmt"
"strings"
)
func main() {
var builder strings.Builder
// 向builder写入内容
builder.WriteString("hello")
builder.WriteString(" ")
builder.WriteString("world")
// 转换为字符串
result := builder.String()
fmt.Println(result)
}