2010-04-18 22 views

回答

4
func Read(b []byte) (n int, err os.Error) 

Read是一个辅助函数调用Reader.ReadReader定义为:var Reader io.Reader

crypto/rand/

io.Reader是一个封装的基本Read方法的接口。

Read最多可将len(p)字节转换为p。它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误。即使Read返回n < len(p),它也可以在呼叫期间使用全部p作为暂存空间。如果某些数据可用但不是len(p)字节,则Read通常会返回可用的数据,而不是等待更多数据。

在输入流结束时,Read返回0, os.EOFRead可能会返回一个不为零的字节数与一个非nil错误。特别是,耗尽输入的Read可能会返回n>0, os.EOF

type Reader interface { 
    Read(p []byte) (n int, err os.Error) 
} 

io/#Reader

例如,要读取的第一个16个随机字节,

package main 

import (
    "fmt" 
    "crypto/rand" 
) 

func main() { 
    b := make([]byte, 16) 
    n, err := rand.Read(b) 
    fmt.Println(n, err, b) 
} 

使用包init()功能,crypto/rand默认使用/dev/urandom

// Easy implementation: read from /dev/urandom. 
// This is sufficient on Linux, OS X, and FreeBSD. 
func init() { Reader = &devReader{name: "/dev/urandom"} } 

crypto/rand/rand.go

+0

您可以访问到*的/ dev/urandom的*,因为它已被定义于'的init()',而不是'newReader'(使用*的/ dev /随机*),因为它是未导出的。 – user316368 2010-04-18 22:48:47

+1

由于未导出newReader和devReader,因此始终使用/ dev/urandom。 – peterSO 2010-04-19 02:28:44