第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go test 和 go run 執(zhí)行以下通道代碼,但結果不同。為什么?

go test 和 go run 執(zhí)行以下通道代碼,但結果不同。為什么?

Go
慕工程0101907 2022-05-18 15:39:20
main.gofunc main() {    fmt.Println("hello")    ch := make(chan struct{}, 1)    <-ch}main_test.gofunc Test_Main(t *testing.T) {    main()}去運行 main.go  hello  fatal error: all goroutines are asleep - deadlock!  goroutine 1 [chan receive]:  main.main()但是去測試 -v main_test.go -run=Test_Main=== RUN   Test_Mainhellogo test 不會報錯,會一直運行。查閱了很多資料,也沒有找到解釋這個現(xiàn)象的答案??赡苁俏业姆绞讲粚??這個通道方式是在項目中使用的。謝謝。
查看完整描述

1 回答

?
搖曳的薔薇

TA貢獻1793條經(jīng)驗 獲得超6個贊

當您運行常規(guī)程序時,它會等待來自通道的輸入。而且因為只有一個 goroutine,所以無法從通道接收輸入(沒有其他線程可以發(fā)送給它)。因此報告了死鎖。


另一方面,測試運行器使用 goroutines 來執(zhí)行測試。所以產(chǎn)生了不止一個 goroutine 并且沒有檢測到死鎖(運行時假設其他 goroutine 可以發(fā)送到通道)。


從評論中回答您的問題: go run 和 go test 不應該達到相同的效果。go run 執(zhí)行你的程序, go test 執(zhí)行測試你的代碼的程序。這些命令執(zhí)行兩個不同的程序。


我不確定您是否可以通過測試檢測到這種錯誤(死鎖)。


編輯: go test等待測試完成(您可以使用-timeout d選項配置多長時間)。所以我假設它產(chǎn)生了等待timer.Timer過期的 goroutine,所以沒有死鎖(總是有一個 goroutine 有機會被執(zhí)行)。


Edit2: 試試這個程序:


package main


import (

    "fmt"

    "time"

)


func main() {

    go func() {

        t := time.NewTimer(10 * time.Second)

        <-t.C

    }()

    fmt.Println("hello")

    ch := make(chan struct{}, 1)

    <-ch

}

它在報告死鎖之前等待 10 秒。


Edit3: 或者看一下說明測試運行器如何工作的流動代碼:


package main


import (

    "fmt"

    "time"

)


func original_main_func() {

    fmt.Println("hello")

    ch := make(chan struct{}, 1)

    <-ch

}


func test() {

    original_main_func()

}


func test_runner() {

    ch := make(chan struct{}, 1)

    go func() {

        test()

        close(ch)

    }()

    t := time.NewTimer(10 * time.Second)

    select {

    case <-t.C:

        panic("timeout")

    case <-ch:

        fmt.Println("test executed")

    }

}


func main() {

    test_runner()

}


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號