golang 簡(jiǎn)介
靜態(tài) 強(qiáng)類型 編譯型語言
GO語言適用場(chǎng)景及GO語言的優(yōu)勢(shì)
Go語言是谷歌推出的一種全新的編程語言覆积,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性。谷歌首席軟件工程師羅布派克(Rob Pike)說:
我們之所以開發(fā)Go莫鸭,是因?yàn)檫^去10多年間軟件開發(fā)的難度令人沮喪。
Go是谷歌2009發(fā)布的第二款編程語言脑沿。該獎(jiǎng)項(xiàng)授予在2009年市場(chǎng)份額增長(zhǎng)最多的編程語言悲靴。
谷歌資深軟件工程師羅布·派克(Rob Pike)表示,“Go讓我體驗(yàn)到了從未有過的開發(fā)效率护昧』昶”派克表示,和今天的C++或C一樣惋耙,Go是一種系統(tǒng)語言捣炬。他解釋道熊昌,“使用它可以進(jìn)行快速開發(fā),同時(shí)它還是一個(gè)真正的編譯語言湿酸,我們之所以現(xiàn)在將其開源婿屹,原因是我們認(rèn)為它已經(jīng)非常有用和強(qiáng)大。
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
公有變量/函數(shù) 私有變量/函數(shù)
大些字母開頭的變量或者函數(shù)等是public的推溃,可以被其他包訪問昂利;小些的則是private的,不能被其他包訪問到铁坎。這樣就省去了public和private聲明的煩惱蜂奸,使代碼變的更簡(jiǎn)潔。
map
map類型厢呵,Java里是Map接口窝撵,go里叫做字典
ages := make(map[string]int)
ages["weimin"] = 20
ages["brother"] = 30
fmt.Print(ages["michael"])
//刪除
delete(ages,"michael")
函數(shù)方法
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()
}
包名調(diào)用稱之為函數(shù)
創(chuàng)建對(duì)象實(shí)例調(diào)用稱之為方法
多返回值
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
結(jié)構(gòu)體
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
}
//值拷貝,不改變?cè)瓉淼腢ser對(duì)象值
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類型碌奉,不過它不需要強(qiáng)制實(shí)現(xiàn),在Go中寒砖,如果你這個(gè)類型(基本類型赐劣,結(jié)構(gòu)體等都可以)擁有了接口的所有方法,那么就默認(rèn)為這個(gè)類型實(shí)現(xiàn)了這個(gè)接口哩都,是隱式的魁兼,不需要和java一樣,強(qiáng)制使用implement強(qiáng)制實(shí)現(xiàn)漠嵌。
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)
}
并發(fā)
- go run() go 關(guān)鍵字 開啟一個(gè)協(xié)程 (輕量級(jí)線程)
- 協(xié)程通信(類似java selector channel 機(jī)制)
- 同步(sync咐汞,sync.WaitGroup)
package main
import "fmt"
//協(xié)程通信
exit := make(chan struct{})
go func() {
time.Sleep(time.Second * 3)
println("chan1 chan goroutine end")
defer close(exit) //關(guān)閉通道
}()
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
}
異常機(jī)制
go內(nèi)置的error類型非常簡(jiǎn)潔,只用實(shí)現(xiàn)Error方法即可儒鹿,可以打印一些詳細(xì)的錯(cuò)誤信息化撕,比如常見的函數(shù)多值返回,最后一個(gè)返回值經(jīng)常是error约炎,用于傳遞一些錯(cuò)誤問題植阴,這種方式要比java throw Exception的方法更優(yōu)雅。
Defer代替finally
go中沒有java的finally了圾浅,那么如果我們要關(guān)閉一些一些連接掠手,文件流等怎么辦呢,為此go為我們提供了defer關(guān)鍵字狸捕,這樣就可以保證永遠(yuǎn)被執(zhí)行到喷鸽,也就不怕關(guān)閉不了連接了。
f,err:=os.Open(filename)
defer f.Close()
golang 應(yīng)用
- 七牛云
- docker
- 抖音
- 比特幣
GoLang 相關(guān)
官網(wǎng)
學(xué)習(xí)書籍
Go Web 編程
how to write go
go example
golang mac 安裝