您所做的是干净,快速的。您可以改进的是预分配切片,并使用如下
for.. range循环填充它:
s := make([]int, 5)for i := range s { s[i] = rand.Intn(100)}该
math/rand封装还具有
rand.Read()填充用随机字节切片功能。因此,如果您想
[]byte用随机数据填充一个切片,这就是所有必要的工作:
s := make([]byte, 100)rand.Read(s) // This never returns an error
另一个有趣的方法是利用
rand.Rand成为一个
io.Reader。这意味着它具有
Read()一种
[]byte用随机数据填充的方法。
结合
encoding/binary软件包,您可以用随机数据“填充”变量。创建a
rand.Rand并将其
binary.Read()作为源传递给函数,仅此而已。
它是这样的:
r := rand.New(rand.NewSource(time.Now().UnixNano()))s := make([]int32, 5)err := binary.Read(r, binary.BigEndian, &s)if err != nil { panic(err)}fmt.Println(s)输出:
[203443513 1611652563 -235795288 8294855 -802604260]
这足够“酷”,甚至可以填充结构,例如:
var point struct{ X, Y int16 }err = binary.Read(r, binary.BigEndian, &point)if err != nil { panic(err)}fmt.Printf("%+v", point)输出:
{X:-15471 Y:2619}在Go Playground上尝试这些示例。
使用的一个障碍
binary.Read()是-可以理解-
它只能填充固定大小类型的值,最著名的例外是普通
int类型,其大小不固定(取决于体系结构)。因此,您无法
[]int使用
int类型字段填充切片或结构。这就是为什么我在上面的示例中使用
int32和
int16类型。
当然,在这些解决方案中,您不能限制用于填充变量的随机数的范围。为此,初始循环仍然更容易。



