(1)理解go func背後發生了什麼?

2021-09-28 14:21:12 字數 1852 閱讀 7441

參考:

(1)a與b分布在不同的goroutine佇列

package main

import (

"fmt"

"sync"

)func main()

wg.add(20)

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

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

} wg.wait()

}

輸出:

a:  4

b: 4

b: 0

a: 10

a: 10

a: 10

a: 10

a: 10

a: 10

b: 9

a: 10

b: 7

a: 10

b: 2

b: 5

b: 3

a: 8

b: 6

b: 1

b: 8

結論:

a與b所在的協程執行順序不確定,a輸出的大部分為10,可能輸出i的中間值

b輸出的是0到9的值,輸出順序也是不確定的。

這是因為a與b分布在不同的goroutine佇列。

package main

import (

"fmt"

"sync"

"runtime"

)func main()

wg.add(20)

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

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

}wg.wait()

}

輸出:

b:  9

a: 10

a: 10

a: 10

a: 10

a: 10

a: 10

a: 10

a: 10

a: 10

a: 10

b: 0

b: 1

b: 2

b: 3

b: 4

b: 5

b: 6

b: 7

b: 8

結論:

多次執行結果都是上面一樣。先輸出b: 9,然後10個a: 10,然後b輸出0到8

runtime. gomaxprocs(1) 強行指定了只建立乙個 「p」 來處理併發,這使得例子中的 20 個 goroutine 會是序列的

編譯器會把 go 後面跟著的函式與引數都打包成g物件,等待系統排程。

package main

import (

"runtime"

"time"

)func main()

time.sleep(time.second)

}

輸出結果:0 1 2 3 ... 8 9 注意輸出的不是10個10

再如下:

package main

import (

"runtime"

"time"

)func main()

runtime.gosched()

time.sleep(time.second)

}

輸出結果:

901

2345

678

Golang append原理以及發生了什麼

type slice strucefunc slice type,elems type 值為結構體的情況下考慮使用指標。返回乙個新的切片先根據傳參觀察是否需要擴容 如果要擴容,擴容本質是分配一塊更大的記憶體,並將舊slice的資料拷貝進新的slice。若原slice容量小於1024就會將容量擴大為原...

輸入URL位址到最終頁面渲染完成,發生了什麼事

1.url輸入回車 2.dns解析 解析什麼?變成什麼 url 相對伺服器的ip位址 伺服器的ip位址 3.瀏覽器網路向相應伺服器傳送tcp ip連線請求 三次握手 4.建立tcp ip連線 5.瀏覽器網路發起http請求 6.等待 響應過程 wariting 8.解析html 四次揮手 10.時間...

從輸入url到頁面顯示內容的過程發生了什麼

瀏覽器通過輸入的url來解析要請求的是什麼協議,構建請求報文,這裡要構建的就是http請求報文。http請求報文包括報文首部和報文主體,對請求報文來說,報文首部包括請求行和各種首部字段 而對響應報文來說,報文首部包括狀態行和各種首部字段。請求行 get http 1.1 請求方法和相應的協議 狀態行...