老虞學GoLang筆記-字串

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

在所有程式設計語言中都涉及到大量的字串操作,可見熟悉對字串的操作是何等重要。 Go中的字串和C#中的一樣,字串內容在初始化後不可修改。 需要注意的是在Go中字串是有UTF-8編碼的,請注意儲存檔案時將檔案編碼格式改成UTF-8(特別是在windows下)。

初始化

var str string //聲明一個字串str = "laoYu"  //賦值ch :=str[0]    //擷取第一個字元len :=len(str) //字串的長度,len是內建函數 ,len=5

字串操作

編碼過程中避免不了中文字元,那我們該如何提取一個中文呢?首先我們要知道string[index]擷取的是字元byte,就無法像C#中"老虞"[0]來取到‘老’,在Go中需要將字串轉換成rune數組,runne數組中就可以通過數組下標擷取一個漢字所標識的Unicode碼,再將Unicode碼按建立成字串即可。

查看範例程式碼

str :="laoYu老虞"for  i:=0;i<len(str);i++ {         fmt.Println(str[i])}for  i,s :=  range str {        fmt.Println(i,"Unicode(",s,") string=",string(s))}r := []rune(str)fmt.Println("rune=",r)for i:=0;i<len(r) ; i++ {       fmt.Println("r[",i,"]=",r[i],"string=",string(r[i]))}Outut:10897111891172321281292321531580 Unicode( 108 ) string= l1 Unicode( 97 ) string= a2 Unicode( 111 ) string= o3 Unicode( 89 ) string= Y4 Unicode( 117 ) string= u5 Unicode( 32769 ) string= 老8 Unicode( 34398 ) string= 虞rune= [108 97 111 89 117 32769 34398]r[ 0 ]= 108 string= lr[ 1 ]= 97 string= ar[ 2 ]= 111 string= or[ 3 ]= 89 string= Yr[ 4 ]= 117 string= ur[ 5 ]= 32769 string= 老r[ 6 ]= 34398 string= 虞

對字串的操作非常重要,來瞭解下strings包中提供了哪些函數

擷取總位元組數 func Len(v type) int

len函數是Go中內建函數,不引入strings包即可使用。len(string)返回的是字串的位元組數。len函數所支援的入參類型如下:

  • len(Array) 數組的元素個數
  • len(*Array) 數組指標中的元素個數,如果入參為nil則返回0
  • len(Slice) 數組切片中元素個數,如果入參為nil則返回0
  • len(map) 字典中元素個數,如果入參為nil則返回0
  • len(Channel) Channel buffer隊列中元素個數

查看範例程式碼

str :="laoYu老虞"str2 :="laoYu"fmt.Println("len(",str,")=",len(str))      //len=11=5+6,一個漢字在UTF-8>中佔3個位元組fmt.Println("len(",str2,")=",len(str2))    //len=5fmt.Println("str[0]=",str[0])              //lstr :="str"arr :=[5]int{1,2,3}slice :=make([]int,5)m :=make(map[int] string)m[2]="len"ch :=make(chan int)fmt.Println("len(string)=",len(str))   //3fmt.Println("len(array)=",len(arr))     //5invalid argument user (type *UserInfo) for lenfmt.Println("len(slice)=",len(slice))   //5fmt.Println("len(map)=",len(m))         //1fmt.Println("len(chat)=",len(ch))       //0//user :=&UserInfo{id:1,name:"laoYu"}//interger :=2//fmt.Println("len(my struct)=",len(user))//invalid argument user (type *UserInfo) for len//fmt.Println("len(interger)=",len(interger))var str2 stringvar arr2  [5]intvar slice2  []intvar  m2 map[int] stringvar  ch2 chan intfmt.Println("len(string)=",len(str2))    //0fmt.Println("len(array)=",len(arr2))     //5 fmt.Println("len(slice)=",len(slice2))   //0fmt.Println("len(map)=",len(m2))         //0fmt.Println("len(chat)=",len(ch2))       //0

