目錄
- 1、golang簡介
- 2、安裝
- 3、指標
- 4、gotrace
- 1、golang簡介
- 2、安裝
- 3、指標
- 4、gotrace
1、golang簡介
google於2009年推出的系統程式設計語言
特點:
靜態編譯,沒有依賴
記憶體回收
簡潔的符號和文法
平坦的類型系統
基於CSP的並行存取模型,充分利用多核
高效簡單的工具鏈
豐富的標準庫
hello world:
package mainimport "fmt"func main() { fmt.Println("hello world")}
web編程:
package mainimport ( "fmt" "net/http")#w http.ResponseWriter左邊是參數名字,右邊是類型;*是指標func handler(w http.ResponseWriter,r *http.Request) { fmt.Fprintf(w,"Hello world!") #Fprintf意思是把"Hello world!"寫到w對象}func main() { http.HandleFunc("/",handler) http.ListenAndServe(":8080",nil)}
C10K問題:
func handle(conn net.Conn) { fmt.Fprintf(conn, "%s", time.Now().String()) conn.Close()}func main() { l,err := net.Listen("tcp",":8080") if err != nil { log.Fatal(err) } for { conn,err := l.Accept() if err != nil { log.Fatal(err) } go handle(conn) #開啟協程,並發 }}
並行和並發:
並發(concurrent)不是並行(parallel):node.js具有並發的能力,但不能充分利用多核(並行)
寫出一個能充分利用多核的程式需要很深的系統編程積澱
得益於優秀的設計,go可以輕鬆地寫出跑滿所有cpu的程式
python多線程是偽線程(受一個全域鎖限制),不能利用多核
python多進程呢?
python的協程呢?
2、安裝
軟體包:
go1.10.1.windows-amd64.zip win
go1.10.1.darwin-amd64.tar.gz OS
配置環境變數:
GOROOT放置go的標準庫和工具鏈 $HOME/local/go (linux,mac) c:\local\go (win)GOPATH放置第三方代碼和自己的工程 $HOME/go (linux,mac) c:\go (win)PATH export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
vim hello.go
package mainimport "fmt"func main() { fmt.Println("hello world")}
go run hello.go #會列印出hello world
go build hello.go #會產生一個hello.exe可執行檔,在cmd下執行,和go run的效果一樣
linux或者mac上,可以執行:
GOOS=darwin go build -o hello.mac hello.go
GOOS=windows go build -o hello.exe hello.go
GOOS=linux go build -o hello.linux hello.go
windows上:
C:\go>set GOOS=windows
C:\go>go build hello.go #設定環境變數,然後編譯
安裝atom
安裝外掛程式go-plus
gofmt -w hello.go #將代碼格式化
手動安裝工具:
goimports -w hello.go #自動引用包,需要額外安裝cd $GOPATH && mkdir -p src/golang.org/xcd $GOPATH/src/golang.org/xgit clone https://github.com/golang/tools.git #可以去github上下載,然後解壓,並重新命名為toolsgo install golang.org/x/tools/cmd/goimports #在GOPATH/bin目錄下產生了goimports的可執行檔
利用atom自動安裝,安裝go-plus自動安裝,但是要FQ!同時依賴git用戶端
因此會提示:
$ go get -u golang.org/x/tools/cmd/goimports$ go get -u golang.org/x/tools/cmd/gorename$ go get -u github.com/sqs/goreturns$ go get -u github.com/nsf/gocode$ go get -u github.com/alecthomas/gometalinter$ go get -u github.com/zmb3/gogetdoc$ go get -u github.com/zmb3/goaddimport$ go get -u github.com/rogpeppe/godef$ go get -u golang.org/x/tools/cmd/guru$ go get -u github.com/fatih/gomodifytags$ go get -u github.com/tpng/gopkgs從github上將上面的diamante下載下來,除了x/tools相關工具,解壓到$GOPATH/src/github.com對應目錄下,並重新命名然後手動用go install ...安裝,重啟atom,ok
GOPATH目錄結構:
bin #編譯產生的可執行檔pkg #src #源碼,全域唯一 github.com #放置github的項目 繼續下面就是使用者名稱 最後就是項目名#依賴git命令,-d參數是只下載不安裝,-u是通過網路更新軟體及其依賴go get : Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.go get -d github.com/51reboot/golang-01-homeworkcd $GOPATH/src/github.com/51reboot/golang-01-homework
常用工具:
編譯: go build測試: go test下載更新依賴並編譯: go get自動文檔工具: godoc -http=:9090,然後訪問本地9090連接埠線上查看文檔: godoc.org/github.com/golang/protobuf/proto
3、指標
package mainimport "fmt"func main() { var x int x = 1 var y int y = 3 var p *int //*是指標的意思 p = &x //&是取地址的意思,p的值是儲存x的地址 fmt.Println("p=", p) fmt.Println("*p=", *p) //*是取p指標指向的值 fmt.Println("x=", x) *p = 2 fmt.Println(x) p = &y fmt.Println("*p=",*p)}
指標是操縱變數的變數。
直接傳變數,內容太大
需要一個通用的變數能修改一類變數
文法:
*T即為類型T的指標,T可以是任何類型、包括指標類型&t即為取變數t的地址,指標本來指向的就是記憶體中一塊地址,是一串數字,但是編譯器不允許隨便指定指標為一串數字*p即為取指標變數所執行的內容
package mainimport "fmt"func main() { var x int x = 1 add(x) fmt.Println("x=",x) addpointer(x) fmt.Println("x=",x)}func add(q int) { //將x賦值給p變數 q = q + 1 //p變數值是2,但是x變數還是1,python中也一樣,不過沒有下面的用法}func addpointer(r *int) { //r是指標,指向x變數 r = *r + 1 //r指向(r指向的值+1)}
Go中變數就是記憶體中的一塊地址儲存的內容,指標是指向此地址的變數
Python中傳參就沒有傳入指標的說法了。
4、gotrace
https://github.com/divan/gotrace