Go 標(biāo)準(zhǔn)庫介紹一: strings

原文鏈接 http://ironxu.com/740

本文介紹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)}

參考

pkg/strings 中文

pkg/strings

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘫镇,一起剝皮案震驚了整個濱河市鼎兽,隨后出現(xiàn)的幾起案子答姥,更是在濱河造成了極大的恐慌,老刑警劉巖谚咬,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹦付,死亡現(xiàn)場離奇詭異,居然都是意外死亡择卦,警方通過查閱死者的電腦和手機(jī)敲长,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秉继,“玉大人祈噪,你說我怎么就攤上這事∩屑” “怎么了辑鲤?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杠茬。 經(jīng)常有香客問我月褥,道長弛随,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任宁赤,我火速辦了婚禮舀透,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘决左。我一直安慰自己愕够,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布佛猛。 她就那樣靜靜地躺著链烈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挚躯。 梳的紋絲不亂的頭發(fā)上强衡,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音码荔,去河邊找鬼漩勤。 笑死,一個胖子當(dāng)著我的面吹牛缩搅,可吹牛的內(nèi)容都是我干的越败。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼硼瓣,長吁一口氣:“原來是場噩夢啊……” “哼究飞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堂鲤,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤亿傅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘟栖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葵擎,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年半哟,在試婚紗的時候發(fā)現(xiàn)自己被綠了酬滤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡寓涨,死狀恐怖盯串,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情戒良,我是刑警寧澤体捏,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響译打,放射性物質(zhì)發(fā)生泄漏耗拓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一奏司、第九天 我趴在偏房一處隱蔽的房頂上張望乔询。 院中可真熱鬧,春花似錦韵洋、人聲如沸竿刁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽食拜。三九已至,卻和暖如春副编,著一層夾襖步出監(jiān)牢的瞬間负甸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工痹届, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呻待,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓队腐,卻偏偏與公主長得像蚕捉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柴淘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容