Go 語言是一種靜態型別的編程語言,這意味著,編譯器需要在編譯時知曉程式里每個值的型別,資料型別的出現是為了把資料分成所需記憶體大小不同的資料,編程的時候需要用大資料的時候才需要申請大記憶體,就可以充分利用記憶體,
- Go語言內置以下這些基礎型別:
- 布爾型別:bool
- 整型:int8、byte、int16、int、uint、uintptr等
- 浮點型別:float32、float64,
- 復數型別:complex64、complex128
- 字串:string
- 字符型別:rune
- 錯誤型別:error
此外,Go語言也支持以下這些復合型別:
- 指標:pointer
- 陣列:array
- 切片:slice
- 字典:map
- 通道:chan
- 結構體:struct
- 介面:interface
1、型別
1.1、布爾型別
布爾型的值只可以是常量 true 或者 false,例如:
var b bool = true
1.2、整型
| 序號 | 長度(位元組) | 型別與描述 |
|---|---|---|
| 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.3、浮點型
浮點型用于表示包含小數點的資料,比如1.234就是一個浮點型資料,Go語言中的浮點型別采用IEEE-754標準的表達方式,
| 序號 | 長度(位元組) | 型別與描述 |
|---|---|---|
| 1 | 4 | float32:單精度 |
| 2 | 8 | float64:雙精度 |
示例:
var fvalue1 float32 fvalue1 = 12 fvalue2 := 12.0 // 如果不加小數點,fvalue2會被推導為整型而不是浮點型
1.4、復數型
這里就是我們數學中的復數,實際上由兩個實數(在計算機中用浮點數表示)構成,一個表示實部(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.5、字串
在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.6、字符型
字串中的每一個元素叫做“字符”,在遍歷或者單個獲取字串元素時可以獲得字符,字符(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)等型別,這將在后面的章節再詳細說明,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13850.html
標籤:Go
上一篇:Istio Sidecar
下一篇:Kubernetes 基礎資料
