go學習總結(九)

2021-10-02 12:41:02 字數 2985 閱讀 6730

1.實現reader型別

package main

import "golang.org/x/tour/reader"

type myreader struct{}

// todo: 給 myreader 新增乙個 read(byte) (int, error) 方法

func (r myreader) read(b byte) (int, error)

func main() )

}

2.rot13reader

package main

import (

"io"

"os"

"strings"

"fmt"

)type rot13reader struct

func rot13(out byte) byte

return out

}

func (fz rot13reader) read(b byte) (int,error)

return n,e

}func main()

io.copy(os.stdout, &r)

}

3.image

package main

import "golang.org/x/tour/pic"

type image struct{}//新建乙個image結構體

func (i image) colormodel() color.model

func (i image) bounds() image.rectangle

func (i image) at(x,y int) color.color

}func main()

pic.showimage(m)

}

4.goroutine

package main

import (

"fmt"

"time"

)func say(s string)

}func main()

5.通道

通道是帶有型別的管道,你可以通過它用通道操作符 <- 來傳送或者接收值。

ch <- v // 將 v 傳送至通道 ch。

v := <-ch // 從 ch 接收值並賦予 v。

(「箭頭」就是資料流的方向。)

和對映與切片一樣,通道在使用前必須建立:

ch := make(chan int)

package main

import "fmt"

func sum(s int, c chan int)

c <- sum // 將和送入 c

}func main()

c := make(chan int)

go sum(s[:len(s)/2], c)

fmt.println(1,c)

p:=&c

fmt.println(2,p)

fmt.println(3,*p)

x:= <-c

fmt.println(4,x)

go sum(s[len(s)/2:], c)

fmt.println(5,c)

y:= <-c

fmt.println(6,y)

go sum(s[1:3],c)

i,j,k :=<-c, <-c, <-c

fmt.println(7,i,j,k)

}執行結果如下:

1 0x430080

2 0x40c138

3 0x430080

4 17

5 0x430080

6 -5

fatal error: all goroutines are asleep - deadlock!

為什麼會報deadlock呢?因為在第七步輸出時,前面兩個c的輸入值已經被x,y取走了,所以此時想再將c的值傳給i,j已經做不到了。即c的輸入值被取過一次此時已經空了,而i,j還在等待輸入,故發生死鎖。改為如下則ok。

package main

import "fmt"

func sum(s int, c chan int)

c <- sum // 將和送入 c

}func main()

c := make(chan int)

go sum(s[:len(s)/2], c)

fmt.println(1,c)

p:=&c

fmt.println(2,p)

fmt.println(3,*p)

//x:= <-c

go sum(s[len(s)/2:], c)

fmt.println(5,c)

//y:= <-c

go sum(s[1:3],c)

i,j,k :=<-c, <-c, <-c

fmt.println(7,i,j,k)

}1 0x430080

2 0x40c138

3 0x430080

5 0x430080

7 10 17 -5

6.帶緩衝通道

通道可以是 帶緩衝的。將緩衝長度作為第二個引數提供給 make 來初始化乙個帶緩衝的通道:

ch := make(chan int, 100)

僅當通道的緩衝區填滿後,向其傳送資料時才會阻塞。當緩衝區為空時,接受方會阻塞。

package main

import "fmt"

func main()

package main

import "fmt"

func main()

package main

import "fmt"

func main()

7.

Go語言學習九 Go語言指標

go 語言中指標是很容易學習的,go 語言中使用指標可以更簡單的執行一些任務。接下來讓我們來一步步學習 go 語言指標。我們都知道,變數是一種使用方便的佔位符,用於引用計算機記憶體位址。go 語言的取位址符是 放到乙個變數前使用就會返回相應變數的記憶體位址。package main import f...

go學習總結(七)

1.斐波拉契閉包 package main import fmt 返回乙個 返回int的函式 func fibonacci func int func main package main import fmt func main 2.指標函式 package main import fmt math...

go學習 goroutine併發學習總結

go最大的特性就是併發了,所以這一塊是go的重點知識,我自己花了一些時間,好好學習這個基礎知識。文章內容為個人學習理解,所以文章如果有不對之處,非常感謝指出。說起go併發,一般都會指go協程,即goroutine,而實現goroutin的關鍵字就是go。我學習go併發用到的關鍵字總結 sync.mu...