// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32
rune是int32的别名类型,用于存储Unicode编码的单个字符,字符串需要用[]rune表示。
字符必须是Unicode编码规范所支持的。
var a rune = 'a'
fmt.Printf("%+v\n", a) // 97
使用\x为前缀,后跟2位16进制数,表示宽度为1字节的ASCII编码值
var b rune = '\x61'
fmt.Printf("%+v\n", b) // 97
使用\为前缀,后跟3位8进制数,表示宽度为1字节,范围是0-255
var c rune = '\141'
fmt.Printf("%+v\n", c) // 97
使用\u为前缀,后跟4位16进制数据,表示2字节宽度的值
var d rune = '\u1234'
fmt.Printf("%+v\n", d) // 4460,即0x1234的10进制数
使用\U为前缀,后跟8位16进制数,可以表示4字节宽度的值,这种方式在Unicode编码规范中也被称为UCS-4表示法
var e rune = '\U00012345'
fmt.Printf("%+v\n", e) // 74565,即0x00012345的16进制数
Unicode规范定义了Unicode的编码范围,超过这个范围rune是无法表示的,会提示:escape sequence is invalid Unicode code point U+FFFFFFFF
var f rune = '\Uffffffff' // escape sequence is invalid Unicode code point U+FFFFFFFF
如果rune切片内的所有字符都是可显示的,则转换得到的string可以正常显示,否则会显示乱码
var s []rune = []rune{a,b,c,d,e}
fmt.Printf("%+v\n", s) // [97 97 97 4660 74565]
fmt.Println(string(s)) // aaaሴ
字符串可以正常转换为rune切片:
name := "pirlo"
fmt.Printf("%+v\n", []rune(name)) // [112 105 114 108 111]
fmt.Printf("%+v\n", string([]rune(name))) // pirlo
转义符 | Unicode Code Point | 说明 |
---|---|---|
\a | U+0007 | 告警铃声或蜂鸣声 |
\b | U+0008 | 退格符 |
\f | U+000C | 换页符 |
\n | U+000A | 换行符 |
\r | U+000D | 回车符 |
\t | U+0009 | 水平制表符 |
\v | U+000b | 垂直制表符 |
\ | U+005c | 反斜杠 |
’ | U+0027 | 单引号,仅在rune字面量中有效 |
" | U+0033 | 双引号,仅在string字面量中有效 |
除了上述转义符外,rune字面量中以“\”为前缀的字符序列都是不合法的。