在Go中除了有最基礎的整型、浮點型、布爾型、字符串以外,還擁有數組、切片、結構體、函數、map、通道(channel)等。其中基本類型和別的語言都是大同小異的
整型:
整型主要分成了兩大類:按長度分爲了:int8、int6、int32、int64對應的就是無符號整型:uint8、uint16、uint32、uint64
其中uint8就是我們熟悉的bytes類型,int16對應了C語言中的short類型,int64對應了C語言中的long類型
特殊整型:
ps:在使用int和uint的時候,不能假定它是32或者64位的整型,而是考慮int和uint可能在不同的平臺上面的使用的差異
獲取對象的長度用內建函數len() 函數返回的長度可以根據不同平臺的字節長度進行變化。在實際的使用中切片或者map的元素數量等都可以用int來表示。在涉及到二進制傳輸、讀寫文件的結果描述的時候,爲了保持文件的結構不會受到不同編譯目標平臺字節長度的影響,不要使用int和uint。
字符串:
Go語言中的字符串以原生數據類型出現,使用字符串就像是使用其它原生數據一樣,Go語言裏的字符串的內部實現使用utf8編碼。字符串的值爲雙引號中的內容,可以在Go語言的源碼中直接添加非ascii碼的字符
字符串轉義符:
\n:換行符(直接跳到下一行的同列位置)
\r:回車符(返回首行)
\t:製表符
\':單引號
\":雙引號
\\:反斜槓
多行字符串:
Go語言中要定義一個多行字符串時,就必須使用反引號字符`內容`
字符串中常見的操作
byte和rune類型
組成每個字符串的元素叫做字符,可以通過遍歷或者單個獲取字符串元素獲得字符。字符用單引號包裹起來
Go的字符有以下兩種:
1、uint8類型,或者叫byte類型,代表了ascii碼的一個字符
2、rune類型,代表一個utf-8字符
當你需要處理中文、日文或者其它的複合字符的時候,就會需要用到rune類型。rune類型實際上就是一個int32。
Go使用了特殊的rune類型來處理unicode,讓基於unicode的文本處理更爲方便,也可以使用byte類型進行默認字符串處理,性能和擴展性都有照顧
func traversalString() { s := "hello沙河" for i := 0; i < len(s); i++ { //byte fmt.Printf("%v(%c) ", s[i], s[i]) } fmt.Println() for _, r := range s { //rune fmt.Printf("%v(%c) ", r, r) } fmt.Println() }
輸出:
104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³)
104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河)
因爲utf8編碼下一個中問漢字是由3-4個字節組成的,所以我們不能簡單的按照字節去遍歷一個包含中文的字符串,否則就會出現上面輸出第一行中的結果
字符串底層是一個byte數組,所以可以和[]byte類型互相轉換。字符串是不能修改的 字符串是由byte字節組成,所以字符串的長度是byte字節的長度。rune類型用來表示utf8字符,一個rune字符由一個或者多個byte組成。
修改字符串:
要是想修改字符串,首先需要將其轉換成[]rune或者[]byte,完成後再轉換爲string。無論轉換成哪種,都會重新分配內存,並複製字節數組。
func changeString() { s1 := "big" // 強制類型轉換 byteS1 := []byte(s1) byteS1[0] = 'p' fmt.Println(string(byteS1)) s2 := "白蘿蔔" runeS2 := []rune(s2) runeS2[0] = '紅' fmt.Println(string(runeS2)) }
類型轉換:
Go語言中只有強制類型轉換,沒有隱式類型轉換。該語法只能在兩個類型之間支持相互轉換的時候使用。
T(表達式)
其中T表示要轉換的類型,表達式包括變量、複雜算子、函數返回值等等