go常用字符串操作

整理一些go的字符串常用操作。

  1. 修改字符串中的一個(gè)字符
func main() {
  str1 := "see"
  byteS := []byte(str1)
  byteS[2] = 'a'
  fmt.Println(string(byteS))

  str2 := "湖南"
  runeS := []rune(str2)
  runeS[1] = '北'
  fmt.Println(string(runeS))
 }

輸出:
sea
湖北
  1. 字符串切片
str := "Hello World!"
subStr := str[6:11]
fmt.Println(subStr) 
輸出:World
  1. 使用for或者for-range遍歷一個(gè)字符串
// gives only the bytes:
for i:=0; i < len(str); i++ {
… = str[i]
}
// gives the Unicode characters:
for ix, ch := range str {
…
}
  1. 獲取一個(gè)字符串的字節(jié)數(shù)
len(str)
  1. 獲取一個(gè)字符串的字符數(shù)
utf8.RuneCountInString(str)
//or
len([]int(str))
  1. 連接字符串
  • 直接用"+="操作符,直接將多個(gè)字符串拼接竟闪。最直觀(guān)的方法测蘑,不過(guò)當(dāng)數(shù)據(jù)量非常大時(shí)用這種拼接訪(fǎng)求是非常低效的经宏。
  • 用字符串切片([]string)裝載所有要拼接的字符串赴精,最后使用strings.Join()函數(shù)一次性將所有字符串拼接起來(lái)息尺。在數(shù)據(jù)量非常大時(shí),這種方法的效率也還可以的嵌戈。
  • 利用Buffer(Buffer是一個(gè)實(shí)現(xiàn)了讀寫(xiě)方法的可變大小的字節(jié)緩沖)覆积,將所有的字符串都寫(xiě)入到一個(gè)Buffer變量中,最后再統(tǒng)一輸出熟呛。這種方法的效率最變態(tài)宽档,達(dá)到“日天”級(jí)別。
str1 := "Hello " 
str2 := "World!"
str1 += str2 //str1 == "Hello World!"

// strings包的函數(shù)庵朝,把slice通過(guò)給定的sep連接成一個(gè)字符串
func Join(a []string, sep string) string

s := []string{"Hello", "World!"}
fmt.Println(strings.Join(s, " ")) //"Hello World!"

// bytes.Buffer的方法, 將給定字符串追加(append)到Buffer
func (b *Buffer) WriteString(s string) (n int, err error)

var buffer bytes.Buffer
buffer.WriteString("Hello")
buffer.WriteString(" ")
buffer.WriteString("World!")
buffer.String() // 拼接結(jié)果"Hello World!"
  1. 字符串比較
// Compare比較字符串的速度比字符串內(nèi)建的比較要快
func Compare(a, bstring)int
fmt.Println(strings.Compare(string("hello"),string("haha")))// 1
fmt.Println(strings.Compare(string("hello"),string("world")))// -1
fmt.Println(strings.Compare(string("hello"),string("helloworld")))// -1
fmt.Println(strings.Compare(string("hello"),string("hello")))//0
  1. 字符串查找
// 判斷給定字符串s中是否包含子串substr, 找到返回true, 找不到返回false
func Contains(s, substrstring)bool

// 在字符串s中查找sep所在的位置, 返回位置值, 找不到返回-1
func Index(s, sepstring)int

// 統(tǒng)計(jì)給定子串sep的出現(xiàn)次數(shù), sep為空時(shí), 返回1 + 字符串的長(zhǎng)度
func Count(s, sepstring)int
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

fmt.Println(strings.Index("chicken","ken"))// 4
fmt.Println(strings.Index("chicken","dmr"))// -1

fmt.Println(strings.Count("cheeseeee","ee"))// 3
fmt.Println(strings.Count("five",""))// 5
  1. 字符串重復(fù)
// 重復(fù)s字符串count次, 最后返回新生成的重復(fù)的字符串
func Repeat(sstring,countint)string
fmt.Println("ba"+ strings.Repeat("na",2))// banana
  1. 字符串替換
