一,第一個go程序,hello world!!! linux
建立learngo目錄,再建立src,最後編寫hello.go文件web
package main import ( "fmt" ) func main(){ fmt.Printf("hello world!!!") }
從第一個go程序中,咱們能夠初始認識一下go 語言的程序結構編程
1,package 聲明go語言的包,windows
2,import 導入包多線程
3,func main() {} go語言函數函數
在go語言中 須要注意的幾個地方單元測試
(1)packeage main 表示這個包是能夠編譯成可執行文件的(可執行文件和庫的區別是,可執行文件編譯完成以後,就能夠獨自執行,若是是庫文件編譯完後只能生產一個lib庫,lib庫只能被其它可執行程序調用)測試
(2)go 語言中導入的包或者定義的變量,函數等,須要在程序中使用,若是沒有使用,程序編譯會報錯。這也是Go語言中遵循極簡的編程思路ui
編寫完第一個go程序後,如何運行? 找到你編寫的go 文件,而後執行 go run src/hello.go(快速執行go 文件)spa
二,go 語言中命令的常規使用
(1)go語言環境變量的查看,在windows 下執行go env 便可列出go語言的全部環境變量
這些變量中最重要的是GOPATH,全部的源碼,程序都放在GOPATH中,GOPATH 路徑最好只設置一個
另外 go 語言有是跨平臺的,在windows 下編寫一個go 程序,完成編譯後,在Linux下任然能夠執行
(2)go build 命令是用來編譯go 程序的,編譯完成以後會生成一個.exe 二進制文件,這個文件不論放在那裏均可以執行, go build project/webdev/main, 在編譯命令中,只須要寫src 之後的文件路徑就能夠
(3)go install 命令是安裝可執行文件到bin目錄 go install project/webdev/main,第一次執行go install後GOpath 中會自動生成一個bin 目錄,這個bin 目錄存放全部編譯後的可執行程序
(4).\ 就能夠運行編譯後的可執行的.exe 文件
(5)go test 執行單元測試,源碼文件名稱中加上_test ,在文件中定義函數,函數命定義func Testadd(t *testing.T),go 語言在編譯中不會將測試文件編譯到其中
測試代碼示例
package calc import ( "testing" #導入testing 模塊 ) func TestAdd(t *testing.T) { #test 函數定義 var sum int sum = Add(5, 6) if sum != 10 { t.Fatalf("add is not right, sum:%v expected:11",sum) #定義出錯時輸出 } t.Logf("add is ok") #打印正確日誌 }
(6)go fmt 格式化全部源碼,將源碼的格式進行標準化, go fmt -w ./* 能夠當前目錄下全部文件都格式化
三,編寫自定義的go 語言包
(1)新建一個目錄,例如calc
package cale #聲明這個包的名字,最好是和本身所建立的目錄一致 func Add(a int, b int) int { #本句中,前兩個int是聲明參數的數據類型,後一個int爲返回值的類型 #go 語言爲強類型語言,變量通常都須要指定類型 return a+b }
(2)新建go的包後,如何在其它代碼中引導入,(注意,導入的時候須要把整個包都導入,不能單獨導入包中的某個.go文件)
package main import ( "fmt" cale "project/webdev/calc" #導入自定義包(導入路徑是src以後的路徑)
#路徑前面的cale爲包設置別名 ) func main() { x := calc.Add(1,2) #go 語言中包中的函數的調用,包的名字的.函數導入 fmt.Printf("x:%d".x) }
(3)go 語言中包的組織,須要注意,在同一個目錄下,全部的go 源碼文件中聲名包都只能有一個,即package 包名 只能有一個,若是出現多個,會出現編譯報錯,另外,包的名字爲main 並且有func main 這個包編譯完以後是可執行的
四,go 語言多線程的定義
基於CSP 模型實現
func calc() {
//大量計算
}
func main() {
go calc() #在函數前面添加go 語句
}
五,go語言中程序通訊方式----只有管道
(1)管道,相似unix/linux中的pipe
(2)多個goroute 之間經過channel進行通訊
(3)支持go語言中的任何類型
func main() { pipe := make(chan int,3) #pip := 定義pip 變量,make 分配空間 pipe <- 1 #chan 管道,int 爲管道中的數據類型,3爲管道的內存大小 pipe <- 2 #<- 存入數據
var a int
a <- pipe #讀取管道中的數據 }
六,go語言返回多個值
go語言中須要在函數定義時就定義返回值的類型
func calc(a int, b int) (int,int) { #(int,int)定義返回值的類型 sum := a+b avg := (a+b)/2 return sum, avg #返回多個值 }