Go中strings的常用方法詳解
string操作在編程中具有極高的頻率,那么string中有哪些有用的方法呢?
使用strings直接操作
Compare
- func Compare(a, b string) int
按照字典序比較兩個(gè)字符串,通常情況下直接使用=,>,<會(huì)更快一些。
Contains,ContainsAny 和 ContainsRune
- func Contains(s, substr string) bool
- func ContainsAny(s, chars string) bool
- func ContainsRune(s string, r rune) 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用于判斷子串中是否具有一個(gè)字符在源串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中。
// Finds whether a string contains a particular Unicode code point. // The code point for the lowercase letter "a", for example, is 97. fmt.Println(strings.ContainsRune("aardvark", 97)) fmt.Println(strings.ContainsRune("timeout", 97))
Count
- func Count(s, substr string) int
判斷子串在源串中的數(shù)量,如果子串為空,則長(zhǎng)度為源串的長(zhǎng)度+1。
fmt.Println(strings.Count("cheese", "e")) // 3 fmt.Println(strings.Count("five", "")) // before & after each rune 5=4+1
EqualFold
- func EqualFold(s, t string) bool
在不區(qū)分大小寫(xiě)的情況下,判斷兩個(gè)字符串是否相同。
Fields
- func Fields(s string) []string
- func FieldsFunc(s string, f func(rune) bool) []string
Fields:使用空白分割字符串。
FieldsFunc:根據(jù)傳入的函數(shù)分割字符串,如果當(dāng)前參數(shù)c不是數(shù)字或者字母,返回true作為分割符號(hào)。
fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz ")) // ["foo" "bar" "baz"] f := func(c rune) bool { return !unicode.IsLetter(c) && !unicode.IsNumber(c) } fmt.Printf("Fields are: %q", strings.FieldsFunc(" foo1;bar2,baz3...", f)) // ["foo1" "bar2" "baz3"]
HasPrefix 和 HasSuffix
- func HasPrefix(s, prefix string) bool
- func HasSuffix(s, suffix string) bool
判斷字符串是否是以某個(gè)子串作為開(kāi)頭或者結(jié)尾。
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
- func Join(elems []string, sep string) string
使用某個(gè)sep,連接字符串。
s := []string{"foo", "bar", "baz"} fmt.Println(strings.Join(s, ", ")) // foo,bar,baz
Index,IndexAny,IndexByte,IndexFunc,IndexRune
- func Index(s, substr string) int
- func IndexAny(s, chars string) int
- func IndexByte(s string, c byte) int
- func IndexFunc(s string, f func(rune) bool) int
- func IndexRune(s string, r rune) int
Index,IndexAny,IndexByte,IndexFunc,IndexRune都是返回滿(mǎn)足條件的第一個(gè)位置,如果沒(méi)有滿(mǎn)足條件的數(shù)據(jù),返回-1。
fmt.Println(strings.Index("chicken", "ken")) // 4 fmt.Println(strings.Index("chicken", "dmr")) // -1 // 子串中的任意字符在源串出現(xiàn)的位置 fmt.Println(strings.IndexAny("chicken", "aeiouy")) // 2 fmt.Println(strings.IndexAny("crwth", "aeiouy")) // -1 // IndexByte,字符在字符串中出現(xiàn)的位置 fmt.Println(strings.IndexByte("golang", 'g')) // 0 fmt.Println(strings.IndexByte("gophers", 'h')) // 3 fmt.Println(strings.IndexByte("golang", 'x')) // -1 // IndexFunc 滿(mǎn)足條件的作為篩選條件 f := func(c rune) bool { return unicode.Is(unicode.Han, c) } fmt.Println(strings.IndexFunc("Hello, 世界", f)) // 7 fmt.Println(strings.IndexFunc("Hello, world", f)) // -1 // 某個(gè)字符在源串中的位置 fmt.Println(strings.IndexRune("chicken", 'k')) // 4 fmt.Println(strings.IndexRune("chicken", 'd')) // -1
LastIndex,LastIndexAny,LastIndexByte和LastIndexFunc
- func LastIndex(s, substr string) int
- func LastIndexAny(s, chars string) int
- func LastIndexByte(s string, c byte) int
- func LastIndexFunc(s string, f func(rune) bool) int
LastIndex,LastIndexAny,LastIndexByte,LastIndexFunc和Index,IndexAny,IndexByte,IndexFunc,IndexRune用法保持一致,從右往前計(jì)數(shù)。
Map
- func Map(mapping func(rune) rune, s string) string
對(duì)字符串s中每一個(gè)字符執(zhí)行map函數(shù)中的操作。
rot13 := func(r rune) rune { // r是遍歷的每一個(gè)字符 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 } fmt.Println(strings.Map(rot13, "'Twas brillig and the slithy gopher..."))
Repeat
- func Repeat(s string, count int) string
重復(fù)一下s,count是重復(fù)的次數(shù),不能傳負(fù)數(shù)。
fmt.Println("ba" + strings.Repeat("na", 2))
Replace和ReplaceAll
- func Replace(s, old, new string, n int) string
- func ReplaceAll(s, old, new string) string
使用new來(lái)替換old,替換的次數(shù)為n。如果n為負(fù)數(shù),則替換所有的滿(mǎn)足條件的子串。
fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2)) // oinky oinkky oink fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1)) moo moo moo
ReplaceAll使用new替換所有的old,相當(dāng)于使用Replace時(shí)n<0。
Split,SplitN,SplitAfter和SplitAfterN
- func Split(s, sep string) []string
- func SplitAfter(s, sep string) []string
- func SplitAfterN(s, sep string, n int) []string
- func SplitN(s, sep string, n int) []string
fmt.Printf("%q\n", strings.Split("a,b,c", ",")) // ["a","b","c"] fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a ")) // ["" "man " "plan " "canal panama"] fmt.Printf("%q\n", strings.Split(" xyz ", "")) // [" " "x" "y" "z" " "] fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins")) // [""] // SplitN 定義返回之后的切片中包含的長(zhǎng)度,最后一部分是未被處理的。 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分割,分割出來(lái)的字符串中包含sep,可以限定分割之后返回的長(zhǎng)度。 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"]
對(duì)于SplitN和SplitAfterN的第二個(gè)n說(shuō)明。
n > 0: at most n substrings; the last substring will be the unsplit remainder. n == 0: the result is nil (zero substrings) n < 0: all substrings
Trim,TrimFunc,TrimLeft,TrimLeftFunc,TrimPrefix,TrimSuffix,TrimRight,TrimRightFunc
- func Trim(s string, cutset string) string
- func TrimFunc(s string, f func(rune) bool) string
- func TrimLeft(s string, cutset string) string
- func TrimLeftFunc(s string, f func(rune) bool) string
- func TrimPrefix(s, prefix string) string
- func TrimSuffix(s, suffix string) string
- func TrimRight(s string, cutset string) string
- func TrimRightFunc(s string, f func(rune) bool) string
// Trim 包含在cutset中的元素都會(huì)被去掉 fmt.Print(strings.Trim("¡¡¡Hello, Gophers!!!", "!¡")) // Hello, Gophers // TrimFunc去掉滿(mǎn)足條件的字符 fmt.Print(strings.TrimFunc("¡¡¡Hello, Gophers!!!", func(r rune) bool { return !unicode.IsLetter(r) && !unicode.IsNumber(r) })) // TrimLeft 去掉左邊滿(mǎn)足包含在cutset中的元素,直到遇到不在cutset中的元素為止 fmt.Print(strings.TrimLeft("¡¡¡Hello, Gophers!!!", "!¡")) // Hello, Gophers!!! // TrimLeftFunc 去掉左邊屬于函數(shù)返回值部分,直到遇到不在cutset中的元素為止 fmt.Print(strings.TrimLeftFunc("¡¡¡Hello, Gophers!!!", func(r rune) bool { return !unicode.IsLetter(r) && !unicode.IsNumber(r) })) // Hello, Gophers!!! // TrimPrefix 去掉開(kāi)頭部分;TrimSuffix 去掉結(jié)尾部分 var s = "¡¡¡Hello, Gophers!!!" s = strings.TrimPrefix(s, "¡¡¡Hello, ") s = strings.TrimPrefix(s, "¡¡¡Howdy, ") fmt.Print(s)
TrimRight,TrimRightFunc和TrimLeft,TrimLeftFunc功能保持一直,無(wú)需贅述。
使用strings.Builder操作
A Builder is used to efficiently build a string using Write methods. It minimizes memory copying. The zero value is ready to use. Do not copy a non-zero Builder.
strings.Builder使用Write方法來(lái)高效的構(gòu)建字符串。它最小化了內(nèi)存拷貝,耗費(fèi)零內(nèi)存,不要拷貝非零的Builder。
var b strings.Builder for i := 3; i >= 1; i-- { fmt.Fprintf(&b, "%d...", i) } b.WriteString("ignition") fmt.Println(b.String())
輸出結(jié)果:
3...2...1...ignition
strings.Builder作為字符串拼接的利器,建議加大使用力度。 func (b *Builder) Cap() int // 容量,涉及批量?jī)?nèi)存分配機(jī)制 func (b *Builder) Grow(n int) // 手動(dòng)分配內(nèi)存數(shù)量 func (b *Builder) Len() int // 當(dāng)前builder中含有的所有字符長(zhǎng)度 func (b *Builder) Reset() // 清空builder func (b *Builder) String() string // 轉(zhuǎn)化為字符串輸出 func (b *Builder) Write(p []byte) (int, error) // 往builder寫(xiě)入數(shù)據(jù) func (b *Builder) WriteByte(c byte) error // 往builder寫(xiě)入數(shù)據(jù) func (b *Builder) WriteRune(r rune) (int, error) // 往builder寫(xiě)入數(shù)據(jù) func (b *Builder) WriteString(s string) (int, error) // 往builder寫(xiě)入數(shù)據(jù)
使用strings.Reader
type Reader struct { s string //對(duì)應(yīng)的字符串 i int64 // 當(dāng)前讀取到的位置 prevRune int }
A Reader implements the io.Reader, io.ReaderAt, io.Seeker, io.WriterTo, io.ByteScanner, and io.RuneScanner interfaces by reading from a string. The zero value for Reader operates like a Reader of an empty string.
Reader通過(guò)讀取字符串的方式,實(shí)現(xiàn)了接口io.Reader, io.ReaderAt, io.Seeker, io.WriterTo, io.ByteScanner和io.RuneScanner。零值Reader操作起來(lái)就像操作空字符串的io.Reader一樣。
func NewReader(s string) *Reader // 初始化reader實(shí)例 func (r *Reader) Len() int // 未讀字符長(zhǎng)度 func (r *Reader) Read(b []byte) (n int, err error) func (r *Reader) ReadAt(b []byte, off int64) (n int, err error) func (r *Reader) ReadByte() (byte, error) func (r *Reader) ReadRune() (ch rune, size int, err error) func (r *Reader) Reset(s string) // 重置以從s中讀 func (r *Reader) Seek(offset int64, whence int) (int64, error) // Seek implements the io.Seeker interface. func (r *Reader) Size() int64 // 字符串的原始長(zhǎng)度 func (r *Reader) UnreadByte() error func (r *Reader) UnreadRune() error func (r *Reader) WriteTo(w io.Writer) (n int64, err error) // WriteTo implements the io.WriterTo interface.
Len,Size,Read
Len作用: 返回未讀的字符串長(zhǎng)度。
Size的作用:返回字符串的長(zhǎng)度。
Read的作用: 讀取字符串信息,讀取之后會(huì)改變Len的返回值
r := strings.NewReader("abcdefghijklmn") fmt.Println(r.Len()) // 輸出14 初始時(shí),未讀長(zhǎng)度等于字符串長(zhǎng)度 var buf []byte buf = make([]byte, 5) readLen, err := r.Read(buf) fmt.Println("讀取到的長(zhǎng)度:", readLen) //讀取到的長(zhǎng)度5 if err != nil { fmt.Println("錯(cuò)誤:", err) } fmt.Println(buf) //adcde fmt.Println(r.Len()) //9 讀取到了5個(gè) 剩余未讀是14-5 fmt.Println(r.Size()) //14 字符串的長(zhǎng)度
ReadAt
- func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
讀取偏移off字節(jié)后的剩余信息到b中,ReadAt函數(shù)不會(huì)影響Len的數(shù)值。
r := strings.NewReader("abcdefghijklmn") var bufAt, buf []byte buf = make([]byte, 5) r.Read(buf) fmt.Println("剩余未讀的長(zhǎng)度", r.Len()) //剩余未讀的長(zhǎng)度 9 fmt.Println("已讀取的內(nèi)容", string(buf)) //已讀取的內(nèi)容 abcde bufAt = make([]byte, 256) r.ReadAt(bufAt, 5) fmt.Println(string(bufAt)) //fghijklmn //測(cè)試下是否影響Len和Read方法 fmt.Println("剩余未讀的長(zhǎng)度", r.Len()) //剩余未讀的長(zhǎng)度 9 fmt.Println("已讀取的內(nèi)容", string(buf)) //已讀取的內(nèi)容 abcde
ReadByte,UnreadByte
- func (r *Reader) ReadByte() (byte, error)
- func (r *Reader) UnreadByte() error
ReadByte從當(dāng)前已讀取位置繼續(xù)讀取一個(gè)字節(jié)。
UnreadByte將當(dāng)前已讀取位置回退一位,當(dāng)前位置的字節(jié)標(biāo)記成未讀取字節(jié)。
ReadByte和UnreadByte會(huì)改變r(jià)eader對(duì)象的長(zhǎng)度。
r := strings.NewReader("abcdefghijklmn") //讀取一個(gè)字節(jié) b, _ := r.ReadByte() fmt.Println(string(b)) // a //int(r.Size()) - r.Len() 已讀取字節(jié)數(shù) fmt.Println(int(r.Size()) - r.Len()) // 1 //讀取一個(gè)字節(jié) b, _ = r.ReadByte() fmt.Println(string(b)) // b fmt.Println(int(r.Size()) - r.Len()) // 2 //回退一個(gè)字節(jié) r.UnreadByte() fmt.Println(int(r.Size()) - r.Len()) // 1 //讀取一個(gè)字節(jié) b, _ = r.ReadByte() fmt.Println(string(b))
Seek
- func (r *Reader) Seek(offset int64, whence int) (int64, error)
ReadAt方法并不會(huì)改變Len()的值,Seek的移位操作可以改變。offset是偏移的位置,whence是偏移起始位置,支持三種位置:io.SeekStart起始位,io.SeekCurrent當(dāng)前位,io.SeekEnd末位。
offset可以是負(fù)數(shù),當(dāng)時(shí)偏移起始位與offset相加得到的值不能小于0或者大于size()的長(zhǎng)度。
r := strings.NewReader("abcdefghijklmn") var buf []byte buf = make([]byte, 5) r.Read(buf) fmt.Println(string(buf), r.Len()) //adcde 9 buf = make([]byte, 5) r.Seek(-2, io.SeekCurrent) //從當(dāng)前位置向前偏移兩位 (5-2) r.Read(buf) fmt.Println(string(buf), r.Len()) //defgh 6 buf = make([]byte, 5) r.Seek(-3, io.SeekEnd) //設(shè)置當(dāng)前位置是末尾前移三位 r.Read(buf) fmt.Println(string(buf), r.Len()) //lmn 0 buf = make([]byte, 5) r.Seek(3, io.SeekStart) //設(shè)置當(dāng)前位置是起始位后移三位 r.Read(buf) fmt.Println(string(buf), r.Len()) //defgh 6
到此這篇關(guān)于Go中strings的常用方法詳解的文章就介紹到這了,更多相關(guān)Go strings內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)strings的常用函數(shù)和方法
- GoLang strings.Builder底層實(shí)現(xiàn)方法詳解
- Golang的strings.Split()踩坑記錄
- GO語(yǔ)言字符串處理Strings包的函數(shù)使用示例講解
- Golang?strings包常用字符串操作函數(shù)
- golang?Strings包使用總結(jié)
- golang 中strings包的Replace的使用說(shuō)明
- Go語(yǔ)言中strings和strconv包示例代碼詳解
- go語(yǔ)言中strings包的用法匯總
- go的strings用法小結(jié)
相關(guān)文章
golang基于websocket實(shí)現(xiàn)的簡(jiǎn)易聊天室程序
這篇文章主要介紹了golang基于websocket實(shí)現(xiàn)的簡(jiǎn)易聊天室,分析了websocket的下載、安裝及使用實(shí)現(xiàn)聊天室功能的相關(guān)技巧,需要的朋友可以參考下2016-07-07Golang時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則
這篇文章主要為大家介紹了Golang?時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11golang接口IP限流,IP黑名單,IP白名單的實(shí)例
這篇文章主要介紹了golang接口IP限流,IP黑名單,IP白名單的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Go語(yǔ)言Telnet回音服務(wù)器的實(shí)現(xiàn)
這篇文章主要介紹了Go語(yǔ)言Telnet回音服務(wù)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Go語(yǔ)言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12