在 Go 的 crypto/rand
包中的 Prime 函数(生成可能的素数)中,它调用 crypto/internal/randutil
包中的 MaybeReadByte
函数(如下所示)。根据函数描述,我可以理解为什么使用它,但我不明白这个实现如何有 50% 的机会读取字节。难道不应该保证 case
s 之一先于另一个运行吗?
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[:]) } }
没有。
根据规范:
由于两个 case
s 读取相同的通道,因此它们总是能够同时进行。
以上是MaybeReadByte 对通道的使用如何在 Go 中提供'随机”行为?的详细内容。更多信息请关注PHP中文网其他相关文章!