我的专题区块链研习社

区块链开发之Go语言—字符串和字节

2018-03-23  本文已影响27人  林檎果

字符串与字节的关系

Go 代码使用 UTF-8 编码,字符串和字节之间的转换依据的是UTF-8编码。注意中文是3个字节对应一个中文的字符串。

下面将归类讲述负责操作字符串和字节的几个标准库

strings — 字符串操作

是否存在某个字符或子串

fmt.Println(strings.ContainsAny("in failure", "s g")) //输出  true,因为' '空这个字符存在
fmt.Println(strings.ContainsRune("你好吗", '你')) // 输出 true ,注意'你'使用单引号

子串出现次数(字符串匹配)

一个特殊的一个例子,可以认为five的每个字符的间隙里都有""

fmt.Println(strings.Count("five", "")) // before & after each rune

字符串分割为[]string

Fields 和 FieldsFunc

func Fields(s string) []string //按空格分割,空格的定义是 unicode.IsSpace
func FieldsFunc(s string, f func(rune) bool) []string //自定义f函数来分割

Split 和 SplitAfter、 SplitN 和 SplitAfterN

func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }
func SplitAfter(s, sep string) []string { return genSplit(s, sep, len(sep), -1) }
func SplitN(s, sep string, n int) []string { return genSplit(s, sep, 0, n) }
func SplitAfterN(s, sep string, n int) []string { return genSplit(s, sep, len(sep), n) }
fmt.Printf("%q\n", strings.Split("foo,bar,baz", ","))// 输出  ["foo" "bar" "baz"]
fmt.Printf("%q\n", strings.SplitAfter("foo,bar,baz", ","))// 输出 ["foo," "bar," "baz"]
fmt.Printf("%q\n", strings.Split(" xyz ", "")) // 输出  [" " "x" "y" "z" " "]

字符串是否有某个前缀或后缀

HasPrefixHasSuffix

// s 中是否以 prefix 开始
func HasPrefix(s, prefix string) bool {
    return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
}
// s 中是否以 suffix 结尾
func HasSuffix(s, suffix string) bool {
    return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
}

字符或子串在字符串中出现的位置

从后往前找

func LastIndex(s, sep string) int
func LastIndexAny(s, chars string) int
func LastIndexFunc(s string, f func(rune) bool) int

字符串合并的操作

字符串重复几次

fmt.Println("ba" + strings.Repeat("na", 2)) // 输出 banana

字符串子串替换

进行字符串替换时,考虑到性能问题,能不用正则尽量别用

fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2)) // 输出 oinky oinky oink

Replacer 类型

r := strings.NewReplacer("<", "&lt;", ">", "&gt;") //"<"和"&lt;"是一对,">"和"&gt;"是一对
fmt.Println(r.Replace("This is <b>HTML</b>!")) // 输出 This is &lt;b&gt;HTML&lt;/b&gt;!

Reader 类型

bytes — byte slice 便利操作

因为字符串可以表示为 []byte,因此,bytes 包定义的函数、方法等和 strings 包很类似

是否存在某个子slice

[]byte 出现次数

字节数组分割为[]byte

Fields 和 FieldsFunc

func Fields(s []byte) []byte //按空格分割,空格的定义是 unicode.IsSpace
func FieldsFunc(s []byte, f func(rune) bool) []byte //自定义f函数来分割

Split 和 SplitAfter、 SplitN 和 SplitAfterN

func Split(s, sep []byte) []byte { return genSplit(s, sep, 0, -1) }
func SplitAfter(s, sep []byte) []byte { return genSplit(s, sep, len(sep), -1) }
func SplitN(s, sep []byte, n int) []byte { return genSplit(s, sep, 0, n) }
func SplitAfterN(s, sep []byte, n int) []byte { return genSplit(s, sep, len(sep), n) }

字节数组是否有某个前缀或后缀

HasPrefixHasSuffix

字节数组或子字节数组在字节数组中出现的位置

从后往前找

func LastIndex(s, sep []byte) int
func LastIndexAny(s []byte, chars string) int
func LastIndexFunc(s []byte, f func(rune) bool) int

字节数组合并的操作

字节数组重复几次

字节数组子串替换

Reader 类型

strconv — 字符串和基本数据类型之间转换

strconv 包转换错误处理

由于将字符串转为其他数据类型可能会出错,strconv 中的错误处理。

字符串和整型之间的转换

整型转为字符串

字符串和布尔值之间的转换

// 接受 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False 等字符串;
// 其他形式的字符串会返回错误
func ParseBool(str string) (value bool, err error)
// 直接返回 "true" 或 "false"
func FormatBool(b bool) string
// 将 "true" 或 "false" append 到 dst 中
// 这里用了一个 append 函数对于字符串的特殊形式:append(dst, "true"...)
func AppendBool(dst []byte, b bool)

字符串和浮点数之间的转换

func ParseFloat(s string, bitSize int) (f float64, err error)
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func AppendFloat(dst []byte, f float64, fmt byte, prec int, bitSize int)

regexp — 正则表达式

基本用法

    r, err := regexp.Compile(`Hello`)

    if err != nil {
        fmt.Printf("There is a problem with your regexp.\n")
        return
    }

    // Will print 'Match'
    if r.MatchString("Hello Regular Expression.") == true {
        fmt.Printf("Match ")
    } else {
        fmt.Printf("No match ")
    }

Compile和MustCompile

CompilePOSIX 和 MustCompilePOSIX

FindString和FindAllString

fmt.Printf("%v", r.FindStringIndex(s)) // Prints [7 11], the match starts at 7 and end before 11.

unicode — Unicode码点、UTF-8/16编码

三个概念

涉及三个库

注意:

unicode包

unicode包含了对rune的判断。

func IsControl(r rune) bool  // 是否控制字符
func IsDigit(r rune) bool  // 是否阿拉伯数字字符,即1-9
func IsGraphic(r rune) bool // 是否图形字符
func IsLetter(r rune) bool // 是否字母
func IsLower(r rune) bool // 是否小写字符
func IsMark(r rune) bool // 是否符号字符
func IsNumber(r rune) bool // 是否数字字符,比如罗马数字Ⅷ也是数字字符
func IsOneOf(ranges []*RangeTable, r rune) bool // 是否是RangeTable中的一个
func IsPrint(r rune) bool // 是否可打印字符
func IsPunct(r rune) bool // 是否标点符号
func IsSpace(r rune) bool // 是否空格
func IsSymbol(r rune) bool // 是否符号字符
func IsTitle(r rune) bool // 是否title case
func IsUpper(r rune) bool // 是否大写字符

utf8包

utf8里面的函数就有一些字节和字符的转换。

判断是否符合utf8编码的函数

判断rune的长度的函数

判断字节串或者字符串的rune数

编码和解码rune到byte

utf16包

较少使用

参考

1.《Go语言标准库》The Golang Standard Library by Example

关于我:

linxinzhe,全栈工程师,目前供职于某500强通信企业,人工智能,区块链爱好者。

GitHub:https://github.com/linxinzhe

欢迎留言讨论,也欢迎关注我~
我也会关注你的哦!

上一篇下一篇

猜你喜欢

热点阅读