字串
參照變數的宣告/賦值/初始化
//單行
// 雙引號 " " 括起來就行 ,會識別跳脫字元
// 雙引號字面量不能換行
a = "小明" -->被稱爲字串字面量string literal
//單引號(' '):以字串的原生形式輸出,包括換行和特殊字元,可以實現防止攻擊、輸出原始碼等效果
b := 'c'
//多行
//反引號(``)
// 1. 換行將被作爲字串中的換行,但是所有的跳脫字元均無效,文字將會原樣輸出。(以字串的原生形式輸出,可以實現防止攻擊、輸出原始碼等效果)
// 2. 多行字串一般用於內嵌原始碼和內嵌數據等
const str =`第一行
第二行
第三行`
// 字串太長,可以使用 + ,把字串拆分開,進行分行拼接
獲取字串的內容------->標準索引法
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])
}
theme := "狙擊 start"
for _, s := range theme {
fmt.Printf("Unicode: %c %d\n", s, s)
}
字串中的某一段成爲 子串
使用string包中的函數
strings.Index:正向搜尋子字串。
strings.LastIndex:反向搜尋子字串。
搜尋的起始位置可以通過切片偏移製作。
字串是值型別(不可更改的位元組序列),且值不可變,就是字串一旦賦值了,字串就不能修改了,是不可變的
字串無法被直接修改,只能通過構造新的字串並賦值給原來的字串
// 字串轉化爲[]byte進行修改,然後再轉回來
// []byte和string可以通過強制型別進行互換
// 無法直接修改每一個字元元素,只能通過重新構造新的字串並賦值給原來的字串變數實現
// 修改字串時,可以將字串轉換爲 []byte() 進行修改,
// []byte 和 string 可以通過強制型別轉換互轉。
str := "hello"
str1 := []byte(str) // 字串轉爲切片
對切片進行操作
str = string(str1) // 切片轉爲字串。這裏就完成了對字串的修改,相當於重新建立了一個字串
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() 方法將緩衝轉換爲字串。
1. 一般的比較運算子(==、!=、<、<=、>=、>)是通過在記憶體中按位元組比較來實現字串比較的,因此比較的結果是字串自然編碼的順序。
// 統計 ASCII 字元數量。
// 函數的返回值的型別爲 int,表示字串的 ASCII 字元個數或位元組長度。
len()
// 統計 Uncode 字元數量。
// UTF-8 格式儲存,每個中文佔用 3 個位元組
RuneCountInString()
參見 fmt 包的 佔位符
fmt Println("格式化樣式",參數列表)
格式化樣式:字串的形式,格式化動詞 % 開頭 : %s
參數列表 :多個參數以逗號分開。 參數就是 :tring name