Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah penggunaan saluran MaybeReadByte memberikan tingkah laku "rawak" dalam Go?

Bagaimanakah penggunaan saluran MaybeReadByte memberikan tingkah laku "rawak" dalam Go?

王林
王林ke hadapan
2024-02-06 09:55:03391semak imbas

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

Kandungan soalan

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[:])
    }
}

Jawapan betul


Tidak.

Mengikut spesifikasi:

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam