本文介紹Go 標(biāo)準(zhǔn)庫?strings?常用導(dǎo)出函數(shù)赫粥,結(jié)構(gòu)體及其方法纬乍。
importstrings
strings 包實(shí)現(xiàn)了用于操作字符串的簡單函數(shù)混蔼,包括?strings?導(dǎo)出函數(shù)和?Reader,?Replacer?兩個結(jié)構(gòu)體赐俗。
1. strings 常用導(dǎo)出函數(shù)
判斷字符串與子串關(guān)系
func EqualFold(s, t string) bool?// 判斷兩個utf-8編碼字符串几苍,大小寫不敏感
func HasPrefix(s, prefix string) bool?// 判斷s是否有前綴字符串prefix
func Contains(s, substr string) bool?// 判斷字符串s是否包含子串substr
func ContainsAny(s, chars string) bool?// 判斷字符串s是否包含字符串chars中的任一字符
func Count(s, sep string) int?// 返回字符串s中有幾個不重復(fù)的sep子串
獲取字符串中子串位置
func Index(s, sep string) int?// 子串sep在字符串s中第一次出現(xiàn)的位置蚀浆,不存在則返回-1
func IndexByte(s string, c byte) int?// 字符c在s中第一次出現(xiàn)的位置,不存在則返回-
func IndexAny(s, chars string) int?// 字符串chars中的任一utf-8碼值在s中第一次出現(xiàn)的位置香追,如果不存在或者chars為空字符串則返回-1
func IndexFunc(s string, f func(rune) bool) int?// s中第一個滿足函數(shù)f的位置i(該處的utf-8碼值r滿足f(r)==true)合瓢,不存在則返回-1
func LastIndex(s, sep string) int?// 子串sep在字符串s中最后一次出現(xiàn)的位置,不存在則返回-1
字符串中字符處理
func Title(s string) string?// 返回s中每個單詞的首字母都改為標(biāo)題格式的字符串拷貝
func ToLower(s string) string?// 返回將所有字母都轉(zhuǎn)為對應(yīng)的小寫版本的拷貝
func ToUpper(s string) string?// 返回將所有字母都轉(zhuǎn)為對應(yīng)的大寫版本的拷貝
func Repeat(s string, count int) string?// 返回count個s串聯(lián)的字符串
func Replace(s, old, new string, n int) string?// 返回將s中前n個不重疊old子串都替換為new的新字符串透典,如果n<0會替換所有old子串
func Map(mapping func(rune) rune, s string) string?// 將s的每一個unicode碼值r都替換為mapping(r)晴楔,返回這些新碼值組成的字符串拷貝顿苇。如果mapping返回一個負(fù)值,將會丟棄該碼值而不會被替換
字符串前后端處理
func Trim(s string, cutset string) string?// 返回將s前后端所有cutset包含的utf-8碼值都去掉的字符串
func TrimSpace(s string) string?// 返回將s前后端所有空白(unicode.IsSpace指定)都去掉的字符串
func TrimFunc(s string, f func(rune) bool) string?// 返回將s前后端所有滿足f的unicode碼值都去掉的字符串
字符串分割與合并
func Fields(s string) []string?// 返回將字符串按照空白(通過unicode.IsSpace判斷税弃,可以是一到多個連續(xù)的空白字符)分割的多個字符串
func Split(s, sep string) []string?// 用去掉s中出現(xiàn)的sep的方式進(jìn)行分割纪岁,會分割到結(jié)尾,并返回生成的所有片段組成的切片
func Join(a []string, sep string) string?// 將一系列字符串連接為一個字符串则果,之間用sep來分隔
strings?導(dǎo)出函數(shù)示例
$GOPATH/src/github.com/ironxu/go_note/library/strings/strings.go?源碼如下:
// go 標(biāo)準(zhǔn)庫 stringspackage mainimport("fmt""strings")funcmain(){// 判斷兩個utf-8編碼字符串幔翰,大小寫不敏感s, t :="hello go","hello Go"is_equal := strings.EqualFold(s, t)? ? fmt.Println("EqualFold: ", is_equal)// EqualFold:? true// 判斷s是否有前綴字符串prefixprefix :="hello"has_prefix := strings.HasPrefix(s, prefix)? ? fmt.Println(has_prefix)// true// 判斷s是否有后綴字符串suffixsuffix :="go"has_suffix := strings.HasSuffix(s, suffix)? ? fmt.Println(has_suffix)// true// 判斷字符串s是否包含子串substrsubstr :="lo"con := strings.Contains(s, substr)? ? fmt.Println(con)// true// 判斷字符串s是否包含utf-8碼值rr := rune(101)? ? ru :='e'con_run := strings.ContainsRune(s, r)? ? fmt.Println(con_run, r, ru)// true// 子串sep在字符串s中第一次出現(xiàn)的位置,不存在則返回-1sep :="o"sep_idnex := strings.Index(s, sep)? ? fmt.Println(sep_idnex)// 4// 子串sep在字符串s中最后一次出現(xiàn)的位置西壮,不存在則返回-1sep_lastindex := strings.LastIndex(s, sep)? ? fmt.Println(sep_lastindex)// 7// 返回s中每個單詞的首字母都改為標(biāo)題格式的字符串拷貝title := strings.Title(s)? ? fmt.Println(title)// Hello Go// 返回將所有字母都轉(zhuǎn)為對應(yīng)的標(biāo)題版本的拷貝to_title := strings.ToTitle(s)? ? fmt.Println(to_title)// HELLO GO// 返回將所有字母都轉(zhuǎn)為對應(yīng)的小寫版本的拷貝s_lower := strings.ToLower(s)? ? fmt.Println(s_lower)// hello go// 返回count個s串聯(lián)的字符串s_repeat := strings.Repeat(s,3)? ? fmt.Println(s_repeat)// hello gohello gohello go// 返回將s中前n個不重疊old子串都替換為new的新字符串遗增,如果n<0會替換所有old子串s_old, s_new :="go","world"s_replace := strings.Replace(s, s_old, s_new,-1)? ? fmt.Println(s_replace)// hello world// 返回將s前后端所有cutset包含的utf-8碼值都去掉的字符串s, cutset :="#abc!!!","#!"s_new = strings.Trim(s, cutset)? ? fmt.Println(s, s_new)// #abc!!! abc// 返回將字符串按照空白(unicode.IsSpace確定,可以是一到多個連續(xù)的空白字符)分割的多個字符串s ="hello world! go language"s_fields := strings.Fields(s)fork, v := range s_fields {? ? ? ? fmt.Println(k, v)? ? }// 0 hello// 1 world!// 2 go// 3 language// 用去掉s中出現(xiàn)的sep的方式進(jìn)行分割款青,會分割到結(jié)尾做修,并返回生成的所有片段組成的切片s_split := strings.Split(s," ")? ? fmt.Println(s_split)// [hello world! go language]// 將一系列字符串連接為一個字符串,之間用sep來分隔s_join := strings.Join([]string{"a","b","c"},"/")? ? fmt.Println(s_join)// a/b/c// 將s的每一個unicode碼值r都替換為mapping(r)抡草,返回這些新碼值組成的字符串拷貝饰及。如果mapping返回一個負(fù)值,將會丟棄該碼值而不會被替換map_func := func(r rune) rune {switch{caser >'A'&& r <'Z':returnr +32caser >'a'&& r <'z':returnr -32}returnr? ? }? ? s ="Hello World!"s_map := strings.Map(map_func, s)? ? fmt.Println(s_map)// hELLO wORLD!}
2. Reader 結(jié)構(gòu)體
Reader?類型從一個字符串讀取數(shù)據(jù)康震,實(shí)現(xiàn)了io.Reader,?io.Seeker等接口燎含。
func NewReader(s string) *Reader?// 通過字符串?s?創(chuàng)建一個?Reader
func (r *Reader) Len() int?// 返回?r?還沒有讀取部分的長度
func (r *Reader) Read(b []byte) (n int, err error)?// 讀取部分?jǐn)?shù)據(jù)到?b?中,讀取的長度取決于?b?的容量
func (r *Reader) ReadByte() (b byte, err error)?// 從?r?中讀取一字節(jié)數(shù)據(jù)
$GOPATH/src/github.com/ironxu/go_note/library/strings/reader.go?源碼如下:
// go 標(biāo)準(zhǔn)庫 strings.Readerpackage mainimport("fmt""strings")funcmain(){? ? s :="hello world"http:// 創(chuàng)建 Readerr := strings.NewReader(s)? ? fmt.Println(r)// &{hello world 0 -1}fmt.Println(r.Size())// 11 獲取字符串長度fmt.Println(r.Len())// 11 獲取未讀取長度// 讀取前6個字符forr.Len() >5{? ? ? ? b, err := r.ReadByte()// 讀取1 bytefmt.Println(string(b), err, r.Len(), r.Size())// h 10 11// e 9 11// l 8 11// l 7 11// o 6 11//? 5 11}// 讀取還未被讀取字符串中5字符的數(shù)據(jù)b_s := make([]byte,5)? ? n, err := r.Read(b_s)? ? fmt.Println(string(b_s), n ,err)// world 5 fmt.Println(r.Size())// 11fmt.Println(r.Len())// 0}
3. Replacer 結(jié)構(gòu)體
Replacer?類型實(shí)現(xiàn)字符串替換的操作
func NewReplacer(oldnew ...string) *Replacer?// 使用提供的多組old签杈、new字符串對創(chuàng)建一個*Replacer
func (r *Replacer) Replace(s string) string?// 返回s?所有替換完后的拷貝
func (r *Replacer) WriteString(w io.Writer, s string) (n int, err error)?// 向w中寫入s替換完后的拷貝
$GOPATH/src/github.com/ironxu/go_note/library/strings/replace.go?源碼如下:
// go 標(biāo)準(zhǔn)庫 strings.Replacerpackagemainimport("fmt""strings""os")funcmain(){? ? s :="
Go Language
"r := strings.NewReplacer("<","<",">",">")? ? fmt.Println(r.Replace(s))? ? r.WriteString(os.Stdout, s)}
參考