> For the complete documentation index, see [llms.txt](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/08.0/08.5/08.5.4.md).

# 08.5.4 从/dev/random中读取

在本节中，你将学习如何从`/dev/random`系统设备读取数据。`/dev/random`系统设备的目的是生成随机数据，你可以使用这些数据来测试程序，或者，在本例中，你将为随机数生成器生成随机数种子。从`/dev/random`获取数据可能有些棘手，这也是要在这里特别讨论它的主要原因。

在`macOS High Sierra`机器上，`/dev/random`文件具有如下的权限：

```
$ ls -l /dev/random
crw-rw-rw-  1 root  wheel   14,   0  Jan 8 20:24 /dev/random
```

同样，在`Debian Linux`机器上，`/dev/random`系统设备具有如下的`Unix`文件权限：

```
$ ls -l /dev/random
crw-rw-rw-  1 root  root   1,   8  Jan 13 12:19 /dev/random
```

这意味着`/dev/random`文件在这两种`Unix`变体系统上具有类似的文件权限。惟一区别是它们的文件组权限不同，`macOS`是`wheel`，`Debian Linux`上是`root`。

本节主题的程序是`devRandom.go`，分为三部分。第一部分代码如下：

```go
package main

import (
    "encoding/binary"
    "fmt"
    "os"
)
```

为了从`dev/random`中读取数据，需要引入`encoding/binary`标准包，因为`/dev/random`返回二进制数据，需要解码。

`devRandom.go`第二部分代码如下：

```go
func main() {
    f, err := os.Open("/dev/random")
    defer f.Close()

    if err != nil {
        fmt.Println(err)
        return
    }
```

和以往一样，打开`/dev/random`，因为Unix中一切皆是文件。

`devRandom.go`最后一部分代码如下：

```go
    var seed int64
    binary.Read(f, binary.LittleEndian, &seed)
    fmt.Println("Seed:", seed)
}
```

调用`binary.Read()`函数从`/dev/random`系统设备中读取数据， `binary.Read()`函数需要三个参数：第二个参数(`binary.LittleEndian`)指定了小端字节序，另一个选项是`binary.BigEndian`，在计算机使用大端字节序时使用。

执行`devRandom.go`得到如下输出：

```go
$ go run devRandom.go
Seed: -2044736418491485077
$ go run devRandom.go
Seed: -517485437251490328
$ go run devRandom.go
Seed: 7702177874251412774
```
