參考:
(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 請求方法和相應的協議 狀態行...