聊聊golang字符類型(char)

基本介紹

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)
	}
複製代碼

對上面代碼說明編碼

  • 若是咱們保存的字符在 ASCII 表的,好比[0-1, a-z,A-Z..]直接能夠保存到 byte
  • 若是咱們保存的字符對應碼值大於 255,這時咱們能夠考慮使用 int 類型保存
var c3 byte = '北' // overflow溢出
複製代碼

golang如何存儲中文字符

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

  • 開題拋出byte類型存字符串 可是隻是針對於英文狀況下一個英文對應一個byte可是中文不必定,go以utf-8形式編碼,而中文在utf-8是佔三個字節,若是以byte類型存中文顯然會溢出,因此爲了解決上述狀況,go用rune類型存
  • 字符串底層就是Byte數組
  • []byte方法和[]rune方法是將字符串轉化成對應類型的slice(slice是引用類型,引用數組),string方法是轉化爲字符串

字符類型使用細節

  • 字符常量是用單引號('')括起來的單個字符。例如: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)
複製代碼
  • 字符類型是能夠進行運算的,至關於一個整數,由於它都對應有 Unicode 碼.
//字符類型是能夠進行運算的,至關於一個整數,運輸時是按照碼值運行
	var n1 = 10 + 'a' // 10 + 97 = 107
	fmt.Println("n1=", n1)
複製代碼

字符類型本質探討

  • 字符型 存儲到 計算機中,須要將字符對應的碼值(整數)找出來 存儲:字符--->對應碼值---->二進制-->存儲 讀取:二進制----> 碼值 ----> 字符 --> 讀取

  • 字符和碼值的對應關係是經過字符編碼表決定的(是規定好)

  • Go語言的編碼都統一成了utf-8。很是的方便,很統一,再也沒有編碼亂碼的困擾了

相關文章
相關標籤/搜索