Golang 没有char类型,但可以通过byte、rune、string类型实现类似功能。本文详细说明几种类型之间的差异。
Go字符类型
- byte
byte用于表示ascii字符。它是uint8的别名,因此8位或1byte能表示0~255范围的所有ascii字符。
- rune
表示包括所有已存在的UNICODE字符。rune是int32的别名,可以表示所有UNICODE字符,大小是4个字节。
- string
长度为1的字符串也可用于隐式表示字符。一个字符串字符大小取决于该字符的编码,对于utf-8编码,它将介于1-4个字节之间。
声明byte、rune类型变量使用单引号,声明byte类型必须指定类型,没有指定类型缺省为rune类型。声明string变量,使用双引号或反引号。双引号字符串接受转义字符,而反引号字符串是原始文本字符串,不接受任何形式的转义。
示例
下面程序显示字节类型字符’a’,rune类型RMB符号以及字符串类型字符"µ",另外还显示转义符和反引号字符串字符:
func main() {
// 如果不指定byte类型,则为rune类型
var b byte = 'a'
fmt.Println("Printing Byte:")
// 打印大小,类型以及字符值
fmt.Printf("Size: %d\nType: %s\nCharacter: %c\n", unsafe.Sizeof(b), reflect.TypeOf(b), b)
r := '¥'
fmt.Println("\nPrinting Rune:")
// 打印大小,类型以及字符值
fmt.Printf("Size: %d\nType: %s\nUnicode CodePoint: %U\nCharacter: %c\n", unsafe.Sizeof(r), reflect.TypeOf(r), r, r)
s := "µ"
fmt.Println("\nPrinting String:")
fmt.Printf("Size: %d\nType: %s\nCharacter: %s\n", unsafe.Sizeof(s), reflect.TypeOf(s), s)
s = "\\"
fmt.Println("\nPrinting String:")
fmt.Printf("Size: %d\nType: %s\nCharacter: %s\n", unsafe.Sizeof(s), reflect.TypeOf(s), s)
s = `s`
fmt.Println("\nPrinting String:")
fmt.Printf("Size: %d\nType: %s\nCharacter: %s\n", unsafe.Sizeof(s), reflect.TypeOf(s), s)
}
输出结果:
Size: 1
Type: uint8
Character: a
Printing Rune:
Size: 4
Type: int32
Unicode CodePoint: U+00A3
Character: ¥
Printing String:
Size: 16
Type: string
Character: µ
Printing String:
Size: 16
Type: string
Character: \
Printing String:
Size: 16
Type: string
Character: s
声明字节类型存储非ascii字符会引发编译错误,赋值为285则编译器报错信息:
constant 285 overflows byte
单引号仅能初始化byte,rune类型变量,如果单引号内多余一个字符,编译器也会报错:
invalid character literal (more than one character)