生成MD5字符串
import (
"crypto/md5"
"fmt"
"io"
)
func main() {
str := "123456"
fmt.Print(Md5one(str))
fmt.Print("------------")
fmt.Print(Md5two(str))
}
//方法一
func Md5one(str string) (md5str string) {
data := []byte(str)
has := md5.Sum(data)
md5str = fmt.Sprintf("%x", has)
return
}
//方法二
func Md5two(str string) (md5str string) {
h := md5.New()
io.WriteString(h, str)
md5str = fmt.Sprintf("%x", h.Sum(nil))
return
}
生成UUID
方法一、自己写
package main
import (
"fmt"
"sync/atomic"
"time"
)
type UUID [16]byte
var timeBase = time.Date(1582, time.October, 15, 0, 0, 0, 0, time.UTC).Unix()
var hardwareAddr []byte
var clockSeq uint32
func TimeUUID() UUID {
return FromTime(time.Now())
}
func FromTime(aTime time.Time) UUID {
var u UUID
utcTime := aTime.In(time.UTC)
t := uint64(utcTime.Unix()-timeBase)*10000000 + uint64(utcTime.Nanosecond()/100)
u[0], u[1], u[2], u[3] = byte(t>>24), byte(t>>16), byte(t>>8), byte(t)
u[4], u[5] = byte(t>>40), byte(t>>32)
u[6], u[7] = byte(t>>56)&0x0F, byte(t>>48)
clock := atomic.AddUint32(&clockSeq, 1)
u[8] = byte(clock >> 8)
u[9] = byte(clock)
copy(u[10:], hardwareAddr)
u[6] |= 0x10 // set version to 1 (time based uuid)
u[8] &= 0x3F // clear variant
u[8] |= 0x80 // set to IETF variant
return u
}
func (u UUID) String() string {
var offsets = [...]int{0, 2, 4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 28, 30, 32, 34}
const hexString = "0123456789abcdef"
r := make([]byte, 36)
for i, b := range u {
r[offsets[i]] = hexString[b>>4]
r[offsets[i]+1] = hexString[b&0xF]
}
r[8] = '-'
r[13] = '-'
r[18] = '-'
r[23] = '-'
return string(r)
}
func main() {
out := TimeUUID()
fmt.Printf("%s\n", out.String())
}
方法二、
import (
"fmt"
"github.com/satori/go.uuid"
)
func main() {
// 创建
u1 := uuid.NewV4()
fmt.Printf("UUIDv4: %s\n", u1)
// 解析
u2, err := uuid.FromString("f5394eef-e576-4709-9e4b-a7c231bd34a4")
if err != nil {
fmt.Printf("Something gone wrong: %s", err)
return
}
fmt.Printf("Successfully parsed: %s", u2)
}
方法三、
import (
"fmt"
"github.com/snluu/uuid"
)
func main() {
var id UUID = uuid.Rand()
fmt.Println(id.Hex())
fmt.Println(id.Raw())
id1, err := uuid.FromStr("1870747d-b26c-4507-9518-1ca62bc66e5d")
id2 := uuid.MustFromStr("1870747db26c450795181ca62bc66e5d")
fmt.Println(id1 == id2)
}
方法四、
若使用的是linux系统,可以直接使用uuidgen命令来获取。
package main
import (
"fmt"
"log"
"os/exec"
)
//run in linux
func main() {
out, err := exec.Command("uuidgen").Output()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", out)
}
方法五:wuid
参考地址https://www.golangtc.com/t/5a72b4b34ce40d6b0f425ddb
说是速度很快,在这里记录一下
import "github.com/edwingeng/wuid/redis"
// Setup
g := wuid.NewWUID("default", nil)
g.LoadH24FromRedis("127.0.0.1:6379", "", "wuid")
// Generate
for i := 0; i < 10; i++ {
fmt.Println(g.Next())
}
生成GUID
//生成Guid字串
func GetGuid() string {
b := make([]byte, 48)
if _, err := io.ReadFull(rand.Reader, b); err != nil {
return ""
}
return GetMd5String(base64.URLEncoding.EncodeToString(b))
}
生成随机字符串
//生成随机数
func RandNumberString(n int) string {
letters := []rune("0123456789")
b := make([]rune, n)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := range b {
b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}
//生成随机字符串
func GetRandomString(lenth int) string{
str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
bytes := []byte(str)
result := []byte{}
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := 0; i < lenth; i++ {
result = append(result, bytes[r.Intn(len(bytes))])
}
return string(result)
}
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
const (
letterIdxBits = 6 // 6 bits to represent a letter index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
)
//生成随机字符串
func RandString(n int) string {
src := rand.NewSource(time.Now().UnixNano())
b := make([]byte, n)
// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
b[i] = letterBytes[idx]
i--
}
cache >>= letterIdxBits
remain--
}
return string(b)
}
// 生成一个区间范围的随机数
func GenerateRangeNum(min, max int) int {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
randNum := r.Intn(max - min)
randNum = randNum + min
return randNum
}
strings包
判断两个字符串是否相等
strings.EqualFold(str1, str2)//判断两个字符串是否相等
判断字符串url中是否包含字符串
strings.Contains(url, "http://")//判断字符串url中是否包含字符串http://
判断字符串中是否包含字符a(rune('a')为字符的阿斯克码值)
strings.ContainsRune("widuua", rune('a'))//判断字符串中是否包含字符a(rune('a')为字符的阿斯克码值)
判断字符串str中是否包含字符w(多个只要有一个符合就返回true)
strings.ContainsAny(str, "W")//判断字符串str中是否包含字符w(多个只要有一个符合就返回true)
在一段字符串中有多少匹配到的字符或字符串
strings.Count("widuu", "uu")//在一段字符串中有多少匹配到的字符或字符串
//判断字符串str是否以He开头
strings.HasPrefix(str, "He")//判断字符串str是否以He开头
判断字符串str是否以He结尾
strings.LastIndexAny("widuu", "He")//判断字符串str是否以He结尾
判断字符或者字符串s第一次在字符串中的位置
Index(s, sep string) //判断字符或者字符串s第一次在字符串中的位置
字符串第一次出现的位置,如果不存在就返回-1
strings.IndexAny("widuu", "u")//字符串第一次出现的位置,如果不存在就返回-1
判断字符x第一次在字符串中的位置
strings.IndexByte("hello xiaowei", 'x')//判断字符x第一次在字符串中的位置
判断字符或字符串最后一次出现的位置
strings.LastIndex("widuu", "uu")//判断字符或字符串最后一次出现的位置
将字符串按空格分割成数组
strings.Fields(str)//将字符串按空格分割成数组
把切片转换成字符串。
str1 := strings.Join(s," ") //把切片转换成字符串。
利用string的修改操作,对str操作,用新字符串替代旧字符串。
strings.Replace(str,oldstr,newstr,n)
//用新字符串替代旧字符串,n为替换的个数,n:=strings.Count(json, "\\u0026")可获取。
使用特定规则对字符串进行替换操作
var replacer = strings.NewReplacer(
"&", "&",
"<", "<",
">", ">",
// """ is shorter than """.
`"`, """,
// "'" is shorter than "'" and apos was not in HTML until HTML5.
"'", "'",
)
str:=replacer.Replace("<>&\"'")
fmt.Println(str)
截取字符串
在对字符串处理的时候,突然发现字符串打印出来的长度要不自己读出来的长,这个长度其实就是字符串的字节长度,如果其中有汉字,截取起来就非常的麻烦,找到一个方法记录一下
s := "a我cd"
s = string([]rune(s)[:3])
fmt.Println(s) //得到 "a我c"
strconv包
string转换为“双引号”引起来的字符串
// Quote 将字符串 s 转换为“双引号”引起来的字符串
// 其中的特殊字符将被转换为“转义字符”
// “不可显示的字符”将被转换为“转义字符”
func Quote(s string) string
func main() {
fmt.Println(strconv.Quote(`C:\Windows`))
// "C:\\Windows"
}
string转换为“双引号”引起来的字符串,并将结果追加到 dst 的尾部
// AppendQuote 将字符串 s 转换为“双引号”引起来的字符串,
// 并将结果追加到 dst 的尾部,返回追加后的 []byte
// 其中的特殊字符将被转换为“转义字符”
func AppendQuote(dst []byte, s string) []byte
func main() {
s := `C:\Windows`
b := make([]byte, 0)
b = strconv.AppendQuote(b, s)
fmt.Printf("%s", b) // "C:\\Windows"
}
将字符串 s 转换为“双引号”引起来的 ASCII 字符串
// QuoteToASCII 将字符串 s 转换为“双引号”引起来的 ASCII 字符串
// “非 ASCII 字符”和“特殊字符”将被转换为“转义字符”
func QuoteToASCII(s string) string
func main() {
fmt.Println(strconv.QuoteToASCII("Hello 世界!"))
// "Hello \u4e16\u754c\uff01"
}
将字符串 s 转换为“双引号”引起来的 ASCII 字符串,并将结果追加到 dst 的尾部
// AppendQuoteToASCII 将字符串 s 转换为“双引号”引起来的 ASCII 字符串,
// 并将结果追加到 dst 的尾部,返回追加后的 []byte
// “非 ASCII 字符”和“特殊字符”将被转换为“转义字符”
func AppendQuoteToASCII(dst []byte, s string) []byte
func main() {
s := "Hello 世界!"
b := make([]byte, 0)
b = strconv.AppendQuoteToASCII(b, s)
fmt.Printf("%s", b) // "Hello \u4e16\u754c\uff01"
}
将 Unicode 字符转换为“单引号”引起来的字符串
// QuoteRune 将 Unicode 字符转换为“单引号”引起来的字符串
// “特殊字符”将被转换为“转义字符”
func QuoteRune(r rune) string
func main() {
fmt.Println(strconv.QuoteRune('好'))
// '好'
}
将 Unicode 字符转换为“单引号”引起来的字符串,并将结果追加到 dst 的尾部
// AppendQuoteRune 将 Unicode 字符转换为“单引号”引起来的字符串,
// 并将结果追加到 dst 的尾部,返回追加后的 []byte
// “特殊字符”将被转换为“转义字符”
func AppendQuoteRune(dst []byte, r rune) []byte
func main() {
b := make([]byte, 0)
b = strconv.AppendQuoteRune(b, '好')
fmt.Printf("%s", b) // '好'
}
将 Unicode 字符转换为“单引号”引起来的 ASCII 字符串
// QuoteRuneToASCII 将 Unicode 字符转换为“单引号”引起来的 ASCII 字符串
// “非 ASCII 字符”和“特殊字符”将被转换为“转义字符”
func QuoteRuneToASCII(r rune) string
func main() {
fmt.Println(strconv.QuoteRuneToASCII('好'))
// '\u597d'
}
将 Unicode 字符转换为“单引号”引起来的 ASCII 字符串,并将结果追加到 dst 的尾部
// AppendQuoteRune 将 Unicode 字符转换为“单引号”引起来的 ASCII 字符串,
// 并将结果追加到 dst 的尾部,返回追加后的 []byte
// “非 ASCII 字符”和“特殊字符”将被转换为“转义字符”
func AppendQuoteRuneToASCII(dst []byte, r rune) []byte
func main() {
b := make([]byte, 0)
b = strconv.AppendQuoteRuneToASCII(b, '好')
fmt.Printf("%s", b) // '\u597d'
}
判断字符串 s 是否可以表示为一个单行的“反引号”字符串
// CanBackquote 判断字符串 s 是否可以表示为一个单行的“反引号”字符串
// 字符串中不能含有控制字符(除了 \t)和“反引号”字符,否则返回 false
func CanBackquote(s string) bool
func main() {
b := strconv.CanBackquote("C:\\Windows\n")
fmt.Println(b) // false
b = strconv.CanBackquote("C:\\Windows\r")
fmt.Println(b) // false
b = strconv.CanBackquote("C:\\Windows\f")
fmt.Println(b) // false
b = strconv.CanBackquote("C:\\Windows\t")
fmt.Println(b) // true
b = strconv.CanBackquote("C:\\`Windows`")
fmt.Println(b) // false
}
将 s 中的第一个字符“取消转义”并解码
// UnquoteChar 将 s 中的第一个字符“取消转义”并解码
//
// s:转义后的字符串
// quote:字符串使用的“引号符”(用于对引号符“取消转义”)
//
// value: 解码后的字符
// multibyte:value 是否为多字节字符
// tail: 字符串 s 除去 value 后的剩余部分
// error: 返回 s 中是否存在语法错误
//
// 参数 quote 为“引号符”
// 如果设置为单引号,则 s 中允许出现 ' 字符,不允许出现单独的 ' 字符
// 如果设置为双引号,则 s 中允许出现 " 字符,不允许出现单独的 " 字符
// 如果设置为 0,则不允许出现 ' 或 " 字符,可以出现单独的 ' 或 " 字符
func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)
func main() {
s := `\"大\\家\\好!\"`
c, mb, sr, _ := strconv.UnquoteChar(s, '"')
fmt.Printf("%-3c %v\n", c, mb)
for ; len(sr) > 0; c, mb, sr, _ = strconv.UnquoteChar(sr, '"') {
fmt.Printf("%-3c %v\n", c, mb)
}
// " false
// 大 true
// \ false
// 家 true
// \ false
// 好 true
// ! true
}
将“带引号的字符串” s 转换为常规的字符串(不带引号和转义字符)
// Unquote 将“带引号的字符串” s 转换为常规的字符串(不带引号和转义字符)
// s 可以是“单引号”、“双引号”或“反引号”引起来的字符串(包括引号本身)
// 如果 s 是单引号引起来的字符串,则返回该该字符串代表的字符
func Unquote(s string) (t string, err error)
func main() {
sr, err := strconv.Unquote(`"\"大\t家\t好!\""`)
fmt.Println(sr, err)
sr, err = strconv.Unquote(`'大家好!'`)
fmt.Println(sr, err)
sr, err = strconv.Unquote(`'好'`)
fmt.Println(sr, err)
sr, err = strconv.Unquote("`大\\t家\\t好!`")
fmt.Println(sr, err)
}
IsPrint 判断 Unicode 字符 r 是否是一个可显示的字符
// IsPrint 判断 Unicode 字符 r 是否是一个可显示的字符
// 可否显示并不是你想象的那样,比如空格可以显示,而\t则不能显示
// 具体可以参考 Go 语言的源码
func IsPrint(r rune) bool
func main() {
fmt.Println(strconv.IsPrint('a')) // true
fmt.Println(strconv.IsPrint('好')) // true
fmt.Println(strconv.IsPrint(' ')) // true
fmt.Println(strconv.IsPrint('\t')) // false
fmt.Println(strconv.IsPrint('\n')) // false
fmt.Println(strconv.IsPrint(0)) // false
}
字符串数组排序
aa := []string{"ab", "aw", "ap", "aa"}
sort.Strings(aa)
fmt.Println(aa)