package rand import ( "fmt" crand "crypto/rand" "math/big" ) var chars []byte = []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()_+-=[]{}\\|;:'\",./<>?") var letters []byte = chars[0:52] var digits []byte = chars[52:62] var symbols []byte = chars[62:94] func gen(s []byte) (byte,error) { nBig, err := crand.Int(crand.Reader, big.NewInt(int64(len(s)))) if err != nil { return 0, fmt.Errorf("Error in crypto/rand: %s",err) } x := nBig.Int64() return s[x], nil } func Letter() (byte,error) { return gen(letters) } func Digit() (byte,error) { return gen(digits) } func Symbol() (byte,error) { return gen(symbols) } func Char() (byte,error) { return gen(chars) } func Slice(f func() (byte,error), n int) ([]byte,error) { ret := make([]byte,0) for i := 0; i < n; i++ { x,err := f() if err != nil { return ret, err } ret = append(ret,x) } return ret, nil }