package main import "fmt" func main() { fmt.Println("hello world!") }
package main import ( "fmt" "time" ) func test_goroute(a int ,b int){ sum := a + b fmt.Println(sum) } func main() { for i := 0 ; i < 100 ; i ++ { go test_goroute(200,100) } time.Sleep(2 *time.Second) }
相似unix/linux的pipe
多個goroute之間經過channel通訊
支持任何類型
func main(){
pipe := make(chan int,3) //chan 管道 3表明管道的大小
pipe <- 1
pipe <- 2python
}linux
csp模型(Communication Sequential project) goroute+channel併發
全局變量也能夠作,可是不建議使用函數
package main import ( "fmt" //"time" ) func test_pipe(){ //建立一個大小爲3的管道 pipe := make(chan int,3) pipe <- 1 pipe <- 2 pipe <- 3 var t1 int t1 = <- pipe //管道先進先出 pipe <- 4 fmt.Println(t1) fmt.Println(len(pipe)) } func main() { test_pipe() //time.Sleep(1 *time.Second) } /* 當放入的數據大於管道大小會編譯的時候會產生死鎖 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]: main.test_pipe() C:/Users/liujiliang/PycharmProjects/firstgo/hello.go:14 +0xae main.main() C:/Users/liujiliang/PycharmProjects/firstgo/hello.go:19 +0x27 exit status 2 */
當出現代碼格式特別亂 能夠經過gofmt -w test.go ui
當channel裏沒put值的時候,取管道數據默認會阻塞住編碼
package main import "fmt" import "time" var pipe chan int func add_sum(a int,b int ) { sum := a + b time.Sleep(3 * time.Second) pipe <- sum } func main() { pipe = make(chan int ,1) go add_sum(1,2) c :=<- pipe fmt.Println("num=" ,c) } // 3秒後打印3
package main import "fmt" func calc(a int,b int) (int,int){ c := a + b d := (a + b)/2 return c, d } func main() { //sum,avg := calc(10,5) //多個返回值 sum,_ := calc(100,200) //多個返回值 其中一個不用,採用下劃線佔位 //fmt.Println("sum=",sum,"avg=",avg) fmt.Println("sum=",sum) }
Go的編碼都是utf-8
1.和python同樣,把相同功能的代碼放到同一個目錄,稱之爲包
2.包能夠被其餘包引用
3.main包是用來生成可執行文件,每一個程序只有一個main包
4.包的主要用途是提升代碼的可複用性spa
goroute和主線程一塊兒運行線程
package main import ( "fmt" "time" ) func test_goroute(a int){ fmt.Println(a) } func main() { for i := 0 ; i < 100 ; i ++ { go test_goroute(i) } time.Sleep(3 *time.Second) }