Golang 學習筆記
golang 簡介
靜態 強型別編譯型語言
GO語言適用場景及GO語言的優勢
Go語言是谷歌推出的一種全新的程式語言,可以在不損失應用程式效能的情況下降低程式碼的複雜性。谷歌首席軟體工程師羅布派克(Rob Pike)說:
我們之所以開發Go,是因為過去10多年間軟體開發的難度令人沮喪。
Go是谷歌2009釋出的第二款程式語言。該獎項授予在2009年市場份額增長最多的程式語言。
谷歌資深軟體工程師羅布·派克(Rob Pike)表示,“Go讓我體驗到了從未有過的開發效率。”派克表示,和今天的C++或C一樣,Go是一種系統語言。他解釋道,“使用它可以進行快速開發,同時它還是一個真正的編譯語言,我們之所以現在將其開源,原因是我們認為它已經非常有用和強大。
HelloWorld
package main import "fmt" func main() { fmt.Println("Hello, 世界") }
變數 常量
var age int =10 var age=10 age := 2018 const age int = 10 const age= 10
公有變數/函式私有變數/函式
大些字母開頭的變數或者函式等是public的,可以被其他包訪問;小些的則是private的,不能被其他包訪問到。這樣就省去了public和private宣告的煩惱,使程式碼變的更簡潔。
map
map型別,Java裡是Map介面,go裡叫做字典
ages := make(map[string]int) ages["weimin"] = 20 ages["brother"] = 30 fmt.Print(ages["michael"]) //刪除 delete(ages,"michael")
函式方法
package main import "time" type Person struct { ageint name string } func (p Person) GetName() string { return p.name } func GetTime() time.Time{ return time.Now() }
包名呼叫稱之為函式
建立物件例項呼叫稱之為方法
多返回值
func backValue() (string, int, error) { return "helloWorld", 100, nil } str,value:=backValue() str,_:=backValue()
指標
Go的指標和C中的宣告定義是一樣的,其作用類似於Java引用變數效果。 var age int = 10 var p *int = &age *p = 11 fmt.Println(age) //age=11
結構體
package main import ( "fmt" ) type Person struct { ageint name string Address // 組合 } type Address struct { city string } func (p Person) GetName() string { return p.name } func (p Person) GetAge() int { return p.age } //值拷貝,不改變原來的User物件值 func valueDeliver(person Person) { person.name = "值拷貝" person.age = 12 fmt.Println("person :", person) } func pointerDeliver(person *Person) { person.name = "指標" person.age = 12 fmt.Println("person :", person) } func main() { person := Person{} valueDeliver(person) pointerDeliver(&person) //person : {12 值拷貝 {}} //person : &{12 指標 {}} }
介面
Go的介面和Java型別,不過它不需要強制實現,在Go中,如果你這個型別(基本型別,結構體等都可以)擁有了介面的所有方法,那麼就預設為這個型別實現了這個介面,是隱式的,不需要和java一樣,強制使用implement強制實現。
package main import ( "fmt" "strconv" ) type Stringer interface { String() string } type User struct { ageint name string } func (p User) String() string { return "name is " + p.name + ",age is " + strconv.Itoa(p.age) } func main() { var str Stringer user := &User{} user.age = 10 user.name = "hello" str = user fmt.Println(str) }
併發
- go run()go關鍵字 開啟一個協程(輕量級執行緒)
- 協程通訊(類似java selector channel 機制)
- 同步(sync,sync.WaitGroup)
package main import "fmt" //協程通訊 exit := make(chan struct{}) go func() { time.Sleep(time.Second * 3) println("chan1 chan goroutine end") defer close(exit) //關閉通道 }() println("main start...") <-exit //main start... //chan1 chan goroutine end //main end... //同步 var rw sync.RWMutex func (p *Person) updateToken(name string) { rw.Lock() defer rw.Unlock() // updateToken }
異常機制
go內建的error型別非常簡潔,只用實現Error方法即可,可以列印一些詳細的錯誤資訊,比如常見的函式多值返回,最後一個返回值經常是error,用於傳遞一些錯誤問題,這種方式要比java throw Exception的方法更優雅。
Defer代替finally
go中沒有java的finally了,那麼如果我們要關閉一些一些連線,檔案流等怎麼辦呢,為此go為我們提供了defer關鍵字,這樣就可以保證永遠被執行到,也就不怕關閉不了連線了。
f,err:=os.Open(filename) defer f.Close()