Heim  >  Artikel  >  Backend-Entwicklung  >  Wie sorgt die Verwendung von Kanälen durch MaybeReadByte für „zufälliges“ Verhalten in Go?

Wie sorgt die Verwendung von Kanälen durch MaybeReadByte für „zufälliges“ Verhalten in Go?

王林
王林nach vorne
2024-02-06 09:55:03390Durchsuche

MaybeReadByte 对通道的使用如何在 Go 中提供“随机”行为?

Frageninhalt

Läuft einer von Gos crypto/rand 包中的 Prime 函数(生成可能的素数)中,它调用 crypto/internal/randutil 包中的 MaybeReadByte 函数(如下所示)。根据函数描述,我可以理解为什么使用它,但我不明白这个实现如何有 50% 的机会读取字节。难道不应该保证 cases vor dem anderen?

var (
    closedChanOnce sync.Once
    closedChan     chan struct{}
)

// MaybeReadByte reads a single byte from r with ~50% probability. This is used
// to ensure that callers do not depend on non-guaranteed behaviour, e.g.
// assuming that rsa.GenerateKey is deterministic w.r.t. a given random stream.
//
// This does not affect tests that pass a stream of fixed bytes as the random
// source (e.g. a zeroReader).
func MaybeReadByte(r io.Reader) {
    closedChanOnce.Do(func() {
        closedChan = make(chan struct{})
        close(closedChan)
    })

    select {
    case <-closedChan:
        return
    case <-closedChan:
        var buf [1]byte
        r.Read(buf[:])
    }
}

Richtige Antwort


Nein.

Nach Vorgaben:

Da beide caseden gleichen Kanal lesen, können sie es immer gleichzeitig tun.

Das obige ist der detaillierte Inhalt vonWie sorgt die Verwendung von Kanälen durch MaybeReadByte für „zufälliges“ Verhalten in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen