go 字元串

前言

  • 不做文字的搬運工,多做靈感性記錄
  • 這是平時學習總結的地方,用做知識庫
  • 平時看到其他文章的相關知識,也會增加到這裡
  • 隨著學習深入,會進行知識拆分和匯總,所以文章會隨時更新
  • 參考的文章過多、很雜很亂,所以參考會寫不全,見諒

字元串

  • 字元串就是一串固定長度的字元連接起來的字元序列。
  • Go的字元串是由單個位元組連接起來的,是位元組的定長數組
  • 字元串可以包含任意的數據,但是通常是用來包含可讀的文本,
  • Go語言的字元串的位元組使用UTF-8編碼標識Unicode文本
  • 字元串一旦賦值,就不可修改,go中字元串是不可變的

1.聲明/賦值

  • 字元串字面量
    • 使用雙引號寫字元串的方式
參照變數的聲明/賦值/初始化

//單行
	// 雙引號 "  "  括起來就行 ,會識別轉義字元  
	// 雙引號字面量不能換行
 a  = "小明"   -->被稱為字元串字面量string literal

    //單引號(' '):以字元串的原生形式輸出,包括換行和特殊字元,可以實現防止攻擊、輸出源程式碼等效果
 b := 'c' 

//多行
	//反引號(``) 
// 1. 換行將被作為字元串中的換行,但是所有的轉義字元均無效,文本將會原樣輸出。(以字元串的原生形式輸出,可以實現防止攻擊、輸出源碼等效果)
// 2. 多行字元串一般用於內嵌源碼和內嵌數據等
	 const str =`第一行
             	 第二行
		   	    第三行`
// 字元串太長,可以使用 + ,把字元串拆分開,進行分行拼接

2.遍歷

  1. 獲取字元串的內容——->標準索引法

      str [ i ]            
    // [ ]內寫索引,索引從0開始,
    // 此轉換方案只對ASCII碼的字元串有效
    // 注意:獲取字元串中某個位元組的地址屬於非法行為,例如 &str[i]。
    
  2. 直接使用下標

ASCII 字元串遍歷---------> (這種中文使用會出現亂碼 )

theme := "狙擊 start"
for i := 0, i < len(theme), i++ {
    fmt.Printf("ascii: %c  %d\n", theme[i], theme[i])
}
  1. Unicode字元串遍歷————>for range
theme := "狙擊 start"
for _, s := range theme {
    fmt.Printf("Unicode: %c  %d\n", s, s)
}

3.操作

1.截取

字元串中的某一段成為    子串
使用string包中的函數


    strings.Index:正向搜索子字元串。
    strings.LastIndex:反向搜索子字元串。
    搜索的起始位置可以通過切片偏移製作。

2.修改

  • 字元串是值類型(不可更改的位元組序列),且值不可變,就是字元串一旦賦值了,字元串就不能修改了,是不可變的

  • 字元串無法被直接修改,只能通過構造新的字元串並賦值給原來的字元串

// 字元串轉化為[]byte進行修改,然後再轉回來
// []byte和string可以通過強制類型進行互換 

// 無法直接修改每一個字元元素,只能通過重新構造新的字元串並賦值給原來的字元串變數實現
// 修改字元串時,可以將字元串轉換為 []byte() 進行修改,
// []byte 和 string 可以通過強制類型轉換互轉。
str := "hello"
str1 := []byte(str)  // 字元串轉為切片
對切片進行操作
str = string(str1) // 切片轉為字元串。這裡就完成了對字元串的修改,相當於重新創建了一個字元串

3.連接

1. 直接使用  +  或者 += 
2. byte.Buffer   (使用string包)
	hammer := "吃我一錘"
    sickle := "死吧"
// 聲明位元組緩衝
// bytes.Buffer 是可以緩衝並可以往裡面寫入各種位元組數組的
    var stringBuilder bytes.Buffer
 // 把字元串寫入緩衝 . 字元串也是一種位元組數組,使用 WriteString() 方法進行寫入
    stringBuilder.WriteString(hammer)
    stringBuilder.WriteString(sickle)
 // 將緩衝以字元串形式輸出
    fmt.Println(stringBuilder.String())

將需要連接的字元串,通過調用 WriteString() 方法,寫入 stringBuilder 中,然後再通過 stringBuilder.String() 方法將緩衝轉換為字元串。

4.比較

1. 一般的比較運算符(==、!=、<、<=、>=、>)是通過在記憶體中按位元組比較來實現字元串比較的,因此比較的結果是字元串自然編碼的順序。

5.查長

// 統計 ASCII 字元數量。
// 函數的返回值的類型為 int,表示字元串的 ASCII 字元個數或位元組長度。
	len() 


// 統計 Uncode 字元數量。
// UTF-8 格式保存,每個中文佔用 3 個位元組
 	RuneCountInString()

6.格式化輸出

參見 fmt 包的 佔位符
  fmt Println("格式化樣式",參數列表)
	格式化樣式:字元串的形式,格式化動詞 % 開頭 : %s
	參數列表  :多個參數以逗號分開。 參數就是   :tring name

4.字元串優勢

  • 天生執行緒安全,大家使用的都是只讀對象,無須加鎖;
  • 方便記憶體共享,而不必使用寫時複製(Copy On Write)等技術;
  • 字元串 hash 值也只需要製作一份。

跳轉