<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Golang基礎筆記二之字符串及其操作

      本文首發于公眾號:Hunter后端

      原文鏈接:Golang基礎筆記二之字符串及其操作

      這一篇筆記主要介紹 Golang 字符串相關處理,以下是本篇筆記目錄:

      1. 字符串的定義和初始化
      2. 字符
      3. 字符串操作

      1、字符串的定義和初始化

      在 Go 里,我們可以使用雙引號和反引號來對定義字符串。

      1. 雙引號

      雙引號用于創建解釋型字符串字面量,這種字符串是支持轉義字符的,比如我們在字符串中夾帶換行符 \n,這樣在輸出的時候,會自動進行換行:

          s := "this is a test\nthis is another test"
          fmt.Print(s)
          // this is a test
          // this is another test
      

      2. 反引號

      反引號用于創建原生字符串字面量,這種字符串中,所有字符都會按原樣輸出,轉移字符不會被解釋:

          s := `this is a test\nthis is another test`
          fmt.Print(s)
          // this is a test\nthis is another test
      

      2、字符

      字符串是由一個個字符組合而成的,前面介紹過,Go 里字符有兩種類型 byte 和 rune,但他們實際上分別是 uint8 和 int32 的別名,分別用于表示 ASCII 字符和 Unicode 字符。

      每一個 byte 字符用一個字節(8位)來表示,每一個 rune 字符用 1-4 個字節來表示,如果我們想統計一個字符串的長度,首先需要判斷我們是想統計其字節長度,還是字符長度。

      因為對于一個字符串來說,如果字符串中包含了類似中文這種一個字符包含多個字節的字符,其字節長度和字符長度是不一樣的,比如對于下面的字符串:

      s := "hello世界"
      

      對于前面的 hello 來說,一個字符就包含一個字節,所以它的字符長度是 5,字節長度也是 5。

      而對于后面的 世界 來說,一個字符包含三個字節,所以它的字符長度是 2,但是字節長度是 2 * 3 = 6。

      所以這個字符串的字節長度和字符串長度分別如下:

      	s := "hello世界"
      	fmt.Println("s 的字節長度為:", len(s))  // 11
      	fmt.Println("s 的字符串長度為:", len([]rune(s)))  // 7
      

      在統計字符串長度的時候,我們先將其轉為了 rune 類型的切片,然后再統計的其長度。

      3、字符串操作

      1. 字符串拼接

      字符串的拼接可以用兩種方式,一種是使用 +,一種是使用 strings.Builder

      1) +運算符
          s1 := "hello"
          s2 := " world"
      
          s3 := s1 + s2
          fmt.Println(s3)
      
      2) strings.Builder
      import (
          "strings"
          "fmt"
      )
      
      func main() {
          var builder strings.Builder
          builder.WriteString("hello")
          builder.WriteString(" world")
          s := builder.String()
          fmt.Println(s)
      }
      
      

      +運算符和 strings.Builder 都可以用于拼接字符串,但是在 Go 語言里,字符串屬于不可變類型,每次使用 + 運算符拼接字符串時,都會創建一個新的字符串對象。

      如果頻繁拼接大量字符串,會產生大量的內存分配和數據復制操作,導致性能較低。

      strings.Builder 內部維護了一個字節切片,在拼接字符串時,會先將字符串追加到這個字節切片中,最后再將字節切片轉換為字符串。這樣可以減少內存分配和數據復制的次數,性能更高。

      2. 字符串的訪問

      如果想訪問字符串中的單個字符,可以使用下標來操作:

          s := "hello"
          fmt.Println(s[4]) // 111
      

      我們可以對其進行格式化,使用 %c 來打?。?/p>

      fmt.Printf("%c\n", s[4]) // o
      

      前面介紹字符串長度的時候,字符串是由字符組成的,但是因為這里測試字符串是全英文的,所以訪問到的這個字符就是它的字節內容。

      如果字符串包含中文,使用 len() 函數獲取到的長度實際上是它的字節長度。

      比如下面這個例子,我們訪問到的就是字符串對應下標的字節內容,而不是對應的字符了:

          s := "hello世界"
          fmt.Println(s[5])  // 228
          fmt.Printf("%c\n", s[5]) // ?
      

      若要按字符訪問帶中文的字符串,可以將字符串轉換為 []rune 類型,因為 rune 類型可以表示一個 Unicode 字符:

          s := "hello世界"
          fmt.Printf("%c\n", []rune(s)[5])  // 世
          fmt.Printf("%c\n", []rune(s)[6])  // 界
      
      遍歷訪問字符串

      如果要遍歷訪問字符串,可以按照前面的操作先將其轉為 rune 切片,然后再遍歷訪問 rune 切片:

          s := "hello世界"
      
          runes := []rune(s)
          for _, c := range runes {
              fmt.Printf("%c\n", c)
          }
      

      還可以使用 for...range 循環,它可以按字符迭代字符串,會自動處理 UTF-8 編碼的多字節字符:

          s := "hello世界"
      
          for _, char := range s {
              fmt.Printf("%c\n", char)
          }
      

      3. 字符串查找

      我們可以引入 strings 模塊使用 strings.Index() 來查找指定字符串,返回的是該字符串的字節索引,如果沒有找到,則返回 -1。

          s := "hello世界"
          index := strings.Index(s, "界")
          fmt.Println(index) // 8
          index2 := strings.Index(s, "好")
          fmt.Println(index2) // -1
      

      4. 字符串替換

      我們可以使用 strings.Replace() 來替換字符串。

          str := "hello世界"
          s2 := strings.Replace(str, "l", "x", 1)
          fmt.Println(s2)
      

      在上面的操作中,表示將字符串 str 中的 l 字符串替換為 x,并且只替換第一個 l

      如果需要替換多個,則可以將后面的數字 1 改成指定個數。

      如果想要將字符串中指定字符串全部替換,可以將最后一個參數設置為 -1。

      也可以使用 strings.ReplaceAll() 來替換字符串:

          str := "hello世界"
          s2 := strings.Replace(str, "l", "x", -1)
          fmt.Println(s2)
          s3 := strings.ReplaceAll(str, "l", "x")
          fmt.Println(s3)
      

      5. 字符串分割

      我們可以使用 strings.Split() 來進行字符串分割:

          s := "hello,世界,我來了"
          parts := strings.Split(s, ",")
          fmt.Println(parts)
      

      返回的 parts 就是一個字符串切片。

      還可以使用 strings.SplitN() 對其進行指定長度的切割,比如只需要將其切割成兩部分:

          s := "hello,world"
          parts := strings.SplitN(s, "o", 2)
          fmt.Println(parts, len(parts)) // [hell ,world] 2
      

      注意:這里的參數 2 指的是最終切割后生成的切片長度,如果 n 超過字符串可以切割的長度,則會根據指定字符串其全部切割并返回結果。

      所以如果 n 參數為 1,則不會切割,返回原始結果,如果 n 參數為 0,則會返回 nil,如果 n 是負數,則會全部切割。

      6. 字符串是否以字符串開頭或結尾

      strings.HasPrefix() 表示是否是以某字符串開頭,返回 bool 型結果。

      strings.HasSuffix() 表示是否是以某字符串結尾,返回 bool 型結果。

          s := "世界hello,world"
          result := strings.HasPrefix(s, "世界")
          fmt.Println(result)
          result2 := strings.HasSuffix(s, "world")
          fmt.Println(result2)
      

      7. 是否包含某字符串

      strings.Contains() 用于判斷字符串是否包含某個特定字符串,返回結果為布爾型。

          s := "hello, world"
          isContain := strings.Contains(s, "world")
          fmt.Println(isContain)
      

      8. 字符串統計包含子字符串個數

      strings.Count() 用于統計字符串中包含某個特定字符串的個數。

          s := "hello, world"
          l_count := strings.Count(s, "l")
          fmt.Println(l_count)
      

      9. 轉大小寫

      strings.ToUpper() 表示將字符串轉為大寫

      strings.ToLower() 表示將字符串轉為小寫

          s := "hello, world"
          upperS := strings.ToUpper(s)
          fmt.Println(upperS)
      
          lowerS := strings.ToLower(s)
          fmt.Println(lowerS)
      

      10. 去除首尾指定字符串

      strings.Trim() 去除字符串左右兩邊指定的字符串

      strings.TrimLeft() 去除字符串左邊指定的字符串

      strings.TrimRight() 去除字符串右邊指定的字符串

          s := "ihello, worldi"
          result := strings.Trim(s, "i")
          fmt.Println(result)  // hello, world
      
          result = strings.TrimLeft(s, "i")
          fmt.Println(result)  // hello, worldi
      
          result = strings.TrimRight(s, "i")
          fmt.Println(result)  // ihello, world
      

      如果想獲取更多相關文章,可掃碼關注閱讀:
      image

      posted @ 2025-06-20 22:06  XHunter  閱讀(516)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 网友自拍视频一区二区三区| 成人国产精品中文字幕| 免费观看全黄做爰大片| 亚洲一区二区中文av| 少妇性bbb搡bbb爽爽爽欧美| AV区无码字幕中文色| 苏尼特右旗| 亚洲精品久久一区二区三区四区| 亚洲成年轻人电影网站WWW| 夜夜躁狠狠躁日日躁| 蜜臀av入口一区二区三区| 亚洲最大成人在线播放| 亚洲中文字幕精品久久| 大肉大捧一进一出好爽视频mba| 国产精品视频不卡一区二区| 亚洲情综合五月天| XXXXXHD亚洲日本HD| 国产av一区二区久久蜜臀| 亚洲av无一区二区三区| 1024你懂的国产精品| 亚洲V天堂V手机在线| 国产成人精品久久一区二| 久久精品一区二区东京热| 99精品国产中文字幕| 成人免费无码大片a毛片| 欧美喷水抽搐magnet| 国产精品亚洲二区在线看| 国产地址二永久伊甸园| 亚洲熟妇自偷自拍另类| 婷婷久久香蕉五月综合加勒比 | 久久人妻精品国产| 中国女人内谢69xxxx| 新久久国产色av免费看| 久久久久久毛片免费播放| 色翁荡息又大又硬又粗又视频图片| 不卡乱辈伦在线看中文字幕| 亚洲国产成人极品综合| 99精品国产一区二区三区不卡| 亚洲中文在线精品国产| 国产专区一va亚洲v天堂| 国产成人无码免费视频在线|