Go语言常用技巧大全

  • Post author:
  • Post category:其他

字符串处理

获取一个字符串的长度

str := "Hello 世界"
// #1 使用 utf8.RuneCountInString
fmt.Println(fmt.Sprintf("\"%s\" length is:%d", str, utf8.RuneCountInString(str)))

// #2 使用 rune切片
fmt.Println(fmt.Sprintf("\"%s\" length is:%d", str, len([]rune(str))))

// #3 使用 bytes.Count
fmt.Println(fmt.Sprintf("\"%s\" length is:%d", str, bytes.Count([]byte(str), nil) - 1))

// #3 使用 bytes.Count
fmt.Println(fmt.Sprintf("\"%s\" length is:%d", str, strings.Count(str, "") - 1))
// 判断字符串是否同(包括大小写)
fmt.Println(strings.EqualFold("Aa", "aA")) // true
fmt.Println(strings.EqualFold("-A-", "-a-")) // true

// 判断字符串是否以某个字符串开头
fmt.Println(strings.HasPrefix("Hello", "He")) // true

// 判断字符串是否以某个字符串结尾
fmt.Println(strings.HasSuffix("Hello", "lo")) // true

// 判断字符串是否包含某个字符串
fmt.Println(strings.Contains("Hello", "el")) // true

// 判断字符串是否包含某个utf8字符
fmt.Println(strings.ContainsRune("Hello 世界", '世'))

// 对比两个字符串是否有相同字符
fmt.Println(strings.ContainsAny("Hello World", "你好 世界")) // ture, 两个字符串中都有一个空格

// 统计指定字符串出现的次数
fmt.Println(strings.Count("Hello", "l")) // 2
fmt.Println(strings.Count("Hello", "天")) // 0
fmt.Println(strings.Count("Hello", "")) // 6,空白字符

// 判断参数B在参数A中首次出现的位置, 索引值从0开始,否则返回 -1
fmt.Println(strings.Index("Hello", "el")) // 1
fmt.Println(strings.Index("Hello", "天")) // -1

// 判断字符在字符串中首次出现的位置, 索引值从0开始,否则返回 -1
fmt.Println(strings.IndexByte("Hello", 'o')) // 4
fmt.Println(strings.IndexByte("Hello", 'p')) // -1

// 判断unicode字符在字符串中首次出现的位置, 索引值从0开始,否则返回 -1
fmt.Println(strings.IndexRune("Hello", 'o')) // 4
fmt.Println(strings.IndexRune("Hello 世界", '界')) // 9

// 判断参数B和参数A是否有交集,如果有 返回对应交集起始索引位置最小的,否则返回-1
fmt.Println(strings.IndexAny("Hello", "olleH")) // 0
fmt.Println(strings.IndexAny("Hello", "He----llo")) // 0
fmt.Println(strings.IndexAny("Hello", "o-l-l-e-h-H")) // 0
fmt.Println(strings.IndexAny("Hello 世界", "o-l-l-e-世")) // 1
fmt.Println(strings.IndexAny("世界 Hello", "o-l-l-e-世")) // 0
fmt.Println(strings.IndexAny("Hello", "c")) // -1

// 依次判断字符串中的字符是否满足参数B函数条件,如果满足返回当前判断字符串的索引位置,都不满足返回 -1
fmt.Println(strings.IndexFunc("Hello 世界", func(c rune) bool {
	return unicode.Is(unicode.Han, c)
})) // 6
fmt.Println(strings.IndexFunc("Hello", func(c rune) bool {
	return unicode.Is(unicode.Han, c)
})) // -1

// 判断参数B在参数A最后一次出现的位置, 否则返回-1
fmt.Println(strings.LastIndex("Hello", "Hl")) // -1
fmt.Println(strings.LastIndex("Hello", "l")) // 3

// 判断参数B和参数A的交集在参数A中最后一次出现的位置,不存在则返回-1
fmt.Println(strings.LastIndexAny("Hello", "——el--lo")) // 4
fmt.Println(strings.LastIndexAny("Hello", "——ol--he")) // 4
fmt.Println(strings.LastIndexAny("Hello 世界", "——ol--世")) // 6

// 移除判断参数A中的字符串是否满足参数B函数,返回最后一个满足条件的字符的索引位置,否则返回-1表示都不满足
fmt.Println(strings.LastIndexFunc("Hi 大家好", func(c rune) bool {
	return unicode.Is(unicode.Han, c)
})) // 9,一个汉字的索引长度是3
fmt.Println(strings.LastIndexFunc("Hello", func(c rune) bool {
	return unicode.Is(unicode.Han, c)
})) // -1

