Go中strings的常用方法详解
string操作在编程中具有极高的频率,那么string中有哪些有用的方法呢?
使用strings直接操作
Compare
- funcCompare(a,bstring)int
按照字典序比较两个字符串,通常情况下直接使用=,>,<会更快一些。
Contains,ContainsAny和ContainsRune
- funcContains(s,substrstring)bool
- funcContainsAny(s,charsstring)bool
- funcContainsRune(sstring,rrune)bool
字符串s中是否包含substr,返回true或者false。
fmt.Println(strings.Contains("seafood","foo"))//true
fmt.Println(strings.Contains("seafood","bar"))//false
fmt.Println(strings.Contains("seafood",""))//true
fmt.Println(strings.Contains("",""))//true
ContainsAny用于判断子串中是否具有一个字符在源串s中。子串为空,返回false。
fmt.Println(strings.ContainsAny("team","i"))//false
fmt.Println(strings.ContainsAny("fail","ui"))//true
fmt.Println(strings.ContainsAny("ure","ui"))//true
fmt.Println(strings.ContainsAny("failure","ui"))//true
fmt.Println(strings.ContainsAny("foo",""))//false
fmt.Println(strings.ContainsAny("",""))//false
ContainsRune用于判断Ascall码代表的字符是否在源串s中。
//FindswhetherastringcontainsaparticularUnicodecodepoint.
//Thecodepointforthelowercaseletter"a",forexample,is97.
fmt.Println(strings.ContainsRune("aardvark",97))
fmt.Println(strings.ContainsRune("timeout",97))
Count
- funcCount(s,substrstring)int
判断子串在源串中的数量,如果子串为空,则长度为源串的长度+1。
fmt.Println(strings.Count("cheese","e"))//3
fmt.Println(strings.Count("five",""))//before&aftereachrune5=4+1
EqualFold
- funcEqualFold(s,tstring)bool
在不区分大小写的情况下,判断两个字符串是否相同。
Fields
- funcFields(sstring)[]string
- funcFieldsFunc(sstring,ffunc(rune)bool)[]string
Fields:使用空白分割字符串。
FieldsFunc:根据传入的函数分割字符串,如果当前参数c不是数字或者字母,返回true作为分割符号。
fmt.Printf("Fieldsare:%q",strings.Fields("foobarbaz"))//["foo""bar""baz"]
f:=func(crune)bool{
return!unicode.IsLetter(c)&&!unicode.IsNumber(c)
}
fmt.Printf("Fieldsare:%q",strings.FieldsFunc("foo1;bar2,baz3...",f))//["foo1""bar2""baz3"]
HasPrefix和HasSuffix
- funcHasPrefix(s,prefixstring)bool
- funcHasSuffix(s,suffixstring)bool
判断字符串是否是以某个子串作为开头或者结尾。
fmt.Println(strings.HasPrefix("Gopher","Go"))//true
fmt.Println(strings.HasPrefix("Gopher","C"))//false
fmt.Println(strings.HasPrefix("Gopher",""))//true
fmt.Println(strings.HasSuffix("Amigo","go"))//true
fmt.Println(strings.HasSuffix("Amigo","O"))//false
fmt.Println(strings.HasSuffix("Amigo","Ami"))//false
fmt.Println(strings.HasSuffix("Amigo",""))//true
Join
- funcJoin(elems[]string,sepstring)string
使用某个sep,连接字符串。
s:=[]string{"foo","bar","baz"}
fmt.Println(strings.Join(s,","))//foo,bar,baz
Index,IndexAny,IndexByte,IndexFunc,IndexRune
- funcIndex(s,substrstring)int
- funcIndexAny(s,charsstring)int
- funcIndexByte(sstring,cbyte)int
- funcIndexFunc(sstring,ffunc(rune)bool)int
- funcIndexRune(sstring,rrune)int
Index,IndexAny,IndexByte,IndexFunc,IndexRune都是返回满足条件的第一个位置,如果没有满足条件的数据,返回-1。
fmt.Println(strings.Index("chicken","ken"))//4
fmt.Println(strings.Index("chicken","dmr"))//-1
//子串中的任意字符在源串出现的位置
fmt.Println(strings.IndexAny("chicken","aeiouy"))//2
fmt.Println(strings.IndexAny("crwth","aeiouy"))//-1
//IndexByte,字符在字符串中出现的位置
fmt.Println(strings.IndexByte("golang",'g'))//0
fmt.Println(strings.IndexByte("gophers",'h'))//3
fmt.Println(strings.IndexByte("golang",'x'))//-1
//IndexFunc满足条件的作为筛选条件
f:=func(crune)bool{
returnunicode.Is(unicode.Han,c)
}
fmt.Println(strings.IndexFunc("Hello,世界",f))//7
fmt.Println(strings.IndexFunc("Hello,world",f))//-1
//某个字符在源串中的位置
fmt.Println(strings.IndexRune("chicken",'k'))//4
fmt.Println(strings.IndexRune("chicken",'d'))//-1
LastIndex,LastIndexAny,LastIndexByte和LastIndexFunc
- funcLastIndex(s,substrstring)int
- funcLastIndexAny(s,charsstring)int
- funcLastIndexByte(sstring,cbyte)int
- funcLastIndexFunc(sstring,ffunc(rune)bool)int
LastIndex,LastIndexAny,LastIndexByte,LastIndexFunc和Index,IndexAny,IndexByte,IndexFunc,IndexRune用法保持一致,从右往前计数。
Map
- funcMap(mappingfunc(rune)rune,sstring)string
对字符串s中每一个字符执行map函数中的操作。
rot13:=func(rrune)rune{//r是遍历的每一个字符
switch{
caser>='A'&&r<='Z':
return'A'+(r-'A'+13)%26
caser>='a'&&r<='z':
return'a'+(r-'a'+13)%26
}
returnr
}
fmt.Println(strings.Map(rot13,"'Twasbrilligandtheslithygopher..."))
Repeat
- funcRepeat(sstring,countint)string
重复一下s,count是重复的次数,不能传负数。
fmt.Println("ba"+strings.Repeat("na",2))
Replace和ReplaceAll
- funcReplace(s,old,newstring,nint)string
- funcReplaceAll(s,old,newstring)string
使用new来替换old,替换的次数为n。如果n为负数,则替换所有的满足条件的子串。
fmt.Println(strings.Replace("oinkoinkoink","k","ky",2))//oinkyoinkkyoink
fmt.Println(strings.Replace("oinkoinkoink","oink","moo",-1))moomoomoo
ReplaceAll使用new替换所有的old,相当于使用Replace时n<0。
Split,SplitN,SplitAfter和SplitAfterN
- funcSplit(s,sepstring)[]string
- funcSplitAfter(s,sepstring)[]string
- funcSplitAfterN(s,sepstring,nint)[]string
- funcSplitN(s,sepstring,nint)[]string
fmt.Printf("%q\n",strings.Split("a,b,c",","))//["a","b","c"]
fmt.Printf("%q\n",strings.Split("amanaplanacanalpanama","a"))//["""man""plan""canalpanama"]
fmt.Printf("%q\n",strings.Split("xyz",""))//["""x""y""z"""]
fmt.Printf("%q\n",strings.Split("","BernardoO'Higgins"))//[""]
//SplitN定义返回之后的切片中包含的长度,最后一部分是未被处理的。
fmt.Printf("%q\n",strings.SplitN("a,b,c",",",2))//["a","b,c"]
z:=strings.SplitN("a,b,c",",",0)
fmt.Printf("%q(nil=%v)\n",z,z==nil)//[](nil=true)
//使用sep分割,分割出来的字符串中包含sep,可以限定分割之后返回的长度。
fmt.Printf("%q\n",strings.SplitAfterN("a,b,c",",",2))//["a,","b,c"]
//完全分割
fmt.Printf("%q\n",strings.SplitAfter("a,b,c",","))//["a,","b,","c"]
对于SplitN和SplitAfterN的第二个n说明。
n>0:atmostnsubstrings;thelastsubstringwillbetheunsplitremainder. n==0:theresultisnil(zerosubstrings) n<0:allsubstrings
Trim,TrimFunc,TrimLeft,TrimLeftFunc,TrimPrefix,TrimSuffix,TrimRight,TrimRightFunc
- funcTrim(sstring,cutsetstring)string
- funcTrimFunc(sstring,ffunc(rune)bool)string
- funcTrimLeft(sstring,cutsetstring)string
- funcTrimLeftFunc(sstring,ffunc(rune)bool)string
- funcTrimPrefix(s,prefixstring)string
- funcTrimSuffix(s,suffixstring)string
- funcTrimRight(sstring,cutsetstring)string
- funcTrimRightFunc(sstring,ffunc(rune)bool)string
//Trim包含在cutset中的元素都会被去掉
fmt.Print(strings.Trim("¡¡¡Hello,Gophers!!!","!¡"))//Hello,Gophers
//TrimFunc去掉满足条件的字符
fmt.Print(strings.TrimFunc("¡¡¡Hello,Gophers!!!",func(rrune)bool{
return!unicode.IsLetter(r)&&!unicode.IsNumber(r)
}))
//TrimLeft去掉左边满足包含在cutset中的元素,直到遇到不在cutset中的元素为止
fmt.Print(strings.TrimLeft("¡¡¡Hello,Gophers!!!","!¡"))//Hello,Gophers!!!
//TrimLeftFunc去掉左边属于函数返回值部分,直到遇到不在cutset中的元素为止
fmt.Print(strings.TrimLeftFunc("¡¡¡Hello,Gophers!!!",func(rrune)bool{
return!unicode.IsLetter(r)&&!unicode.IsNumber(r)
}))//Hello,Gophers!!!
//TrimPrefix去掉开头部分;TrimSuffix去掉结尾部分
vars="¡¡¡Hello,Gophers!!!"
s=strings.TrimPrefix(s,"¡¡¡Hello,")
s=strings.TrimPrefix(s,"¡¡¡Howdy,")
fmt.Print(s)
TrimRight,TrimRightFunc和TrimLeft,TrimLeftFunc功能保持一直,无需赘述。
使用strings.Builder操作
ABuilderisusedtoefficientlybuildastringusingWritemethods.Itminimizesmemorycopying.Thezerovalueisreadytouse.Donotcopyanon-zeroBuilder.
strings.Builder使用Write方法来高效的构建字符串。它最小化了内存拷贝,耗费零内存,不要拷贝非零的Builder。
varbstrings.Builder
fori:=3;i>=1;i--{
fmt.Fprintf(&b,"%d...",i)
}
b.WriteString("ignition")
fmt.Println(b.String())
输出结果:
3...2...1...ignition
strings.Builder作为字符串拼接的利器,建议加大使用力度。 func(b*Builder)Cap()int//容量,涉及批量内存分配机制 func(b*Builder)Grow(nint)//手动分配内存数量 func(b*Builder)Len()int//当前builder中含有的所有字符长度 func(b*Builder)Reset()//清空builder func(b*Builder)String()string//转化为字符串输出 func(b*Builder)Write(p[]byte)(int,error)//往builder写入数据 func(b*Builder)WriteByte(cbyte)error//往builder写入数据 func(b*Builder)WriteRune(rrune)(int,error)//往builder写入数据 func(b*Builder)WriteString(sstring)(int,error)//往builder写入数据
使用strings.Reader
typeReaderstruct{
sstring//对应的字符串
iint64//当前读取到的位置
prevRuneint
}
AReaderimplementstheio.Reader,io.ReaderAt,io.Seeker,io.WriterTo,io.ByteScanner,andio.RuneScannerinterfacesbyreadingfromastring.ThezerovalueforReaderoperateslikeaReaderofanemptystring.
Reader通过读取字符串的方式,实现了接口io.Reader,io.ReaderAt,io.Seeker,io.WriterTo,io.ByteScanner和io.RuneScanner。零值Reader操作起来就像操作空字符串的io.Reader一样。
funcNewReader(sstring)*Reader//初始化reader实例 func(r*Reader)Len()int//未读字符长度 func(r*Reader)Read(b[]byte)(nint,errerror) func(r*Reader)ReadAt(b[]byte,offint64)(nint,errerror) func(r*Reader)ReadByte()(byte,error) func(r*Reader)ReadRune()(chrune,sizeint,errerror) func(r*Reader)Reset(sstring)//重置以从s中读 func(r*Reader)Seek(offsetint64,whenceint)(int64,error)//Seekimplementstheio.Seekerinterface. func(r*Reader)Size()int64//字符串的原始长度 func(r*Reader)UnreadByte()error func(r*Reader)UnreadRune()error func(r*Reader)WriteTo(wio.Writer)(nint64,errerror)//WriteToimplementstheio.WriterTointerface.
Len,Size,Read
Len作用:返回未读的字符串长度。
Size的作用:返回字符串的长度。
Read的作用:读取字符串信息,读取之后会改变Len的返回值
r:=strings.NewReader("abcdefghijklmn")
fmt.Println(r.Len())//输出14初始时,未读长度等于字符串长度
varbuf[]byte
buf=make([]byte,5)
readLen,err:=r.Read(buf)
fmt.Println("读取到的长度:",readLen)//读取到的长度5
iferr!=nil{
fmt.Println("错误:",err)
}
fmt.Println(buf)//adcde
fmt.Println(r.Len())//9读取到了5个剩余未读是14-5
fmt.Println(r.Size())//14字符串的长度
ReadAt
- func(r*Reader)ReadAt(b[]byte,offint64)(nint,errerror)
读取偏移off字节后的剩余信息到b中,ReadAt函数不会影响Len的数值。
r:=strings.NewReader("abcdefghijklmn")
varbufAt,buf[]byte
buf=make([]byte,5)
r.Read(buf)
fmt.Println("剩余未读的长度",r.Len())//剩余未读的长度9
fmt.Println("已读取的内容",string(buf))//已读取的内容abcde
bufAt=make([]byte,256)
r.ReadAt(bufAt,5)
fmt.Println(string(bufAt))//fghijklmn
//测试下是否影响Len和Read方法
fmt.Println("剩余未读的长度",r.Len())//剩余未读的长度9
fmt.Println("已读取的内容",string(buf))//已读取的内容abcde
ReadByte,UnreadByte
- func(r*Reader)ReadByte()(byte,error)
- func(r*Reader)UnreadByte()error
ReadByte从当前已读取位置继续读取一个字节。
UnreadByte将当前已读取位置回退一位,当前位置的字节标记成未读取字节。
ReadByte和UnreadByte会改变reader对象的长度。
r:=strings.NewReader("abcdefghijklmn")
//读取一个字节
b,_:=r.ReadByte()
fmt.Println(string(b))//a
//int(r.Size())-r.Len()已读取字节数
fmt.Println(int(r.Size())-r.Len())//1
//读取一个字节
b,_=r.ReadByte()
fmt.Println(string(b))//b
fmt.Println(int(r.Size())-r.Len())//2
//回退一个字节
r.UnreadByte()
fmt.Println(int(r.Size())-r.Len())//1
//读取一个字节
b,_=r.ReadByte()
fmt.Println(string(b))
Seek
- func(r*Reader)Seek(offsetint64,whenceint)(int64,error)
ReadAt方法并不会改变Len()的值,Seek的移位操作可以改变。offset是偏移的位置,whence是偏移起始位置,支持三种位置:io.SeekStart起始位,io.SeekCurrent当前位,io.SeekEnd末位。
offset可以是负数,当时偏移起始位与offset相加得到的值不能小于0或者大于size()的长度。
r:=strings.NewReader("abcdefghijklmn")
varbuf[]byte
buf=make([]byte,5)
r.Read(buf)
fmt.Println(string(buf),r.Len())//adcde9
buf=make([]byte,5)
r.Seek(-2,io.SeekCurrent)//从当前位置向前偏移两位(5-2)
r.Read(buf)
fmt.Println(string(buf),r.Len())//defgh6
buf=make([]byte,5)
r.Seek(-3,io.SeekEnd)//设置当前位置是末尾前移三位
r.Read(buf)
fmt.Println(string(buf),r.Len())//lmn0
buf=make([]byte,5)
r.Seek(3,io.SeekStart)//设置当前位置是起始位后移三位
r.Read(buf)
fmt.Println(string(buf),r.Len())//defgh6
到此这篇关于Go中strings的常用方法详解的文章就介绍到这了,更多相关Gostrings内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。