Go 語言是一種靜態類型的編程語言。這意味着,編譯器須要在編譯時知曉程序裏每一個值的類型。數據類型的出現是爲了把數據分紅所需內存大小不一樣的數據,編程的時候須要用大數據的時候才須要申請大內存,就能夠充分利用內存。git
此外,Go語言也支持如下這些複合類型:編程
一、類型數組
1.一、布爾類型網絡
布爾型的值只能夠是常量 true 或者 false。例如:編程語言
var b bool = true
1.二、整型函數
序號 | 長度(字節) | 類型與描述 |
---|---|---|
1 | 1 | uint8:無符號 8 位整型 (0 到 255) |
2 | 2 | uint16:無符號 16 位整型 (0 到 65535) |
3 | 4 | uint32:無符號 32 位整型 (0 到 4294967295) |
4 | 8 | uint64:無符號 64 位整型 (0 到 18446744073709551615) |
5 | 1 | int8:有符號 8 位整型 (-128 到 127) |
6 | 2 | int16:有符號 16 位整型 (-32768 到 32767) |
7 | 4 | int32:有符號 32 位整型 (-2147483648 到 2147483647) |
8 | 8 | int64:有符號 64 位整型 (-9223372036854775808 到 9223372036854775807) |
9 | 1 | byte:相似 uint8 |
10 | 4 | rune:相似 int32 |
11 | 平臺相關 | uint:無符號的整型,32 或 64 位, |
12 | 平臺相關 | int:有符號的整型,32 或 64 位,在Go語言中,int與int32是不一樣的數據類型, 編譯器不會自動作數據轉換 |
13 | 同指針 | uintptr:無符號整型,用於存放一個指針,在32位平臺下爲4字節,64位平臺下爲8字節 |
例:性能
var value int32 value := 64 // value將會被自動推導爲int類型
對整型數據能夠進行數值運算、比較運算、位運算,詳細在「運算符」這一節說明。測試
1.三、浮點型大數據
浮點型用於表示包含小數點的數據,好比1.234就是一個浮點型數據。Go語言中的浮點類型採用IEEE-754標準的表達方式。ui
序號 | 長度(字節) | 類型與描述 |
---|---|---|
1 | 4 | float32:單精度 |
2 | 8 | float64:雙精度 |
示例:
var fvalue1 float32 fvalue1 = 12 fvalue2 := 12.0 // 若是不加小數點,fvalue2會被推導爲整型而不是浮點型
1.四、複數型
這裏就是咱們數學中的複數,實際上由兩個實數(在計算機中用浮點數表示)構成,一個表示實部(real),一個表示虛部(imag)。
示例:
var value1 complex64 // 由2個float32構成的複數類型 value1 = 3.2 + 12i value2 := 3.2 + 12i // value2是complex128類型 value3 := complex(3.2, 12) // value3結果同 value2
對於一個複數z = complex(x, y),就能夠經過Go語言內置函數real(z)得到該複數的實部,也就是x,經過imag(z)得到該複數的虛部,也就是y。更多關於複數的函數,請查閱math/cmplx標準庫的文檔。
1.五、字符串
在Go語言中,字符串也是一種基本類型。一個字符串是一個不可改變的字節序列,字符串能夠包含任意的數據,可是一般是用來包含可讀的文本。
1.5.1、字符串定義
var str string // 聲明一個字符串變量 str = "Hello world" // 字符串賦值
字符串中可使用轉義字符來實現換行、縮進等效果,經常使用的轉義字符包括:
示例:
package main import ( "fmt" ) func main() { var str = "Hello\nworld" fmt.Println(str) }
運行結果:
Hello world
多行字符串賦值
package main import ( "fmt" ) func main() { var str = `第一行 第二行 第三行\r\n 第四行` fmt.Println(str) }
運行結果
第一行 第二行 第三行\r\n 第四行
能夠看出,在這種方式下,全部的轉義字符均無效,文本將會原樣輸出。注意 ` 不是單引號,是反引號即鍵盤上 1 鍵左邊的鍵。多行字符串通常用於內嵌源碼和內嵌數據等。
1.5.2、字符串編碼
Go語言中字符串的內部實現使用 UTF-8 編碼,UTF-8 是一種被普遍使用的編碼格式,是文本文件的標準編碼,經過 rune 類型,能夠方便地對每一個 UTF-8 字符進行訪問。固然,Go語言也支持按照傳統的 ASCII 碼方式逐字符進行訪問。
1.5.3、字符串操做
運算 | 含義 | 示例 |
---|---|---|
+ | 字符串鏈接 | "Hello" + "World" // 結果爲HelloWorld |
Len() | 字符串長度 | len("HelloWorld") // 結果爲10 |
[] | 取字符 | "HelloWorld" [1] // 結果爲'e' |
1.5.4、字符串遍歷
GO語言有兩種遍歷方法,一種是以字節數組的方式遍歷:
package main import "fmt" func main() { str := "Hello World,你好世界" n := len(str) for i := 0; i < n; i++ { ch := str[i] // 依據下標取字符串中的字符,類型爲byte fmt.Println(i, ch) } }
運行結果
0 72 1 101 2 108 3 108 4 111 5 32 6 87 7 111 8 114 9 108 10 100 11 44 12 228 13 189 14 160 15 229 16 165 17 189 18 228 19 184 20 150 21 231 22 149 23 140
在GO語言中漢字默認是UTF8編碼佔3個字節,字母和半角標點是ASCII編碼佔1個字節,因此len(str) == 24 ,輸出的結果也是24行。
另外一種是以Unicode字符遍歷:
package main import "fmt" func main() { str := "Hello World,你好世界" for i, ch := range str { fmt.Println(i, ch) //ch的類型爲rune } }
運行結果
0 72 1 101 2 108 3 108 4 111 5 32 6 87 7 111 8 114 9 108 10 100 11 44 12 20320 15 22909 18 19990 21 30028
在GO語言中Unicode字符佔4個字節,故輸出結果是16行。
1.5.5、字符串截取
本質上就是數組切片,這在後面的數組切片中會詳細說明,這裏只是舉例:
package main func main() { str := "Hello World,你好世界" newStr := str[1:3] //從第1個字節開始(含),讀到取到第3個字節(含) println(newStr) }
運行結果
el
須要留意的是這種字符串截取,實際是以字節的方式截取的,漢字佔3個字節,能夠嘗試下面的代碼看看結果如何
package main func main() { str := "Hello World,你好世界" newStr := str[12:15] println(newStr) }
1.5.6、字符串搜索
正向搜索首次出現的子字符串,示例:
package main import "strings" func main() { str := "Hello World,你好世界" pos := strings.Index(str, "世界") pos2 := strings.Index(str, "o") println(pos, pos2) //返回子字符串出現的位置 }
運行結果
18 4
反向搜索首次出現的子字符串,示例:
package main import "strings" func main() { str := "Hello World,你好世界" pos := strings.LastIndex(str, "好") pos2 := strings.LastIndex(str, "o") println(pos, pos2) //返回子字符串出現的位置 }
運行結果
15 7
咱們能夠看出在搜索子字符串時是以字節的方式遍歷,漢字佔3個字節
1.5.7、字符串拼接
在前面咱們知道字符串拼接能夠用+
來處理,簡單直觀,但這種方式的性能並很差,由於每次將兩個字符串拼接時實際上會生成一個全新的字符串。在GO語言中也有相似於 StringBuilder(可變字符串) 的機制來進行高效的字符串鏈接,示例:
package main import ( "bytes" "fmt" ) func main() { firstString := "您好" secondString := "世界" // 聲明字節緩衝 var stringBuilder bytes.Buffer // 把字符串寫入緩衝 stringBuilder.WriteString(firstString) stringBuilder.WriteString(secondString) // 將緩衝以字符串形式輸出 fmt.Println(stringBuilder.String()) }
運行輸出
您好世界
1.六、字符型
字符串中的每個元素叫作「字符」,在遍歷或者單個獲取字符串元素時能夠得到字符。字符(Character)是各類文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。
Go語言的字符有如下兩種:
在 ASCII 碼錶中,A 的值是 65,使用 16 進製表示則爲 41,因此下面的寫法是等效的:
package main func main() { //在 ASCII 碼錶中,A 的值是 65,使用 16 進製表示則爲 41,因此下面的寫法是等效的: var ch byte = 'A' //字符使用單引號括起來 var ch2 byte = 65 var ch3 byte = '\x41' //(\x 老是緊跟着長度爲 2 的 16 進制數) var ch4 byte = '\101' //另一種可能的寫法是 \後面緊跟着長度爲 3 的八進制數,例如 \377。 println(ch, ch2, ch3, ch4) }
在Go語言中,Unicode字符在內存中也是使用 int 來表示。在文檔中,通常使用格式 U+hhhh 來表示,其中 h 表示一個 16 進制數,例如:
package main import "fmt" func main() { //在書寫 Unicode 字符時,須要在 16 進制數以前加上前綴\u或者\U。由於 Unicode 至少佔用 2 個字節,因此咱們使用 int16 或者 int 類型來表示。若是須要使用到 4 字節,則使用\u前綴,若是須要使用到 8 個字節,則使用\U前綴。 var ch int = '\u0041' var ch2 int = '\u03B2' var ch3 int = '\U00101234' fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // integer fmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // character fmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8 bytes fmt.Printf("%U - %U - %U", ch, ch2, ch3) // UTF-8 code point }
運行結果:
65 - 946 - 1053236 A - β - 41 - 3B2 - 101234 U+0041 - U+03B2 - U+101234
咱們發現咱們在代碼中常常用fmt.Printf
來向終端輸出文字,在這個示例中用到了一些格式化說明符
,它們的含義以下:
%c
:用於表示字符,當和字符配合使用時。%d
:會輸出用於表示該字符的整數,%v
也是如此。%X
:表示16進制的整數%U
: 輸出格式爲 U+hhhh 的字符串。Unicode 包中內置了一些用於測試字符的函數,這些函數的返回值都是一個布爾值,以下所示(其中 ch 表明字符):
package main import "unicode" func main() { // 判斷是否爲字母:unicode.IsLetter(ch) // 判斷是否爲數字:unicode.IsDigit(ch) // 判斷是否爲空白符號:unicode.IsSpace(ch) println(unicode.IsLetter(65)) }
輸出:
true
如今咱們認識了什麼是Go語言中的字符,在談字符的時候經常還會談到字符集。那麼什麼是字符集呢?顧名思義,字符集(Character set)是多個字符的集合。
常見的字符集有:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。詳細查閱:https://baike.baidu.com/item/字符集/946585?fr=aladdin
字符集爲每一個字符分配一個惟一的 ID,咱們使用到的全部字符在 Unicode 字符集中都有一個惟一的 ID,例如上面例子中的 a 在 Unicode 與 ASCII 中的編碼都是 97。
廣義的 Unicode 指的是一個標準,它定義了字符集及編碼規則,咱們經常使用的UTF-8是Unicode的其中一個使用方式(編碼)。 UTF是 Unicode Tranformation Format,即把Unicode轉作某種格式的意思。
UTF-8便於不一樣的計算機之間使用網絡傳輸不一樣語言和編碼的文字,使得雙字節的Unicode可以在現存的處理單字節的系統上正確傳輸。
UTF-8使用可變長度字節來儲存 Unicode字符,例如ASCII字母繼續使用1字節儲存,重音文字、希臘字母或西裏爾字母等使用2字節來儲存,而經常使用的漢字就要使用3字節。輔助平面字符則使用4字節。
此外,還有數組(Array)
、切片(slice)
、指針(pointer)
、字典(map)
、通道(chan)
、接口(interface)
、錯誤(error)
、結構體(struct)
等類型,這將在後面的章節再詳細說明。