// 单词首字母大写
fmt.Println(strings.Title("hello world!")) //Hello World!
// 大写转小写
fmt.Println(strings.ToLower("HELLO")) // hello
fmt.Println(strings.ToLowerSpecial(unicode.TurkishCase, "ABC"))//abc

// 小写转大写
fmt.Println(strings.ToUpper("abc"))//ABC
fmt.Println(strings.ToUpperSpecial(unicode.TurkishCase, "abc"))//ABC
fmt.Println(strings.ToTitle("abc"))//ABC
fmt.Println(strings.ToTitleSpecial(unicode.TurkishCase, "abc"))//ABC
// 重复字符串
fmt.Println(strings.Repeat("A", 5)) // AAAAA
// 字符串替换
fmt.Println(strings.Replace("A1A2A3", "A", "B", 1)) // B1A2A3
fmt.Println(strings.ReplaceAll("A1A2A3", "A", "B")) // B1B2B3
// 移除替换满足条件的字符,如果函数返回负值表示丢弃切不替换
fmt.Println(strings.Map(func(r rune) rune {
	switch {
	case r >= 'A' && r <= 'Z':
		return 'A' + (r-'A'+13)%26
	case r >= 'a' && r <= 'z':
		return 'a' + (r-'a'+13)%26
	}
	return r
}, "ANan")) //NAna
// 去除收尾字符
fmt.Println(strings.Trim("——Hi——", "——"))// Hi
fmt.Println(strings.Trim(" Hi ", " ")) // Hi
// 去除首位空白字符
fmt.Println(strings.TrimSpace(" Hi ")) // Hi
fmt.Println(strings.TrimSpace(" \n\nHi \n\r")) // Hi
// 移除首尾满足条件的字符
fmt.Println(strings.TrimFunc("--Hello--", func(r rune) bool {
	return r == '-'
})) // Hello

// 移除首部指定字符串
fmt.Println(strings.TrimLeft("--Hi--", "-"))//Hi--
fmt.Println(strings.TrimLeftFunc("--Hi--", func(r rune) bool {
	return r == '-'
}))//Hi--
fmt.Println(strings.TrimPrefix("--Hi--","--")) //Hi--

// 移除尾部指定字符串
fmt.Println(strings.TrimRight("--Hi--", "-"))//--Hi
fmt.Println(strings.TrimRightFunc("--Hi--", func(r rune) bool {
	return r == '-'
}))//--Hi
fmt.Println(strings.TrimSuffix("--Hi--","--")) //--Hi

// 移除空白字符并切割成一个数组
fmt.Println(strings.Fields("a b c d")) // [a b c d]
fmt.Println(strings.Fields("a    b \nc d")) //[a b c d]
// 依次判断字符是否满足条件,满足条件移除当前字符并切割
fmt.Println(strings.FieldsFunc("a,1:a.2", func(r rune) bool {
	return !unicode.IsNumber(r) && !unicode.IsLetter(r)
}))
// 按指定字符串分割
fmt.Println(strings.Split("Hello", "")) //[H e l l o]
fmt.Println(strings.Split("Hello", "ll")) //[He o]
// 按指定字符串进行切割,参数C表示切割次数,0的时候返回空切片, <0 返回所有的子字符串组成的切片
fmt.Println(strings.SplitN("a,b,c", ",", 1)) // [a,b,c]
fmt.Println(strings.SplitN("a,b,c", ",", 3)) // [a b c]
fmt.Println(strings.SplitN("a,b,c", ",", 0)) // []
fmt.Println(strings.SplitN("a,b,c", ",", -1)) // [a b c]
// 指定字符串相邻处切割
fmt.Println(strings.SplitAfter("a,b,c", ",")) // [a, b, c]
// 指定字符串相邻处切割, 参数C表示切割次数,0的时候返回空切片, <0 返回所有的子字符串组成的切片
fmt.Println(strings.SplitAfter("a,b,c", ",")) // [a, b, c]

加密相关

Md5加密

str := []byte("Hello")
// md5.Sum() 生成MD5,32位
fmt.Println(fmt.Sprintf("%x", md5.Sum(str)))

// md5.New().Sum() 生成MD5,42位
fmt.Println(fmt.Sprintf("%x", md5.New().Sum(str)))

版权声明:本文为qq_21475017原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。