標籤:i++ 語言 體驗 UNC 結構 理解 mil 操作 包括
目錄
前言: go語言的第四篇文章,主要講述go語言中的方法,包括指標,結構體,數組,切片,映射,函數閉包等,每個都提供了樣本,可直接運行。
方法,介面及並發方法
方法就是一類帶特殊的接收者(struct)參數的函數
type city struct { name, address string}func (c city) sysCity() { c.name = "帝都" fmt.Println(c.name, c.address)}func testFunc() { c := city{ "北京", "二環", } c.sysCity() fmt.Println(c)}
//就在struct類型前加個*就是擷取結構體指標了func (c *city) sysCity() { c.name = "帝都" fmt.Println(c.name, c.address)}
介面
使用 interface關鍵字表示一個介面,介面是由一組方法簽名定義的集合
樣本:
//介面type adder interface { syso()}//隱式調用,無需聲明func (x city) syso() { fmt.Println(x.name, x.address)}func main() { var var1 adder var2 := city{ "長安", "皇城", } var1 = &var2 var1.syso() //還可以簡寫成這樣 var var3 adder = city{ "帝都", "皇城", } var3.syso()}
空介面:interface {} 沒有方法
為了判斷 一個介面值是否儲存了一個特定的類型,類型斷言可返回兩個值:其底層值以及一個報告斷言是否成功的布爾值。
例:t, ok := i.(T)
若 i 儲存了一個 T,那麼 t 將會是其底層值,而 ok 為 true。
否則,ok 將為 false 而 t 將為 T 類型的零值,程式並不會產生恐慌。
func main() { var i interface{} = "this go" v, ok := i.(string) fmt.Println(v, ok) v, ok := i.(int)}
並發
命令 go 新起一個線程叫go程,go程相當於另起一個線程
樣本:
func hello(x string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(x) }}func main() { go hello("go") hello("say")}
通道
通道是帶有類型的管道,你可以通過它用通道操作符 <- 來發送或者接收值。
(“箭頭”就是資料流的方向)
func sum(x int, var1 chan int) { sum := x for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) sum = sum + i } var1 <- sum}func main() { var1 := make(chan int) go sum(10, var1) go sum(20, var1) x, y := <-var1, <-var1 fmt.Println(x + y)}
ch := make(chan int, 100)
- 100指定緩衝大小
- 我的理解就是通道裡可以容納的量
嘗試輸出以下兩段代碼,或者將1改成2,體驗下區別:
func main() { ch := make(chan int, 1) ch <- 21 fmt.Println(<-ch) ch <- 100 fmt.Println(<-ch)}
func main() { ch := make(chan int, 1) ch <- 21 ch <- 100 fmt.Println(<-ch) fmt.Println(<-ch)}
結束語
初識 go 語言系列
- [x] 初識 go 語言
- [x] 初識 go 語言:文法
- [x] 初識 go 語言:資料類型
- [x] 初識 go 語言:方法,介面及並發
關注公眾號
初識 go 語言:方法,介面及並發