golang 随机字符串

package main

import (
    "bytes"
    r "crypto/rand"
    "fmt"
    "math/rand"
    "strconv"
    "strings"
    "testing"
    "time"
)

/**
*生成随机字符
**/
func RandString(length int) string {
    rand.Seed(time.Now().UnixNano())
    rs := make([]string, length)
    for start := 0; start < length; start++ {
        t := rand.Intn(3)
        if t == 0 {
            rs = append(rs, strconv.Itoa(rand.Intn(10)))
        } else if t == 1 {
            rs = append(rs, string(rand.Intn(26)+65))
        } else {
            rs = append(rs, string(rand.Intn(26)+97))
        }
    }
    return strings.Join(rs, "")
}

func Rs2(length int) []byte {
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    buffer := bytes.NewBufferString("")
    for i := 0; i < length; i++ {
        isLetter := r.Intn(2)
        if isLetter > 0 {
            letter := r.Intn(52)
            if letter < 26 {
                letter += 97
            } else {
                letter += 65 - 26
            }
            buffer.WriteString(string(letter))
            //buffer.WriteString(fmt.Sprintf("%c", letter))
        } else {
            buffer.WriteString(strconv.Itoa(r.Intn(10)))
        }
    }
    return buffer.Bytes()
}

func RandomCreateBytes(n int, alphabets ...byte) []byte {
    const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    var bytes = make([]byte, n)
    var randby bool
    if num, err := r.Read(bytes); num != n || err != nil {
        rand.Seed(time.Now().UnixNano())
        randby = true
    }
    for i, b := range bytes {
        if len(alphabets) == 0 {
            if randby {
                bytes[i] = alphanum[rand.Intn(len(alphanum))]
            } else {
                bytes[i] = alphanum[b%byte(len(alphanum))]
            }
        } else {
            if randby {
                bytes[i] = alphabets[rand.Intn(len(alphabets))]
            } else {
                bytes[i] = alphabets[b%byte(len(alphabets))]
            }
        }
    }
    return bytes
}

func Test_Randstring(t *testing.T) {
    fmt.Println(string(Rs2(10)))
    st1 := time.Now().UnixNano()
    for i := 0; i < 1000; i++ {
        Rs2(10)
    }
    et1 := time.Now().UnixNano()
    st2 := time.Now().UnixNano()
    var k []byte
    for i := 0; i < 1000; i++ {
        k = RandomCreateBytes(10)
    }
    et2 := time.Now().UnixNano()

    st := time.Now().UnixNano()
    s := ""
    for i := 0; i < 1000; i++ {
        s = RandString(10)
    }
    et := time.Now().UnixNano()

    fmt.Println(string(s), string(k), st, et, et1-st1, et2-st2, et-st)
}