標籤:go語言編程
Go語言編程
目錄 [隱藏]
- 1 前言
- 2 初識Go語言
- 3 順序編程
- 4 OOP
- 5 並發編程
- 6 網路編程
- 7 安全編程
- 8 工程管理
- 9 開發工具
- 10 進階話題
- 11 附錄A
|
[編輯]前言
- 協程? go run(‘test‘)
- Go強制了{ }的編寫風格: if expression {
- 錯誤處理:
- defer?相當於finally?注意這裡的範圍,defer之前似乎沒有用{ }把整個(try)塊括起來?
- defer相當於說延遲語句的執行,其內部實現會自動管理嵌套範圍的問題?
- Go允許返回多個值(像Python裡的tuple返回)
- Go用組合,不用繼承、虛函數、虛函數重載
- Go裡的變數聲明是先變數名字,後類型名字(Pascal風格,但沒有:)?
- Go的介面是duck typing嗎?
- Go裡,2個介面只要擁有相同的方法列表(名字、簽名、順序??),那麼就是等同的
- ?Go裡避免太多的{ }嵌套可能是一種策略——這使它顯得更像一門指令碼語言,給程式員寫代碼帶來某種“輕快”的感覺。。。
[編輯]初識Go語言
- Plan 9上的Limbo語言被認為是Go的前身?
- 支援自動GC?——那不就和Java/C#的效能差不多了麼
- 更豐富的內建類型:
- Slice
- map
- 多返回值
- func getName() (firstName, lastName, nickName string){
-
//由於這裡返回值也給了名字,因此可以賦值然後空return!(Python裡似乎還不能夠這麼靈活,靠)
- fn, ln, nn := getName()
-
模式比對(destructuring):_,ln,_ := getName()
- 錯誤處理:defer、panic、recover
- 匿名函數和閉包
- f := func(x,y int) int { return x+y }
- 類型:類似於C裡的struct(估計這裡借用了Objective-C的一些做法。。。)
- type Bird struct { ... }
- func (b *Bird) Fly() { ... } //這一句的寫法我怎麼有點看不明白呢?見鬼
- 並發編程
- resultChan := make(chan, int, 2)
- go sum(.../*參數略*/, resultChan)
- func sum(..., resultChan chan int) {
-
... resultChan <- sum
- sum1, sum2 := <-resultChan, <-resultChan //Channel對象只有一個符號操作:<- ,放左邊代表取出,右邊表示放進?
- 反射:靠,這邊的文法太醜陋了,媽的
- Cgo
- 第1個Go程式:
- package main
- import "fmt"
- func main() {
-
fmt.Println("Hello, world!")
- go run hello.go //直接運行;
- go build hello.go && ./hello //編譯運行;即可以解釋執行,也可以編譯運行(這個跟Rust倒是一樣的)
[編輯]順序編程
- var v3 [10]int //變態的數組聲明文法~
- var v7 map[string] int //string->int的映射
- i := 10 //自動類型推導?
- i,j = j,i
- 數值類型:int uint int32 int64 float32 float64 complex64 complex128
- const
- true false iota(每個const的開頭從0開始,每次出現自動增1?用於定義枚舉,但Go並不支援enum關鍵字)
- string byte/rune error
- uintptr
- 不同類型的數不能直接比較,也就是說,Go不做自動型別提升?
- 字串遍曆:for i := 0; i < len(str); i++ { ... str[i] }
- Unicode字元遍曆:
- for i, ch := range str { ... }
- 數組是一個值類型!
- 切片:var mySlice []int = myArray[:5]
-
mySlice2 := make([]int, 5)
-
可動態增減元素:len(mySlice) cap(mySlice) append copy ...
- map
- delete(myMap, "key") //靠,這裡的操作都是C語言風格的,不支援C++/Java/C#裡的.成員函數訪問操作?
- 流程式控制制:
- if else
- switch case
- for
- goto
- 函數
- 成員函數的寫法太怪異了:func (file *File) Read(b []byte) (n int, err Error) //注意,沒有其他語言裡的this、self等關鍵字!
- 閉包
- 錯誤處理
- p48 return nil, &PathError("stat", name, err) //這裡&的寫法是怎麼回事?以引用方式傳遞對象嗎
- defer func() { ... } ()
- func panic(interface())
- func recover() interface()
[編輯]OOP
- 值語義(預設?)和引用語義(&)
- ?Go使用*符號,那麼它到底是不是C/C++裡的指標?(估計不是,但看著有點詭異)
- 初始化
- r1 := new(Rect)
- r2 := &Rect()
- 組合就是繼承:type Derived struct{
-
Base //還可以寫成*Base,這樣的話,。。。——相當於C++裡的虛基類?
-
... //*log.Logger:可直接注入其他類的方法?但logger類顯然無法訪問當前類的資料成員(!!)
- 可見度:大寫為public,小寫是private
- (非侵入式的)介面
- 這裡的文法似乎有點類似於Objective-C。。。注意聲明type IFile interface { ... }時,裡面的Read、Write不需要帶(f *File)(this引用)
- 介面查詢:略
- 類型查詢:vt := v.(type)
- 介面組合
- Any類型:interface()
[編輯]並發編程
- 主main不等待goroutine直接退出會導致線程強制結束?
- channel
- select(這是學習了Erlang吧?)
- 逾時機制:建立一個額外的channel
- timeout := make(chan bool, 1)
- go func() { time.Sleep(1e9) timeout <- true }()
- select {
-
... case <-timeout: //已經逾時
- 利用channel傳遞實行管道?
- 單向chan:聲明的時候加上<-
- 關閉:close(ch)
- 同步
- sync.Mutex sync.RWMutex
- sync.Once
[編輯]網路編程
- net.Dial?這個方法名太。。。了
- net/http
- net/rpc
- Gob
- JSON
[編輯]安全編程
- 略
[編輯]工程管理
- 遠程import:神經病!
- GOPATH
- Android支援???——必須在adb shell下運行吧
[編輯]開發工具[編輯]進階話題
- 反射
- Type, Value
- 語言互動
- Cgo:import "C"
- 連結符號:由下列資訊構成(注意Go裡無重載)
- Pakcage
- ClassType
- Method(恩?連結符號允許/、*、. ?)
- goroutine機制
- libtask?
- 介面機制
[編輯]附錄A
- 常用包:fmt io bufio strconv os sync flag encoding/json http
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Go語言編程(舊讀書筆記)