// 在s字符串中, 把old字符串替換為new字符串吗冤,n表示替換的次數(shù),小于0表示全部替換
func Replace(s, old,newstring, nint)string
fmt.Println(strings.Replace("oink oink oink","k","ky",2))// oinky oinky oink
fmt.Println(strings.Replace("oink oink oink","oink","moo", -1))// moo moo moo
  1. 字符串前綴后綴
// 判斷字符串是否包含前綴prefix
func HasPrefix(s, prefixstring)bool

// 判斷字符串是否包含后綴suffix, 
func HasSuffix(s, suffixstring)bool
fmt.Println(strings.HasPrefix("Gopher","Go"))// true
fmt.Println(strings.HasPrefix("Gopher","go"))// false
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

來(lái)個(gè)大而全的九府,方便查找

package main

import s "strings"

import (
    "fmt"
)

var p = fmt.Println

func main() {
    p("Contains: ", s.Contains("test", "es")) //是否包含 true
    p("Count: ", s.Count("test", "t")) //字符串出現(xiàn)字符的次數(shù) 2
    p("HasPrefix: ", s.HasPrefix("test", "te")) //判斷字符串首部 true
    p("HasSuffix: ", s.HasSuffix("test", "st")) //判斷字符串結(jié)尾 true
    p("Index: ", s.Index("test", "e")) //查詢(xún)字符串位置 1
    p("Join: ", s.Join([]string{"a", "b"}, "-"))//字符串?dāng)?shù)組 連接 a-b
    p("Repeat: ", s.Repeat("a", 5)) //重復(fù)一個(gè)字符串 aaaaa
    p("Replace: ", s.Replace("foo", "o", "0", -1)) //字符串替換 指定起始位置為小于0,則全部替換 f00
    p("Replace: ", s.Replace("foo", "o", "0", 1)) //字符串替換 指定起始位置1 f0o
    p("Split: ", s.Split("a-b-c-d-e", "-")) //字符串切割 [a b c d e]
    p("ToLower: ", s.ToLower("TEST")) //字符串 小寫(xiě)轉(zhuǎn)換 test
    p("ToUpper: ", s.ToUpper("test")) //字符串 大寫(xiě)轉(zhuǎn)換 TEST
    p()
    p("Len: ", len("hello")) //字符串長(zhǎng)度
    p("Char:", "hello"[1]) //標(biāo)取字符串中的字符椎瘟,類(lèi)型為byte
}

詳細(xì)用法

package main

import (
    "fmt"
    "strings"
    //"unicode/utf8"
)

