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
- 抖音
- 比特幣