Go-day01

Go-實現hello_world

package main

import "fmt"

func main() {
	fmt.Println("hello world!")
}

GO-goroute併發

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)
}

Go-管道channel

  相似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

當出現代碼格式特別亂 能夠經過gofmt -w test.go ui

goroute&channel應用

 當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

Go的多返回值

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包的概念

  Go的編碼都是utf-8
  1.和python同樣,把相同功能的代碼放到同一個目錄,稱之爲包
  2.包能夠被其餘包引用
  3.main包是用來生成可執行文件,每一個程序只有一個main包
  4.包的主要用途是提升代碼的可複用性spa

 

Go練習用goroute打印0-99

  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)
}

  

  go build xxx/main -o /bin/test #生成go文件到bin下
go 編譯,有main函數的話 編譯後是可執行文件,沒有main函數 編譯後是lib庫
本站公眾號
   歡迎關注本站公眾號,獲取更多信息