Go 代码使用 UTF-8 编码,字符串和字节之间的转换依据的是UTF-8编码。注意中文是3个字节对应一个中文的字符串。
下面将归类讲述负责操作字符串和字节的几个标准库
funcContains(s,substrstring)bool
完整的substr子串存在于s为truefuncContainsAny(s,charsstring)bool
chars中的任何一个字符存在于s,则为truefmt.Println(strings.ContainsAny("in failure", "s g")) //输出 true,因为' '空这个字符存在
funcContainsRune(sstring,r rune)bool
rune是Go语言里的一个字符的类型,可用来判断fmt.Println(strings.ContainsRune("你好吗", '你')) // 输出 true ,注意'你'使用单引号
funcCount(s,sepstring)int
sep在s中出现了几次。一个特殊的一个例子,可以认为five的每个字符的间隙里都有""
fmt.Println(strings.Count("five", "")) // before & after each rune
func Fields(s string) []string //按空格分割,空格的定义是 unicode.IsSpace
func FieldsFunc(s string, f func(rune) bool) []string //自定义f函数来分割
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" " "]
HasPrefix
和 HasSuffix
// 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
}
funcIndex(s,sepstring)int
在 s 中查找 sep 的第一次出现的位置索引并返回funcIndexFunc(sstring,f func(rune)bool)int
Index
的自定义版funcIndexAny(s,charsstring)int
chars中任何一个Unicode代码点在s中首次出现的位置funcIndexRune(sstring,r rune)int
Index
的字符版从后往前找
func LastIndex(s, sep string) int
func LastIndexAny(s, chars string) int
func LastIndexFunc(s string, f func(rune) bool) int
funcJoin(a[]string,sepstring)string
将字符串数组(或slice)连接起来可以funcRepeat(sstring,countint)string
fmt.Println("ba" + strings.Repeat("na", 2)) // 输出 banana
进行字符串替换时,考虑到性能问题,能不用正则尽量别用
funcReplace(s,old,newstring,nint)string
用 new 替换 s 中的 old,一共替换 n 个。如果 n < 0,则不限制替换次数,即全部替换fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2)) // 输出 oinky oinky oink
funcNewReplacer(oldnew...string)*Replacer
参数 oldnew 是 old-new 对r := strings.NewReplacer("<", "<", ">", ">") //"<"和"<"是一对,">"和">"是一对
fmt.Println(r.Replace("This is <b>HTML</b>!")) // 输出 This is <b>HTML</b>!
funcNewReader(sstring)*Reader
就可以当作一个reader对象在支持io.Reader的接口里使用,比如一个个字节的读取strings.NewReader("abcdefg")因为字符串可以表示为 []byte,因此,bytes 包定义的函数、方法等和 strings 包很类似
funcContains(b,subslice[]byte)bool
子slice subslice 在 b 中,返回 truefuncCount(s,sep[]byte)int
slice sep 在 s 中出现的次数(无重叠)func Fields(s []byte) []byte //按空格分割,空格的定义是 unicode.IsSpace
func FieldsFunc(s []byte, f func(rune) bool) []byte //自定义f函数来分割
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) }
HasPrefix
和 HasSuffix
funcIndex(s,sep[]byte)int
funcIndexFunc(s[]byte,f func(r rune)bool)int
Index
的自定义版funcIndexAny(s[]byte,charsstring)int
funcIndexRune(s[]byte,r rune)int
Index
的字符版从后往前找
func LastIndex(s, sep []byte) int
func LastIndexAny(s []byte, chars string) int
func LastIndexFunc(s []byte, f func(rune) bool) int
funcJoin(s[][]byte,sep[]byte)[]byte
将字节数组(或slice)连接起来可以funcRepeat(b[]byte,countint)[]byte
funcReplace(s,old,new[]byte,nint)[]byte
用 new 替换 s 中的 old,一共替换 n 个。如果 n < 0,则不限制替换次数,即全部替换funcNewReader(b[]byte)*Reader
由于将字符串转为其他数据类型可能会出错,strconv 中的错误处理。
funcParseInt(sstring,baseint,bitSizeint)(i int64,err error)
funcParseUint(sstring,baseint,bitSizeint)(n uint64,err error)
转为无符号整型funcAtoi(sstring)(iint,err error)
ParseInt便捷版, ParseInt(s,10,0)
funcFormatUint(i uint64,baseint)string
// 无符号整型转字符串funcFormatInt(i int64,baseint)string
// 有符号整型转字符串funcItoa(iint)string
相当于 FormatInt(i,10)
// 接受 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)
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 ")
}
func(re*Regexp)FindString(sstring)string
func(re*Regexp)FindAllString(sstring,nint)[]string
n为-1则尽可能匹配func(re*Regexp)FindStringIndex(sstring)(loc[]int)
查找到的string的slice的左边和右边,s[loc[0]:loc[1]]fmt.Printf("%v", r.FindStringIndex(s)) // Prints [7 11], the match starts at 7 and end before 11.
func(re*Regexp)FindAllStringIndex(sstring,nint)[][]int
多个loc三个概念
涉及三个库
注意:
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里面的函数就有一些字节和字符的转换。
funcValid(p[]byte)bool
funcValidRune(r rune)bool
funcValidString(sstring)bool
funcRuneLen(r rune)int
funcRuneCount(p[]byte)int
funcRuneCountInString(sstring)(nint)
funcDecodeRune(p[]byte)(r rune,sizeint)
funcEncodeRune(p[]byte,r rune)int
较少使用
1.[《Go语言标准库》The Golang Standard Library by Example]( https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter01/01.0.html)