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 {
age int
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 {
age int
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 {
age int
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()
複製程式碼
golang 應用
- 七牛雲
- docker
- 抖音
- 比特幣
GoLang 相關
官網 學習書籍 Go Web 程式設計 how to write go go example golang mac 安裝