go語言中沒有列舉這種資料型別的,但是可以使用const配合iota模式來實現,如果要為列舉新增方法的話還涉及到型別的定義,以及為新建型別新增方法。所以在開始介紹實現go語言的列舉實現之前,我們先來看看型別別名(在go1.9版本新增的功能,主要用於**公升級、遷移中型別的相容性問題)和型別定義的區別。
型別別名的寫法:
type typealias = type // typealias只是type的別名,本質上typealias和type是同乙個型別。
型別定義的寫法:
type typenew = type // typenew 是乙個新的型別,擁有type相關的所有屬性和方法
package main // 定義包名
import "fmt"
// myint 將myint 定義為int型別
type myint int
// intalias 將int 取名為intalias
type intalias = int
// 為myint定義乙個add方法
func (a myint) add(b int)
// 為intalias 定義remove方法,編譯報錯:cannot define new methods on non-local type int
// func (a intalias) remove(b int)
// 編譯器提示不能在非本地型別int上定義新方法,因為type intalias = int只是取了乙個別名,實際型別還是int型別,而int型別不再main包裡,稱之為非本地型別。相反的type myint int定義了乙個新的型別myint,而這個型別是屬於main包內的,所以支援定義方法
func main()
從上例輸出結果可以得知:變數a的型別為main.myint,表示main包下定義的myint型別,而變數b的型別依然是int型別,說明intalias型別只會在**中存在,編譯完成時不會有intalias型別
另外,上例中也給大家演示了為myint和intalias型別新增方法,**中,可以順利的為myint新增方法。但是如果為intalias新增方法的話會報編譯錯誤,編譯器提示不能在非本地型別int上定義新方法。因為type intalias = int只是取了乙個別名,實際型別還是int型別,而int型別不在main包裡,稱之為非本地型別。相反的type myint int定義了乙個新的型別myint,而這個型別是定義在main包內,所以支援為其定義方法。
package main // 定義包名
import "fmt"
// colortype 定義乙個colortype 型別
type colortype int
const (
// black 使用iota進行常量值自動生成
black colortype = iota
// yellow 黃色
yellow
// red 紅色
red// blue 藍色
blue
)// c#的列舉有tostring的功能,可以為colortype定義tostring方法實現類似的功能
func (t colortype) tostring() string
return ""
}func main()
以上示例簡單的和大家演示了go語言列舉的實現,但是tostring()採用switch的方式個人感覺有點low,是否可以考慮採用go語言的反射來簡化**呢?這個有待後續驗證,目前還沒去研究go語言的反射機制。 第0章 無中生有
每個學計算機的同學都想寫乙個作業系統,每個學儲存的同學都想開發一款磁碟陣列。每當看到 作業系統 四個字我就衝動,那是大腦皮層的強烈反應,無奈能力不濟,繞了一大圈都沒入門。今年5月剛好沒啥正事,所以打算重整旗鼓,寫乙個非常簡單的os,想用來敲開 作業系統 這個大門。這個系列的文章只記錄開發過程的點滴經...
無中生有 抽象工廠模式
綜述 抽象工廠模式提供乙個建立一系列相關或者相互依賴物件的介面 例如,美的空調,美的電冰箱,他們就都是美的工廠生產的,就是同一產品族 例如 美的空調,格力空調,都是空調,他們就是同一產品等級結構,都是空調 所以根據產品等級結構和產品族可以唯一確定乙個產品。業務場景 模型分析 umlgreefacto...
無中生有 計算機視覺探奇
計算機視覺 computer vision,cv 是一門研究如何使機器 看 的科學。1963年來自mit的larry roberts發表的該領域第一篇博士 machine perception of three dimensional solids 標誌著cv作為一門新興人工智慧方向研究的開始。在發...