(感觉上面的答案仍然没有很清楚地说明和之间的差异和关系string
,[]rune
所以我会尝试通过示例添加另一个答案。)
正如@Strangework
's answer所说,string
并且[]rune
完全不同。
差异 - string
& []rune
:
string value
是一个只读字节片。并且,字符串文字以 utf-8 编码。每个 char instring
实际上占用1 ~ 3个字节,而每个rune
占用4个字节
- 对于
string
,len()
和 index 都是基于字节的。
- 对于
[]rune
,len()
和 index 都基于 rune (或 int32)。
关系 - string
& []rune
:
- 当您从 转换为
string
时[]rune
,该字符串中的每个 utf-8 字符都变为rune
.
- 同样,在反向转换中,当从
[]rune
to转换时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
解释: