-
Go 語言的并發
Go 語言中的多線程操作是其語言的一大特色,它具有其它語言無法比擬的,可以近乎無限開啟的線程。在 Go 語言中被稱之為?goroutine?,它是線程的輕量級實現。Go 語言的并發廣泛的應用在服務器性能調優的場景中,這也是越來越多的游戲服務器開發都在往 Go 語言傾斜的原因之一。 1.Go 語言的 goroutine 在 Go 語言中使用?go?關鍵字來創建 goroutine ,形如go 函數名()的形式去創建。每一個 goroutine 必須是一個函數,這個函數也可以是匿名函數…
-
Go 語言中的錯誤和異常處理
在 Go 語言中沒有與 Java 或者 .NET 類似的異常處理機制。Go 語言的開發者認為類似的異常處理已經被過多的使用了,這樣的異常機制過度依賴上層代碼對異常的處理,如果上層代碼對異常的處理不到位會使程序出一些不易排查的BUG。所以為了讓開發者能夠重視并正確的處理每一個可能會出現異常的函數,Go語言采用返回值的形式來返回錯誤。這一機制,既可以讓開發者真正理解錯誤處理的含義,也可以大大降低程序的復雜度。 1.error 接口 error 是系統自帶的一個接口類型的自定義類型。 代…
-
Go 語言函數式編程
本文主要介紹 Go 語言的另一大編程特性——函數式編程。函數式編程的基礎特點為: 函數是一等公民,即函數可以做為變量。 純函數,即函數內的操作不可影響到函數外。 Go 語言的函數式編程無需遵循第二點,這一特性為 Go 語言的函數式編程帶來了更大的靈活性。 1. 編程示例 接下來我們來分別展示用函數式編程和普通編程方式來實現一個累加器,即輸出 1+2+3+…+100 的值。 普通方式實現: 代碼塊 1? func main() { 2? ? ? ? ? a := 0 3? ? ? ?…
-
Go 語言中的 nil
nil?是 Go 語言中內置的一個標識符,有人會把它當作其它語言中的NULL,這個是不準確的。本文就來介紹一下 Go 語言中的?nil?的特點。 1. nil 是特殊的零值 在 Go 語言中,任何一個變量在聲明之后會自動被賦予一個零值。數值類型的變量零值為0,字符串為"",而指針、切片、map、通道、函數和接口的零值就是nil。 代碼示例 代碼塊 1? package main 2 3? import ( 4? ? ? ? ? "fmt" 5? ) 6 7? func main()…
-
Go 語言類型的內嵌
在 Go 語言中的類型是可以直接內嵌到結構體中的,可以看作是一個沒有屬性名的屬性。同時接口中也可以內嵌接口,并且只能內嵌接口。本文就來講解以下 Go 語言如何使用內嵌類型。 1. 結構體內嵌類型 結構體中內嵌類型在開發中用的并不多,這只是一個延伸特性。意味著結構體在定義屬性字段的時候可以只寫類型,不寫屬性名,但是一個類型只能寫一個,不然結構體會無法識別你調用的時候使用的是哪個字段,這種只寫類型不寫屬性名的屬性被稱為匿名字段。 代碼示例: 代碼塊 1? package main 2 …
-
Go 語言中的接口
在所有編程語言中,接口都是一些方法的集合,通常都是"類"們都需要實現的一些公共方法。使這些"類"在使用過程中多了一層抽象。在使用接口時無需在意這些方法是如何實現的,只需在意這個接口中的方法本身。Go 語言提倡面向接口編程,一來增強代碼的可讀性,二來可以使代碼的模塊之間的關系變得更加清晰、邊界更加明顯。本文就來介紹一下 Go 語言中的接口。 1. 接口定義 在 Go 語言中,接口也是一個數據類型,該類型使用結構?interface{...}?來定義。 代碼示例: 代碼塊 1? var…
-
Go 語言中的結構體和“面向對象”
本文主要來講解一下 Go 語言的結構體數據類型,以及 Go 語言中的"面向對象",為什么要加雙引號呢?因為 Go 語言中沒有明確的面向對象的概念,當然也沒有明確的面向過程的概念。面向哪一方面編程完全取決于你如何使用,如果你想要面向對象編程,Go 語言中提供了相對應的解決方案來模擬面向對象。 1. 結構體類型 想要模擬面向對象就首先要了解一下 Go 語言中的結構體類型。當你需要兩個以上的基本數據類型或自定義類型來聲明定義函數的時候,你就可以使用結構體。結構體變量使用struct{..…
-
Go 語言拓展以有類型
在開發中,僅僅使用 Go 語言自帶的變量是無法滿足我們的業務需求的,就算勉強能滿足,對我們整個項目代碼后期的維護和其可讀性,都會帶來很大的不便。所以幾乎所有語言都支持自定義數據類型,用于拓展已有的數據類型來適應日新月異的開發場景。在 Go 語言中可以使用?type?關鍵字自定義數據類型。 1. 自定義復雜類型 我們可以使用type Name Type去自定義一個全新的數據類型。這個類型的變量就使用Name來聲明。通常type用于將一個復雜的數據類型定義為一個全新的數據類型,便于后續…
-
Go 語言中的 range
在線程不安全的 map 中我們學習了 map 的遍歷,里面使用了一個叫?range?的關鍵字來對 map 進行遍歷操作。當時還提到了切片和數組都可以使用這個方法遍歷。本文就來詳細學習一下?range?關鍵字的用法。 Tips:本文提及的 map 均是線程不安全的 map。線程安全的 map 及其遍歷方法參照 Go 語言中的map 一文。 1. 基本用法 range?可以用來遍歷的對象有數組、切片、map、字符串以及通道。遍歷的對象不同,range?的返回值也會有所不同。遍歷數組、切…
-
Go 語言中的 Map
本文介紹一種特殊的數據結構。它是一種元素對的無序集合,每一個索引(key)對應一個值(value),這種數據結構在 Go 語言中被稱之為?map。map?是一種能夠通過索引(key)迅速找到值(value)的數據結構,所以也被稱為字典。在 Go 語言中因為線程安全問題,一共實現了兩種類型的 map,接下來我們每種都了解一下。 Tips:線程的知識會在Go語言的多線程中講解。 1. 無鎖的map 這種類型的 map 是線程不安全的 map,多個線程同時訪問這個類型的 map 的同一個…