append, map, len不是關(guān)鍵字
他們其實(shí)還是類(lèi)庫(kù)功能, 都在buildin包里的, 系統(tǒng)默認(rèn)給你做了個(gè)
import( . "buildin")
將buildin的包內(nèi)容都映射到全局而已, 其實(shí)你也可以用自己的包這么做
打印的另一種寫(xiě)法
想跟腳本一樣調(diào)試打印數(shù)據(jù)么?
println("hello world")
無(wú)需包含任何包, 因?yàn)樗赽uildin包里
iota不是黑科技
這是在buildin包里的定義
// iota is a predeclared identifier representing the untyped integer ordinal// number of the current const specification in a (usually parenthesized)// const declaration. It is zero-indexed.const iota = 0 // Untyped int.
其實(shí)go是有泛型概念的
想想map和數(shù)組的定義
只是泛型沒(méi)有開(kāi)放給用戶(hù)用而已(只許XX放火,不許XX點(diǎn)燈)
map是支持多個(gè)key的, 而且很方便
還在為多個(gè)key轉(zhuǎn)id的復(fù)雜算法而頭疼么?
type myKey struct{ number int str string}func main(){ t := map[ myKey] int { myKey{ 2, "world"}: 1, } fmt.Println(t[myKey{2, "world"}])}輸出: 1
枚舉是可以轉(zhuǎn)成string的
默認(rèn)定義一個(gè)枚舉
type MyConst intconst ( MyConst_A MyConst = iota MyConst_B MyConst = iota)func main(){ fmt.Println(MyConst_A)}
輸出: 0
如果我們想自動(dòng)化輸出MyConst_A字符串時(shí)
就需要使用golang的一個(gè)工具鏈:golang.org/x/tools/cmd/stringer
將其下載, 編譯成可執(zhí)行工具后, 對(duì)代碼進(jìn)行生成
生成的代碼會(huì)多出一個(gè)xx_string.go
里面就是枚舉的String()string 函數(shù)
臨時(shí)轉(zhuǎn)換一個(gè)接口并調(diào)用的方法
type love struct{}func (self*love)foo(){ fmt.Println("love")}func main(){ var chaos interface{} = new(love) chaos.(interface{ foo() }).foo()}
Golang的receiver實(shí)際上就是this的變種實(shí)現(xiàn)
func( self*MyStruct) foo( p int ){}
寫(xiě)不慣receiver的寫(xiě)法? 如果這樣改下呢?
func foo( self *MyStruct, p int ){}
所以為什么說(shuō)Golang還是一個(gè)C語(yǔ)言嘛
關(guān)于內(nèi)存分配…
- new 傳入Type類(lèi)型, 返回*Type類(lèi)型
- make 可以在分配數(shù)組時(shí)設(shè)置預(yù)分配大小, new不可以
- make 能分配數(shù)組,map, 但不能分配結(jié)構(gòu)體和原始類(lèi)型
- new 能分配數(shù)組, map, 結(jié)構(gòu)體和原始類(lèi)型等的所有類(lèi)型
- &Type等效于new
- 切片不需要分配內(nèi)存(make,new), 直接聲明就可以了…
Golang的反射無(wú)法通過(guò)一個(gè)類(lèi)型名, 創(chuàng)建其實(shí)例
C#有Assembly概念, 可以在一個(gè)Assembly里搜索, 創(chuàng)建實(shí)例
Golang是靜態(tài)類(lèi)型語(yǔ)言, 如果需要, 只能注冊(cè)你需要?jiǎng)?chuàng)建的結(jié)構(gòu)體, 然后將注冊(cè)好的map用于創(chuàng)建
Golang可以替換Python來(lái)進(jìn)行復(fù)雜的工具流程處理
如果你需要跨平臺(tái)的工具流程處理, 對(duì)Python不熟悉, 可以使用
go run yourcode.go 參數(shù)1 參數(shù)2
方式來(lái)進(jìn)行工具處理
覺(jué)得慢, 可以編譯成可執(zhí)行文件
這樣做的好處: 如果有些類(lèi)庫(kù)本身就是go寫(xiě)的, Python想使用是很麻煩的, 而Golang來(lái)寫(xiě)則輕而易舉
例子: 通過(guò)go的protobuf庫(kù), 對(duì)一些文件進(jìn)行處理
Golang可以自動(dòng)持有方法的接收者實(shí)例
type myType struct{}func (self*myType) foo( p int){ fmt.Println("hello", p )}func main(){ var callback func( int ) ins := new(myType) callback = ins.foo callback( 100 )}
做過(guò)lua的C++代碼綁定的童鞋都清楚: lua只支持外部靜態(tài)或者全局函數(shù)調(diào)用
如果要進(jìn)行C++類(lèi)成員函數(shù)調(diào)用時(shí), 要自己處理this和成員函數(shù)
這種技巧因?yàn)樵缙鹁幾g器的虛表不同平臺(tái)實(shí)現(xiàn)細(xì)節(jié)不統(tǒng)一需要專(zhuān)門(mén)處理
后面跨平臺(tái)虛表統(tǒng)一后, 類(lèi)成員函數(shù)的調(diào)用寫(xiě)法也是很惡心復(fù)雜的
但是Golang的小白式用法, 直接吊打C++, 甚至C#復(fù)雜的delegate
LiteIDE篇: 多開(kāi)秘籍
找到 菜單->查看->選項(xiàng)->通用->存儲(chǔ)->存儲(chǔ)設(shè)置到本地ini文件
關(guān)閉LiteIDE
復(fù)制LiteIDE整個(gè)目錄, 命名文件夾為你的工程名
每個(gè)工程所在的LiteIDE的配置將是獨(dú)立的, 不會(huì)互相干擾
LiteIDE篇: 測(cè)試程序也是可以調(diào)試的
別以為程序一定要是main開(kāi)始的才可以調(diào)試
Golang的測(cè)試程序雖然都是一個(gè)個(gè)Test開(kāi)頭的函數(shù),但執(zhí)行g(shù)o test時(shí), 還是有main入口
在LiteIDE中, 可以在 調(diào)試->開(kāi)始調(diào)試測(cè)試程序里進(jìn)行測(cè)試程序調(diào)試
LiteIDE篇: 在Windows上可以輸出linux可執(zhí)行文件
go的工具鏈默認(rèn)支持交叉編譯
在LiteIDE中, 可以通過(guò)切換輸出平臺(tái), 輸出不同平臺(tái)的可執(zhí)行文件