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。很是的方便,很統一,再也沒有編碼亂碼的困擾了