【Go 語言教程】Go 語言資料型別
正所謂“千里之行始於足下”,說的是腳踏實地,打好基礎,而學習每一門程式語言,都需要學習語言提供的資料型別。資料型別用於函式和變數的宣告,主要劃分為:基本型別,列舉型別,字串型別,派生型別(指標,陣列,函式,切片,介面,map型別等)。其中基本型別和列舉型別有統稱為算術型別。那麼Go語言的資料型別也是如此分類。同時從一門語言的型別劃分層面,也可以加深你對這門語言的基本劃分以及發過來加深對語言總體設計的認識。
1 Go語言的算術型別
Go語言的算術型別包括,基本型別如int,float的整型和浮點型的數字,也支援複數,還有位運算。列舉型別是bool,值可以常量true也可以是false。其中int型別又分為:
- 無符號整數(後面數字代表位數):uint8,uint16,uint32,uint64
-
有符號整數(後面數字代表位數):int8,int16,int32,int64
float型別又分為:float32,float64(後面數字代表位數)。複數又complex64,complex128(後面數字代表位數)。
2 Go語言的字串型別
Go語言的字串型別就是一串包含一定長度的字元組成,每個字元是一個位元組。同時字串編碼格式有UTF-8編碼。字串的定義和使用例子如下:
// 字串定義 str := "HelloWorld" // 字串長度 fmt.Println(len(str)) // 遍歷字串中的字元 for i := 0; i < len(str); { fmt.Println(str[i]) }
字串的操作常用的方法都定義在strings模組包中,包括獲取制定字串的個數Count方法,判斷是否包含某子字串的Contains方法,判斷包含任意字元的方法ContainsAny方法,忽略大小寫情況的字串是否相等判斷EqualFold方法,按空格分隔字串Fields方法,按指定字串分隔的Split方法,判斷是否一字串開頭的HasPrefix方法,判斷是否以某字串結尾的HasSuffix方法,以及自定義分隔符方法方式進行字元分隔的FieldsFunc方法, 如下例子。
package main import ( "fmt" "strings" ) func main() { str := "1,2,3 4,5;6" s1 := strings.FieldsFunc(str, func(c rune) bool { if c == ',' || c == ' ' || c == ';' { return true } return false }) print_array(s1)// 輸出:123456 } func print_array(s []string) { for _,v := range s { fmt.Print(v) } fmt.Println() }
3 Go語言的派生型別
Go語言的派生型別主要包括:指向某一型別(記憶體)的指標型別即地址,用來儲存一種型別的資料的陣列型別,自定義結構型別的結構化型別,針對併發而設計的管道的Channel型別,所有語言都不可或缺的函式型別,以視窗的概念切入的資料視窗型別切片型別,還有針對繼承抽象概念而設計的介面型別,以及資料集合的<key,value>的Map型別。程式碼如下
// 指標型別,如:無符號整數指標 var ptrName uintptr //陣列型別 var myArrays [100] int //結構化型別 type structType struct{ // 屬性定義 name string id int } // Channel型別(管道) ch := make(chan int) //函式型別 func funcType (){ //函式體 } // 切片型別 var sliceName [] int // 介面型別 type interfaceName interface { // 介面方法定義 } // Map型別 var mapName map[int]string
4 總結和經驗分享
Go語言中的常見和使用資料結構有Map和slice,和管道Channel型別。
其中Map型別,<key,value>型別又是業務實現中經常選擇的資料結構型別,Map型別可以做基於字典的資料結構設計和查詢實現。Map支援的操作有append方法來新增元素,delete方法來刪除元素。以及基於下標的元素訪問,還可以基於range的for迴圈訪問,如下:
// map的訪問 var mapName map[int]string for k, v := range mapName { fmt.Println(k, v) }
而slice資料結構多使用者位元組陣列操作,比如類似網路通訊的業務,從底層io讀取資料的時候,就會使用slice結構進行讀取則會效率非常的高。2而管道Channel型別則和計算機底層的程序間通訊的訊息pipe類似,可以使用者不同的Go語言在進行併發程式設計的routine之間進行通訊,這個將於對routine進行講解的時候進行詳細說明。你可以先理解為一種通訊手段。而且基於這個通訊手段可以實現很多設計模式,如非同步呼叫,訊息通知,生產者和消費者等等。而且channel還是跨執行緒協作的有用工具。
關於本專欄——Go 語言教程,專欄致力於為希望可以系統地,一條一條地,一步一步的學習Go語言的朋友提供一個可以持續閱讀的地方,當然也希望可以通過我的實踐經驗以及相應的基礎,可以給你一些學習之外的想法和總結,以及提高。如果真的有幫助,哪怕一點點,可以把這個一點點的提高分享給我,歡迎跟我勾搭聯絡。