func main() {
    fmt.Println("查找子串是否在指定的字符串中")
    fmt.Println(" Contains 函數(shù)的用法")
    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 這里要特別注意
    fmt.Println(strings.Contains("我是中國(guó)人", "我")) //true

    fmt.Println("")
    fmt.Println(" ContainsAny 函數(shù)的用法")
    fmt.Println(strings.ContainsAny("team", "i")) // false
    fmt.Println(strings.ContainsAny("failure", "u & i")) // true
    fmt.Println(strings.ContainsAny("foo", "")) // false
    fmt.Println(strings.ContainsAny("", "")) // false

    fmt.Println("")
    fmt.Println(" ContainsRune 函數(shù)的用法")
    fmt.Println(strings.ContainsRune("我是中國(guó)", '我')) // true 注意第二個(gè)參數(shù),用的是字符

    fmt.Println("")
    fmt.Println(" Count 函數(shù)的用法")
    fmt.Println(strings.Count("cheese", "e")) // 3
    fmt.Println(strings.Count("five", "")) // before & after each rune result: 5 , 源碼中有實(shí)現(xiàn)

    fmt.Println("")
    fmt.Println(" EqualFold 函數(shù)的用法")
    fmt.Println(strings.EqualFold("Go", "go")) //大小寫(xiě)忽略

    fmt.Println("")
    fmt.Println(" Fields 函數(shù)的用法")
    fmt.Println("Fields are: %q", strings.Fields(" foo bar baz ")) //["foo" "bar" "baz"] 返回一個(gè)列表

    //相當(dāng)于用函數(shù)做為參數(shù)昔逗,支持匿名函數(shù)
    for _, record := range []string{" aaa*1892*122", "aaataat", "124|939|22"} {
        fmt.Println(strings.FieldsFunc(record, func(ch rune) bool {
                switch {
                case ch > '5':
                    return true
                }
                return false
            }))
    }

    fmt.Println("")
    fmt.Println(" HasPrefix 函數(shù)的用法")
    fmt.Println(strings.HasPrefix("NLT_abc", "NLT")) //前綴是以NLT開(kāi)頭的

    fmt.Println("")
    fmt.Println(" HasSuffix 函數(shù)的用法")
    fmt.Println(strings.HasSuffix("NLT_abc", "abc")) //后綴是以NLT開(kāi)頭的

    fmt.Println("")
    fmt.Println(" Index 函數(shù)的用法")
    fmt.Println(strings.Index("NLT_abc", "abc")) // 返回第一個(gè)匹配字符的位置降传,這里是4
    fmt.Println(strings.Index("NLT_abc", "aaa")) // 在存在返回 -1
    fmt.Println(strings.Index("我是中國(guó)人", "中")) // 在存在返回 6

    fmt.Println("")
    fmt.Println(" IndexAny 函數(shù)的用法")
    fmt.Println(strings.IndexAny("我是中國(guó)人", "中")) // 在存在返回 6
    fmt.Println(strings.IndexAny("我是中國(guó)人", "和")) // 在存在返回 -1

    fmt.Println("")
    fmt.Println(" Index 函數(shù)的用法")
    fmt.Println(strings.IndexRune("NLT_abc", 'b')) // 返回第一個(gè)匹配字符的位置,這里是4
    fmt.Println(strings.IndexRune("NLT_abc", 's')) // 在存在返回 -1
    fmt.Println(strings.IndexRune("我是中國(guó)人", '中')) // 在存在返回 6

    fmt.Println("")
    fmt.Println(" Join 函數(shù)的用法")
    s := []string{"foo", "bar", "baz"}
    fmt.Println(strings.Join(s, ", ")) // 返回字符串:foo, bar, baz

    fmt.Println("")
    fmt.Println(" LastIndex 函數(shù)的用法")
    fmt.Println(strings.LastIndex("go gopher", "go")) // 3

    fmt.Println("")
    fmt.Println(" LastIndexAny 函數(shù)的用法")
    fmt.Println(strings.LastIndexAny("go gopher", "go")) // 4
    fmt.Println(strings.LastIndexAny("我是中國(guó)人", "中")) // 6

    fmt.Println("")
    fmt.Println(" Map 函數(shù)的用法")
    rot13 := func(r rune) rune {
        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..."))

    fmt.Println("")
    fmt.Println(" Repeat 函數(shù)的用法")
    fmt.Println("ba" + strings.Repeat("na", 2)) //banana

    fmt.Println("")
    fmt.Println(" Replace 函數(shù)的用法")
    fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))
    fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))

    fmt.Println("")
    fmt.Println(" Split 函數(shù)的用法")
    fmt.Printf("%qn", strings.Split("a,b,c", ","))
    fmt.Printf("%qn", strings.Split("a man a plan a canal panama", "a "))
    fmt.Printf("%qn", strings.Split(" xyz ", ""))
    fmt.Printf("%qn", strings.Split("", "Bernardo O'Higgins"))

    fmt.Println("")
    fmt.Println(" SplitAfter 函數(shù)的用法")
    fmt.Printf("%qn", strings.SplitAfter("/home/m_ta/src", "/")) //["/" "home/" "m_ta/" "src"]

    fmt.Println("")
    fmt.Println(" SplitAfterN 函數(shù)的用法")
    fmt.Printf("%qn", strings.SplitAfterN("/home/m_ta/src", "/", 2)) //["/" "home/m_ta/src"]
    fmt.Printf("%qn", strings.SplitAfterN("#home#m_ta#src", "#", -1)) //["/" "home/" "m_ta/" "src"]

    fmt.Println("")
    fmt.Println(" SplitN 函數(shù)的用法")
    fmt.Printf("%qn", strings.SplitN("/home/m_ta/src", "/", 1))

    fmt.Printf("%qn", strings.SplitN("/home/m_ta/src", "/", 2)) //["/" "home/" "m_ta/" "src"]
    fmt.Printf("%qn", strings.SplitN("/home/m_ta/src", "/", -1)) //["" "home" "m_ta" "src"]
    fmt.Printf("%qn", strings.SplitN("home,m_ta,src", ",", 2)) //["/" "home/" "m_ta/" "src"]

    fmt.Printf("%qn", strings.SplitN("#home#m_ta#src", "#", -1)) //["/" "home/" "m_ta/" "src"]

    fmt.Println("")
    fmt.Println(" Title 函數(shù)的用法") //這個(gè)函數(shù)勾怒,還真不知道有什么用
    fmt.Println(strings.Title("her royal highness"))

    fmt.Println("")
    fmt.Println(" ToLower 函數(shù)的用法")
    fmt.Println(strings.ToLower("Gopher")) //gopher

    fmt.Println("")
    fmt.Println(" ToLowerSpecial 函數(shù)的用法")

    fmt.Println("")
    fmt.Println(" ToTitle 函數(shù)的用法")
    fmt.Println(strings.ToTitle("loud noises"))
    fmt.Println(strings.ToTitle("loud 中國(guó)"))

    fmt.Println("")
    fmt.Println(" Replace 函數(shù)的用法")
    fmt.Println(strings.Replace("ABAACEDF", "A", "a", 2)) // aBaACEDF
    //第四個(gè)參數(shù)小于0婆排,表示所有的都替換, 可以看下golang的文檔
    fmt.Println(strings.Replace("ABAACEDF", "A", "a", -1)) // aBaaCEDF

    fmt.Println("")
    fmt.Println(" ToUpper 函數(shù)的用法")
    fmt.Println(strings.ToUpper("Gopher")) //GOPHER

    fmt.Println("")
    fmt.Println(" Trim 函數(shù)的用法")
    fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! ")) // ["Achtung"]

    fmt.Println("")
    fmt.Println(" TrimLeft 函數(shù)的用法")
    fmt.Printf("[%q]", strings.TrimLeft(" !!! Achtung !!! ", "! ")) // ["Achtung !!! "]

    fmt.Println("")
    fmt.Println(" TrimSpace 函數(shù)的用法")
    fmt.Println(strings.TrimSpace(" tn a lone gopher ntrn")) // a lone gopher

}

