前言
- 不做文字的搬運工,多做靈感性記錄
- 這是平時學習總結的地方,用做知識庫
- 平時看到其他文章的相關知識,也會增加到這裡
- 隨著學習深入,會進行知識拆分和彙總,所以文章會隨時更新
- 參考的文章過多、很雜很亂,所以參考會寫不全,見諒
字串
- 字串就是一串固定長度的字元連線起來的字元序列。
- Go的字串是由單個位元組連線起來的,是位元組的定長陣列
- 字串可以包含任意的資料,但是通常是用來包含可讀的文字,
- Go語言的字串的位元組使用UTF-8編碼標識Unicode文字
- 字串一旦賦值,就不可修改,go中字串是不可變的
1.宣告/賦值
- 字串字面量
- 使用雙引號寫字串的方式
參照變數的宣告/賦值/初始化
//單行
// 雙引號 " " 括起來就行 ,會識別轉義字元
// 雙引號字面量不能換行
a = "小明" -->被稱為字串字面量string literal
//單引號(' '):以字串的原生形式輸出,包括換行和特殊字元,可以實現防止攻擊、輸出原始碼等效果
b := 'c'
//多行
//反引號(``)
// 1. 換行將被作為字串中的換行,但是所有的轉義字元均無效,文字將會原樣輸出。(以字串的原生形式輸出,可以實現防止攻擊、輸出原始碼等效果)
// 2. 多行字串一般用於內嵌原始碼和內嵌資料等
const str =`第一行
第二行
第三行`
// 字串太長,可以使用 + ,把字串拆分開,進行分行拼接
2.遍歷
-
獲取字串的內容------->標準索引法
str [ i ] // [ ]內寫索引,索引從0開始, // 此轉換方案只對ASCII碼的字串有效 // 注意:獲取字串中某個位元組的地址屬於非法行為,例如 &str[i]。
-
直接使用下標
ASCII 字串遍歷---------> (這種中文使用會出現亂碼 )
theme := "狙擊 start"
for i := 0, i < len(theme), i++ {
fmt.Printf("ascii: %c %d\n", theme[i], theme[i])
}
- 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 值也只需要製作一份。