go go 語句及其執行規則

2021-09-12 18:47:46 字數 1418 閱讀 6638

package main

import (

"fmt"

)func main() ()

}}

不會列印任何內容:

當程式執行到一條 go 語句時,go 語言執行時系統會試圖從某個存放空閒的 goroutine 的佇列中獲取乙個 goroutine,找不到時才會建立乙個 goroutine。

然後 go 語言執行時系統用該 goroutine 包裝當前的 go 函式,再將該 goroutine 追加到存放某個可執行的 goroutine 佇列中。

因此,go 函式的執行時間總是會滯後於所屬的 go 語句的執行時間。

而 for 語句會以很快的速度執行完畢,但那 10 個包裝了 go 函式的 gorouting 往往還沒獲得執行的機會。

一旦主 goroutine 中的**執行完畢,當前的 go 程式就會結束執行。

package main

import (

"fmt"

)func main() 代表既不不含任何欄位也不擁有任何方法的空結構體型別

// 僅僅把通道當作傳遞某種簡單訊號的介質時,struct{} 作為元素型別是最好的

sign := make(chan struct{}, num) // 通道長度與 goroutine 數量一致

for i := 0; i < num; i++ 的方法只有乙個,即 struct{}{},占用的記憶體空間是 0 位元組

sign

}()} // 從通道接收元素值,接收的次數應當與 goroutine 數量一致

如何在使用 goroutine 的情況下,讓上述列印的結果為 0 到 9?

package main

import (

"fmt"

"sync/atomic"

"time"

)func main()

// 如果該值與引數 i 不等

// 讓當前 goroutine 睡眠乙個納秒再進入下乙個迭代

time.sleep(time.nanosecond)

} }for i := uint32(0); i < 10; i++

trigger(i, fn)

}(i) // 呼叫時將變數 i 的值傳遞進去

} // 讓主 goroutine 最後乙個執行完畢

函式的執行規則

函式的執行規則 var fn fn 在棧記憶體中宣告變數 fn function fn 在堆中宣告函式 fn fn fn is not a function 1 函式在執行的時候,先去棧記憶體中尋找有fn的變數,再去堆記憶體中尋找對應的fn記憶體位址,如果找到,則執行,反之報錯 2 如果在棧記憶體中...

Golang 的defer執行規則

defer是golang的乙個特色功能,被稱為 延遲呼叫函式 當外部函式返回後執行defer。類似於其他語言的 try catch finally 中的finally,當然差別還是明顯的。在使用defer之前我們應該多了解defer的特性,這樣才能避免使用上的誤區。1.最簡單的deferfunc t...

序列規則執行器rules executor

1.操作型規則 abstractoperaterule 對輸入的資料進行加工處理.2.過濾型規則 abstractfilterrule 符合條件的通過,繼續執行後續的規則 否則丟棄,直接返回null.3.條件型規則 abstractconditionrule 符合條件的通過,繼續執行後續的規則 否則...