Go의 crypto/rand
包中的 Prime 函数(生成可能的素数)中,它调用 crypto/internal/randutil
包中的 MaybeReadByte
函数(如下所示)。根据函数描述,我可以理解为什么使用它,但我不明白这个实现如何有 50% 的机会读取字节。难道不应该保证 case
중 하나가 다른 것보다 먼저 실행됩니까?
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
모두 동일한 채널을 읽기 때문에 언제든지 동시에 읽을 수 있습니다.
위 내용은 MaybeReadByte의 채널 사용은 어떻게 Go에서 '무작위' 동작을 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!