Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah penggunaan saluran MaybeReadByte memberikan tingkah laku 'rawak' dalam Go?
Adakah salah satu crypto/rand
包中的 Prime 函数(生成可能的素数)中,它调用 crypto/internal/randutil
包中的 MaybeReadByte
函数(如下所示)。根据函数描述,我可以理解为什么使用它,但我不明白这个实现如何有 50% 的机会读取字节。难道不应该保证 case
Go berlari sebelum yang lain?
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[:]) } }
Tidak.
Memandangkan kedua-dua case
membaca saluran yang sama, mereka sentiasa boleh melakukannya pada masa yang sama.
Atas ialah kandungan terperinci Bagaimanakah penggunaan saluran MaybeReadByte memberikan tingkah laku 'rawak' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!