目录
1. 说明
golang 中的字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。
UTF-8 是被广泛使用的编码格式,是文本文件的标准编码,其它包括 XML 和 JSON 在内,也都使用该编码。
由于该编码对占用字节长度的不定性,Go 中的字符串里面的字符也可能根据需要占用 1 至 4 个字节,这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字节)。这样做的好处是不仅减少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。
字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲,字符串是字节的定长数组。
2. 赋值
2.1 解释字符串
该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:
\n
:换行符\r
:回车符\t
:tab 键\u
或\U
:Unicode 字符\\
:反斜杠自身
2.2 非解释字符串
该类字符串使用反引号括起来,支持换行,例如:
`This is a raw string \n` 中的 `\n\` 会被原样输出。
3. 零值
零值为长度为零的字符串,即空字符串 ""
。
和 C/C++不一样,Go 中的字符串是根据长度限定,而非特殊字符\0
。
4. 运算
4.1 比较
一般的比较运算符(==
、!=
、<
、<=
、>=
、>
)通过在内存中按字节比较来实现字符串的对比。
func testStrcmp(stra, strb string) {
if stra > strb {
fmt.Println("a > b")
} else if stra < strb {
fmt.Println("a < b")
} else {
fmt.Println("a = b")
}
}
func main() {
testStrcmp("abcc", "abcd")
testStrcmp("abcd", "abcd")
testStrcmp("abce", "abcd")
testStrcmp("abcde", "abcd")
}
测试结果如下:
4.2 索引
通过函数 len()
来获取字符串所占的字节长度,例如:len(str)
。
字符串的内容(纯字节)可以通过标准索引法来获取,在中括号 []
内写入索引,索引从 0 开始计数:
- 字符串 str 的第 1 个字节:
str[0]
- 第 i 个字节:
str[i - 1]
- 最后 1 个字节:
str[len(str)-1]
注意事项
这种转换方案只对纯 ASCII 码的字符串有效。
获取字符串中某个字节的地址的行为是非法的,例如:
&str[i]
。
4.3 拼接+
两个字符串 s1
和 s2
可以通过 s := s1 + s2
拼接在一起。
拼接的简写形式 +=
也可以用于字符串
func testStrPend() {
stra := "1234"
strb := "abcd"
s := stra + strb
fmt.Println(s)
s += stra
fmt.Println(s)
}
5. 包 strings (对于字符串的预定义处理函数)
Go 中使用 strings
包来完成对字符串的主要操作。
一些库函数:
1. HasPrefix
判断字符串 s
是否以 prefix
开头
strings.HasPrefix(s, prefix string) bool
2. HasSuffix
判断字符串 s
是否以 suffix
结尾
strings.HasSuffix(s, suffix string) bool
3. Contains
判断字符串 s
是否包含 substr
strings.Contains(s, substr string) bool
4. Index 返回字符串 str 在字符串 s 中的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str
strings.Index(s, str string) int
5. LastIndex
返回字符串 str
在字符串 s
中最后出现位置的索引(str
的第一个字符的索引),-1 表示字符串 s
不包含字符串 str
strings.LastIndex(s, str string) int
6. 查询非 ASCII 编码的字符在父字符串中的位置
strings.IndexRune(s string, r rune) int
7. Replace 用于将字符串 str 中的前 n 个字符串 old 替换为字符串 new,并返回一个新的字符串,如果 n = -1 则替换所有字符串 old 为字符串 new
strings.Replace(str, old, new, n) string
8. Count 用于计算字符串 str 在字符串 s 中出现的非重叠次数:
strings.Count(s, str string) int
9. Repeat 用于重复 count 次字符串 s 并返回一个新的字符串:
strings.Repeat(s, count int) string
10. 字符串中的 Unicode 字符全部转换为相应的大/小写字符
strings.ToLower(s) string
strings.ToUpper(s) string
11. 修改字符串
strings.TrimSpace(s) 剔除字符串开头和结尾的空白符号
strings.Trim(s, "cut") 剔除字符串开头和结尾的指定字符 cut
TrimLeft、TrimRight 来剔除开头或者结尾的字符串
12. 分割字符串
strings.Fields(s) 用空白符号作为分隔符将字符串分割成一个 slice,如果只包含空白符号,则返回长度为 0 的 slice。
strings.Split(s, sep) 用于自定义分割符号来对指定字符串进行分割,同样返回 slice。
13. 拼接字符串
strings.Join(sl []string, sep string) string Join 用于将 string 的 slice 使用分割符号来拼接组成一个字符串
6. 包 strconv
(字符串相关的类型转换)
该包包含了一些变量用于获取程序运行的操作系统平台下 int 类型所占的位数,如:strconv.IntSize
任何类型 T 转换为字符串总是成功的。
字符串转换为其它类型 tp 并不总是可能的,可能会在运行时抛出错误 parsing "…": invalid argument。
数字类型转换到字符串
strconv.Itoa(i int) string 返回数字 i 所表示的字符串类型的十进制数。
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int)
fmt 表示格式(其值可以是 'b'、'e'、'f' 或 'g'),prec 表示精度,bitSize 则使用 32 表示 float32,用 64 表示 float64。
字符串类型转换为数字类型
strconv.Atoi(s string) (i int, err error) 将字符串转换为 int 型。
strconv.ParseFloat(s string, bitSize int) (f float64, err error) 将字符串转换为 float64 型。