參考鏈接

我是咕咕雞笔链,一個(gè)還在不停學(xué)習(xí)的全棧工程師段只。
熱愛(ài)生活,喜歡跑步鉴扫,家庭是我不斷向前進(jìn)步的動(dòng)力赞枕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炕婶,更是在濱河造成了極大的恐慌姐赡,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柠掂,死亡現(xiàn)場(chǎng)離奇詭異项滑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涯贞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)枪狂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宋渔,你說(shuō)我怎么就攤上這事州疾。” “怎么了皇拣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵严蓖,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我审磁,道長(zhǎng)谈飒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任态蒂,我火速辦了婚禮,結(jié)果婚禮上费什,老公的妹妹穿的比我還像新娘钾恢。我一直安慰自己,他們只是感情好鸳址,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布瘩蚪。 她就那樣靜靜地躺著,像睡著了一般稿黍。 火紅的嫁衣襯著肌膚如雪疹瘦。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,043評(píng)論 1 291
  • 那天巡球,我揣著相機(jī)與錄音言沐,去河邊找鬼。 笑死酣栈,一個(gè)胖子當(dāng)著我的面吹牛险胰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矿筝,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼起便,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起榆综,我...
    開(kāi)封第一講書(shū)人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妙痹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鼻疮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體细诸,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年陋守,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了震贵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡水评,死狀恐怖猩系,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情中燥,我是刑警寧澤寇甸,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站疗涉,受9級(jí)特大地震影響拿霉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咱扣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一绽淘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闹伪,春花似錦沪铭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厅克,卻和暖如春赔退,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背证舟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工硕旗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褪储。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓卵渴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鲤竹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浪读,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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