go 字串

shuleisun發表於2020-08-11

前言

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

字串

  • 字串就是一串固定長度的字元連線起來的字元序列。
  • 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 值也只需要製作一份。

跳轉

相關文章