如何从golang中的数组中提取字符?

时间:2017-08-21 07:49:56

标签: arrays go

需要从字符串

中提取随机字符

这是我得到的:

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  b := make([]byte, 1)
for i := range b {
    b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
fmt.Println(string(b))

但它总是返回" X" 但是,我需要每次使用rand函数返回新角色。 任何帮助将非常感激。 感谢。

2 个答案:

答案 0 :(得分:2)

首先播种伪随机数生成器。例如,

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    b := make([]byte, 7)
    for i := range b {
        b[i] = letterBytes[rand.Intn(len(letterBytes))]
    }
    fmt.Println(string(b))
}

输出:

jfXtySC
  

The Go Playground

     

关于游乐场

     

在操场上,时间从2009-11-10 23:00:00 UTC开始   (确定这个日期的重要性是一个练习   读者)。这样可以更轻松地通过提供程序来缓存程序   确定性输出。

因此,在Go游乐场中,time.Now().UnixNano()始终返回相同的值。对于随机种子值,请在您的计算机上运行代码。

对于任何Unicode代码点(Go rune),

package main

import (
    "fmt"
    "math/rand"
    "time"
)

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    chars := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ世界!@=")
    r := make([]rune, 50)
    for i := range r {
        r[i] = chars[rand.Intn(len(chars))]
    }
    fmt.Println(string(r))
}

输出:

世QRYSp=@giJMIKly=tXRefjtVkeE!yHhTSQHvLyUYdRNIBbILW

答案 1 :(得分:0)

你可能不需要cryto / rand。只需将种子设置为每次不同的东西。 math / rand包具有相同的种子确定性,因此您每次只需要更改种子。假设这不是超级安全,只需添加此行。

rand.Seed(time.Now().Unix())

另请注意,如果您使用play.golang.org测试它不会起作用,因为时间pkg在那里不起作用。它在其他任何地方都可以正常工作。

如果您确实想要随机选择字符,请使用crypto / rand。不是自制版本 - 如果您需要在给定字符范围内进行编码,则可以对其进行编码。最后,不要滚动你自己的加密,以防你在这里做的事情。