golang 中的引号

前言

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格式的话,中文不能直接切片输出。

原文地址:https://www.cnblogs.com/ivan-blog/p/12347617.html