golang閉包學習記錄

2021-09-22 10:17:51 字數 1300 閱讀 9668

func testclosure() ()

time.sleep(time.second) //如果這裡不sleep,上面的協程還沒來得及修改共享變數,下面輸出1,

fmt.print(i)//輸出2,說明閉包是對同一變數的引用,而不是copy

}type field struct

func (p *field) print()

func testclosure1() , , }

for _, v := range data

time.sleep(time.second)

data1 := *field, , }

for _, v := range data1

time.sleep(time.second)

//輸出如下

//three 0xc0000101e0

//three 0xc0000101e0

//three 0xc0000101e0

//three 0xc0000a8040

//one 0xc0000a8020

//two 0xc0000a8030

//區別在於對data中每個元素呼叫print時,實際傳入print的值是v的位址,在迭代的過程中

//這個位址指向的值一直在被更新,因此三次輸出了最後一次更新的值

//而對data1中每個元素呼叫print時,實際傳入print的是指標本身的值,即在三次迭代的過程中

//傳入print的是三個不同的指標,分別指向data1中的每個元素,因此每次輸出的值不同

}func testclosure2() , , }

for _, v := range data ()

} time.sleep(time.second)

data1 := *field, , }

for _, v := range data1 ()

} time.sleep(time.second)

//輸出如下

//three 0xc000090030

//three 0xc000090030

//three 0xc000090030

//three 0xc0000a0040

//three 0xc0000a0040

//three 0xc0000a0040

//與testclosure1中的區別在於,go v.print()會立即解析v的值並傳入協程的棧中

//而閉包只是共享了v,在協程開始執行之前,v的值已經被更新了多次,因此輸出的均是最後一次更新的值

}

golang學習之閉包

匿名函式不能夠獨立存在,但可以被賦值於某個變數,即儲存函式的位址到變數中 fplus func x,y int int,然後通過變數名對函式進行呼叫 fplus 3,4 當然,也可以直接對匿名函式進行呼叫 func x,y int int 3,4 func 表示引數列表的第一對括號必須緊挨著關鍵字f...

golang學習系列 17 閉包的應用

目錄 一.閉包作返回值 示例1示例2 結論 二.用閉包除錯 func add func int int func add2 x int func a int int func main 結果如下 func add x int func y int int func main 結果如下 定義閉包時引用...

golang閉包裡的坑

介紹 go的閉包是乙個很有用的東西。但是如果你不了解閉包是如何工作的,那麼他也會給你帶來一堆的bug。這裡我會拿出go in action這本書的一部分 來說一說在使用閉包的時候可能遇到的坑。全部的 在github上。閉包的坑 首先看一段 search search.go launch a goro...