字串中是否包含某字串 func Contains(s, substr string) bool

確定是否包含某字串,這是區分大小寫。實際上內部是通過Index(s,sub string) int 實現的。如果索引!=-1則表示包含該字串。Null 字元串""在任何字串中均存在。

原始碼

// Contains returns true if substr is within s.func Contains(s, substr string) bool {     return Index(s, substr) != -1}

**樣本,使用請需匯入包:' import "strings" ' **

查看範例程式碼

str :="laoYuStudyGotrue是否包含某字串"fmt.Println(strings.Contains(str,"go"))         //falsefmt.Println(strings.Contains(str,"Go"))         //truefmt.Println(strings.Contains(str,"laoyu"))      //falsefmt.Println(strings.Contains(str,"是"))         //true    fmt.Println(strings.Contains(str,""))               //true

在實際工作中常需要在不區分大小寫情況下確認是否包含某字串,(我們應該減少這種情況,以免每次驗證時都需要進行一次大小寫轉換)。 這裡我局部修改原始碼提供一個驗證字串中是否包含某字串的函數,當然你也可以直接使用strings.Contains(strings.ToLower(s),strings.ToLower(substr))

str := "laoYuStudyGotrue是否包含某字串"fmt.Println(Contains(str, "go", true))  //truefmt.Println(Contains(str,"go",false))   //false
    //在字串s中是否包含字串substr,ignoreCase表示是否忽略大小寫    func Contains(s string, substr string, ignoreCase bool) bool {            return Index(s, substr, ignoreCase) != -1    }    //字串subst在字串s中的索引位置,ignoreCase表示是否忽略大小寫    func Index(s string, sep string, ignoreCase bool) int {            n := len(sep)            if n == 0 {                    return 0            }            //to Lower            if ignoreCase == true {                    s = strings.ToLower(s)                    sep = strings.ToLower(sep)            }            c := sep[0]            if n == 1 {                    // special case worth making fast                    for i := 0; i < len(s); i++ {                            if s[i] == c {                                    return i                            }                    }                    return -1            }            // n > 1            for i := 0; i+n <= len(s); i++ {                    if s[i] == c && s[i:i+n] == sep {                            return i                    }            }            return -1    }

擷取字串sep在字串s中出現的次數 Count(s,sep string)

注意:如果sep="",則無論s為何字串都會返回 len(s)+1

查看範例程式碼

fmt.Println(strings.Count("laoYuStudyGo", "o"))                 //2fmt.Println(strings.Count("laoYuStudyGo", "O"))                 //0fmt.Println(strings.Count("laoYuStudyGo", ""))                  //13=12+1fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "虞"))  //1fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "Go"))  //2fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "老虞"))//1fmt.Println(strings.Count("", ""))                             //1=0+1fmt.Println(strings.Count("aaaaaaaa","aa"))                     //4fmt.Println(strings.Count("laoYuStudyGo_n","\n"))               //0

**使用(多個)空格分割字串 Fields(s string) ,返回分割後的數組 **

將字串分割成數組,其分割符為空白格。

查看範例程式碼

fmt.Println(strings.Fields("lao Yu Study Go ")) //OutPut: [lao Yu Study Go]fmt.Println(strings.Fields("   Go    "))        //[Go]fmt.Println(strings.Fields(""))                 //[]fmt.Println(strings.Fields(" \n go"))           //[go]

**其實其內部實現調用的是FieldsFunc(s,unicode.IsSpace),我們也可以自訂分割方式 **

canSplit := func (c rune)  bool { return c=='#'}fmt.Println(strings.FieldsFunc("lao###Yu#Study####Go#G ",canSplit)) //[lao Yu Study Go G<space>]

檢查字串是否已某字串開頭 HasPrefix(s,prefix string) bool

如果想查看更多關於strings包下的字串操作函數,請查看

  • 官方strings包地址
  • 對應的函數翻譯地址
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.