字符串用得好,编程没烦恼
1. Go语言字符串面面观
1.1 字符串是什么?
Go语言中的字符串,说白了就是一串固定长度的字符连接起来的字符集合。但它和我们熟悉的C语言字符串有很大不同——Go字符串有自己独立的string类型,不再是以'\0'结尾的字符数组。
// 简单的字符串定义
var str string
str1 := "hello world"
var str2 = "hello world too"
值得一提的是,Go语言源代码默认采用UTF-8编码,这使得Go语言对非ASCII字符有着原生支持。UTF-8是一种变长编码,英文字符占1个字节,中文字符通常占3个字节。
1.2 字符串的底层秘密
了解字符串的底层结构,能帮你更好地理解它的行为。在Go运行时中,字符串实际上是这样一个结构体:
type stringStruct struct {
str unsafe.Pointer // 指向字节数组的指针
len int // 字符串的字节长度
}
当你使用unsafe.Sizeof("")时会发现,无论字符串内容是什么,这个结果都是16(64位平台上),其中8字节是指针,8字节是长度。
字符串的一个关键特性是不可变性。一旦创建,你就无法修改字符串的内容:
s := "hello"
// s[0] = 'H' // 这行会报错:cannot assign to s[0]
这种不可变性带来的好处是线程安全和哈希计算优化,同时也使得字符串切片操作非常高效,因为切片可以共享底层存储而不需要复制数据。
2. 字符串的创建与基本操作
2.1 创建字符串的多种方式
Go语言提供了两种字符串字面值形式:
// 解释字符串(使用双引号)
s1 := "心有猛虎,细嗅蔷薇\n第二行"
// 输出:心有猛虎,细嗅蔷薇
// 第二行
// 原生字符串(使用反引号)
s2 := `心有猛虎,细嗅蔷薇\n第二行`
// 输出:心有猛虎,细嗅蔷薇\n第二行
双引号字符串支持转义字符,如\n(换行)、\t(制表符)等,而反引号字符串内部会原样解析内容,包括换行和特殊字符。
2.2 字符串基本操作一览
字符串的基本操作相当直观:
// 长度查询
s := "hello"
fmt.Println(len(s)) // 输出:5
// 字符串连接
s1 := "hello"
s2 := "world"
result := s1 + " " + s2
fmt.Println(result) // 输出:hello world
// 字符串比较
fmt.Println("abc" == "abc") // true
fmt.Println("abc" !

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



