golang字符串的一般操作

生成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(
        "&", "&amp;",
        "<", "&lt;",
        ">", "&gt;",
        // "&#34;" is shorter than "&quot;".
        `"`, "&#34;",
        // "&#39;" is shorter than "&apos;" and apos was not in HTML until HTML5.
        "'", "&#39;",
    )
    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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容