【Go語言系列】2.四、Go語言基本程序結構:數據類型

Go 語言是一種靜態類型的編程語言。這意味着,編譯器須要在編譯時知曉程序裏每一個值的類型。數據類型的出現是爲了把數據分紅所需內存大小不一樣的數據,編程的時候須要用大數據的時候才須要申請大內存,就能夠充分利用內存。git

  • Go語言內置如下這些基礎類型:
  • 布爾類型:bool
  • 整型:int八、byte、int1六、int、uint、uintptr等
  • 浮點類型:float3二、float64。
  • 複數類型:complex6四、complex128
  • 字符串:string
  • 字符類型:rune
  • 錯誤類型:error

此外,Go語言也支持如下這些複合類型:編程

  • 指針:pointer
  • 數組:array
  • 切片:slice
  • 字典:map
  • 通道:chan
  • 結構體:struct
  • 接口:interface

一、類型數組

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" // 字符串賦值

字符串中可使用轉義字符來實現換行、縮進等效果,經常使用的轉義字符包括:

  • \n 換行符
  • \r 回車符
  • \t tab 鍵
  • \u 或 \U Unicode 字符
  • \\ 反斜槓自身

示例:

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語言的字符有如下兩種:

  • 一種是 uint8 類型,或者叫 byte(其實是uint8的別名) 型,表明UTF-8字符串的單個字節的值,值對應ASCII 碼。
  • 另外一種是 rune 類型,表明一個Unicode字符,出於簡化語言的考慮,Go語言的多數API都假設字符串爲UTF-8編碼,當須要處理中文、日文或者其餘複合字符時,則須要用到 rune 類型。rune 類型等價於 int32 類型。關於rune相關的操做,可查閱Go標準庫的unicode包。另外unicode/utf8包也提供了UTF8和Unicode之間的轉換。儘管Unicode字符在標準庫中有支持,但實際上較少使用。

在 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)等類型,這將在後面的章節再詳細說明。

相關文章
相關標籤/搜索