或者我必须使用简单的方法,例如:
var arr []int for i := 0; i < 5; i++ { arr = append(arr, rand.Intn(100)) }
您所做的是干净,快速的。您可以改进的是预分配切片,并使用如下for.. range循环填充它:
for.. range
s := make([]int, 5) for i := range s { s[i] = rand.Intn(100) }
该math/rand封装还具有rand.Read()填充用随机字节切片功能。因此,如果您想[]byte用随机数据填充一个切片,这就是所有必要的工作:
math/rand
rand.Read()
[]byte
s := make([]byte, 100) rand.Read(s) // This never returns an error
另一个有趣的方法是利用rand.Rand成为一个io.Reader。这意味着它具有Read()一种[]byte用随机数据填充的方法。
rand.Rand
io.Reader
Read()
结合encoding/binary软件包,您可以用随机数据“填充”变量。创建a rand.Rand并将其binary.Read()作为源传递给函数,仅此而已。
encoding/binary
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类型。
int
[]int
int32
int16
当然,在这些解决方案中,您不能限制用于填充变量的随机数的范围。为此,初始循环仍然更容易。