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