前言
go中的单引号',双引号",反引号`,他们用法的区别。
需要先了解字符编码的区别,由来。
单引号
单引号里面只能有一个字符,一般只能用来包裹一个字节的ASCII码字符。他的类型是Golang的一个特殊类型:rune,也就是int32。例如
package main
import "fmt"
func main() {
s := 'A'
fmt.Printf("type : %T, value: %s
", s, s)
fmt.Printf("type : %T, value: %d
", s, s)
fmt.Printf("type : %T, value: %c
", s, s)
}
/*
输出:
type : int32, value: %!s(int32=65)
type : int32, value: 65
type : int32, value: A
*/
双引号
package main
import (
"fmt"
)
func main() {
s := "你Hello"
fmt.Printf("type : %T, value: %s
", s, s)
fmt.Printf("type : %T, value: %d
", s[0], s[0])
fmt.Printf("type : %T, value: %c
", s[0], s[0])
u_s := []rune(s)
fmt.Printf("type : %T, value: %s
", u_s[0], u_s[0])
fmt.Printf("type : %T, value: %d
", u_s[0], u_s[0])
fmt.Printf("type : %T, value: %c
", u_s[0], u_s[0])
}
/*
输出:
type : string, value: 你Hello
type : uint8, value: 228
type : uint8, value: ä
type : int32, value: %!s(int32=20320)
type : int32, value: 20320
type : int32, value: 你
*/
可以看到string类型,我们单独拿一个字符出来是unit8类型也就是byte类型,与上面的单引号int32是不同的。Go中字符串是一个不可变的值类型,内部用指针指向UTF-8编码的字节数组。显然中文不可能由一个字节组成,我们将他转换成int32位之后就可以输出了。
反引号
反引号用来创建原生的字符串字面量,这些字符串可能由多行组成(不支持任何转义序列),相当于一个可以换行的字符串。一般用于SQL语句,html等大段内容,以及正则表达式的使用。
package main
import (
"fmt"
)
func main() {
s := `Hello 123
你好`
fmt.Printf("len : %d
", len(s))
fmt.Printf("type : %T, value: %s
", s, s)
fmt.Printf("type : %T, value: %d
", s[0], s[0])
}
/*
输出:
len : 20
type : string, value: Hello 123
你好
type : uint8, value: 72
*/
显然这种uint8格式的话,中文不能直接切片输出。