Golang 中没有专门的字符类型,若是要存储单个字符(字母),通常使用 byte 来保存。字符串就是一串固定长度的字符链接起来的字符序列。Go 的字符串是由单个字节链接起来的。也 就是说对于传统的字符串是由字符组成的,而 Go 的字符串不一样,它是由字节组成的。golang
首先来打个基础,了解下字节类型:数组
// 官方源代码这样定义byte
// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8
复制代码
golang中字符类型使用,举个例子:ui
import (
"fmt"
)
//演示golang中字符类型使用
func main() {
var c1 byte = 'a'
var c2 byte = '0' //字符的0
//当咱们直接输出byte值,就是输出了的对应的字符的码值
// 'a' ==>
fmt.Println("c1=", c1)
fmt.Println("c2=", c2)
//若是咱们但愿输出对应字符,须要使用格式化输出
fmt.Printf("c1=%c c2=%c\n", c1, c2)
//var c3 byte = '北' //overflpackage main
var c3 int = '北' //overflow溢出
fmt.Printf("c3=%c c3对应码值=%d\n", c3, c3)
}
复制代码
对上面代码说明编码
var c3 byte = '北' // overflow溢出
复制代码
Golang中是以utf-8形式编码的,英文占一个,中文占三个,而一个带有中英文字符串是以byte数组形式存的,英文占一个数组元素,中文三个(若是是用byte存就会溢出也就是三个数组元素才能造成中文),因此你想打印这个字符串的其中一个中文须要转成rune类型才行spa
package main
import "fmt"
func main(){
var c = "I love 中国"
fmt.Println(c[2]) //108
fmt.Println(string(c[2])) // l
fmt.Println(string(c[7])) // 乱码 三个字节才能造成中文
fmt.Println([]byte(c)) // [73 32 108 111 118 101 32 228 184 173 229 155 189]
// 转化成rune类型数组
c2:=[]rune(c)
fmt.Println(c2) // [73 32 108 111 118 101 32 20013 22269]
fmt.Println(string(c2[8])) // 中
fmt.Println(string(c2[8])) // 国
}
复制代码
对上面的代码说明:code
字符常量是用单引号('')括起来的单个字符。例如:var c1 byte = 'a' var c2 int = '中' var c3 byte = '9'utf-8
Go 中容许使用转义字符 '\’来将其后的字符转变为特殊字符型常量。例如:var c3 char = ‘\n’ // '\n'表示换行符unicode
在 Go 中,字符(注意是字符不是字符串 字符串直接打印仍是显示字符串,可是打印单个字符就是整型了)的本质是一个整数,直接输出时,是该字符对应的 UTF-8 编码的码值字符串
能够直接给某个变量赋一个数字,而后按格式化输出时%c,会输出该数字对应的 unicode 字符string
//能够直接给某个变量赋一个数字,而后按格式化输出时%c,会输出该数字对应的unicode 字符
var c4 int = 22269 // 22269 -> '国' 120->'x'
fmt.Printf("c4=%c\n", c4)
复制代码
//字符类型是能够进行运算的,至关于一个整数,运输时是按照码值运行
var n1 = 10 + 'a' // 10 + 97 = 107
fmt.Println("n1=", n1)
复制代码
字符型 存储到 计算机中,须要将字符对应的码值(整数)找出来 存储:字符--->对应码值---->二进制-->存储 读取:二进制----> 码值 ----> 字符 --> 读取
字符和码值的对应关系是经过字符编码表决定的(是规定好)
Go语言的编码都统一成了utf-8。很是的方便,很统一,再也没有编码乱码的困扰了