(有一种感觉,上面的答案依然没有状态之间的区别和关系string
,并[]rune
很清楚,所以我会尝试添加与例如另一个答案。)
就像@Strangework
答案所说的,string
和[]rune
安静不同。
差异- string
&[]rune
:
string value
是只读字节片。并且,字符串文字以utf-8编码。string
实际上,每个字符占用1〜3个字节,而每个字符rune
占用4个字节个字节
- 对于
string
,len()
和索引均基于字节。
- 对于
[]rune
,len()
和索引都基于符文(或int32)。
关系- string
&[]rune
:
- 当您从转换
string
到[]rune
,每个UTF-8字符在该字符串变成一个rune
。
- 同样,在反向转换中,当从转换为时,每个转换为
[]rune
中的utf-8字符。string
rune
string
提示:
- 您可以在
string
和之间进行转换[]rune
,但是在类型和整体大小上它们仍是不同的。
(我将添加一个示例来更清楚地显示这一点。)
码
string_rune_compare.go:
// string & rune compare,
package main
import "fmt"
// string & rune compare,
func stringAndRuneCompare() {
// string,
s := "hello你好"
fmt.Printf("%s, type: %T, len: %d\n", s, s, len(s))
fmt.Printf("s[%d]: %v, type: %T\n", 0, s[0], s[0])
li := len(s) - 1 // last index,
fmt.Printf("s[%d]: %v, type: %T\n\n", li, s[li], s[li])
// []rune
rs := []rune(s)
fmt.Printf("%v, type: %T, len: %d\n", rs, rs, len(rs))
}
func main() {
stringAndRuneCompare()
}
执行:
去运行string_rune_compare.go
输出:
hello你好, type: string, len: 11
s[0]: 104, type: uint8
s[10]: 189, type: uint8
[104 101 108 108 111 20320 22909], type: []int32, len: 7
说明: