golang 學習筆記

迷失no發表於2019-03-26

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 安裝

相關文章