字符串是Go中的字节切片
Go 中的字符串是兼容Unicode编码的,并且是UTF-8编码的。
访问字符的单个字节
%x是十六进制
%c是字符
访问字符串的单个字符
在 UTF-8 编码中,一个码点可能会占一个以上的字节。 在这种情况下,我们需要 rune 来帮助解决问题。
package main
import (
"fmt"
)
func printBytes(s string) {
fmt.Printf("Bytes: ")
for i := 0; i < len(s); i++ {
fmt.Printf("%x ", s[i])
}
}
func printChars(s string) {
fmt.Printf("Characters: ")
for i := 0; i < len(s); i++ {
fmt.Printf("%c ", s[i])
}
}
func main() {
web := "https:www.gotribe.cn"
fmt.Printf("String: %s\n", web)
printBytes(web)
fmt.Printf("\n")
printChars(web)
fmt.Printf("\n\n")
web = "Señor"
fmt.Printf("String: %s\n", web)
printBytes(web)
fmt.Printf("\n")
printChars(web)
}
String: https:www.gotribe.cn
Bytes: 68 74 74 70 73 3a 77 77 77 2e 67 6f 74 72 69 62 65 2e 63 6e
Characters: h t t p s : w w w . g o t r i b e . c n
String: Señor
Bytes: 53 65 c3 b1 6f 72
Characters: S e à ± o r//注意看这里
上面程序的第 33 行,我们尝试将 “Señor” 中的每个字符打印出来,但是却得到了 “Señor”。为什么这个程序在 “https:www.gotribe.cn” 上运行正常,但是不适用于 “Señor” 呢?因为 ñ 的 Unicode 码点是 U+00F1,因而它的 UTF-8 编码占了两个字节:c3 和 b1。上面的程序假定每个码点只有一个字节长度,因此会发生错误。在 UTF-8 编码中,一个码点可能会占一个以上的字节。 在这种情况下,我们需要 rune 来帮助解决问题。
rune
ne
rune 是 Go 中的内置类型,它是 int32 的别名。Rune 表示 Go 中的 Unicode 代码点。代码点占用多少字节并不重要,它可以用一个符文来表示。让我们修改上面的程序以使用符文打印字符。
func printChars(s string) {
fmt.Printf("Characters: ")
runes := []rune(s)//字符串被转换为rune切片
for i := 0; i < len(runes); i++ {
fmt.Printf("%c ", runes[i])
}
}
字符串连接
直接 +
这种也可以
result := fmt.Sprintf(“%s %s”, string1, string2)
注意点:
- 字符串在 Go 中是不可变的。一旦创建了字符串,就无法更改它。
- utf8包提供了RuneCountInString(s string) (n int)来获取字符串的长度。一些 Unicode 字符的代码点占据了超过 1 个字节。len用于找出这些字符串的长度将返回不正确的字符串长度。