字串
字符集用來做什么
- 字符集是為每個字符分配一個唯一的ID
- 在同一個字符集內,字符的ID是唯一的,不同字符集ID可能是不同的
UTF-8是編碼規則或者說是Unicode的一種實作
- UTF-8將Unicode中的字符ID以某種方式進行編碼
- 變長的編碼規則: 1-4位元組,具體規則:
- 0xxxx表示0~127代表ascii
- Go語言中的字串內部實作編碼是UTF-8的,默認是rune型別
字串是什么?
定義字串 雙引號和反引號
golang中單引號,雙引號代表的含義
var ch = 'a'代表utf8編碼的avar ch byte = 'a'代表ascii碼編碼的a- 單引號在golang中表示一個字符
// 單引號只能創建字符,根據ascii編碼
package main
import "fmt"
func main() {
var a = 'a'
fmt.Println(a)
}
// 結果 97
- 雙引號在golang中表示創建字串
package main
import "fmt"
func main() {
var a = "Wyc"
fmt.Println(a)
}
// 結果 Wyc
- 反引號
- 不支持轉義
- 支持換行
- 主要用來創建原生字串
- 復雜的json
- promql
package main
import "fmt"
func main() {
json_str := `
{"id": 1, "name": "wWyc"}
`
fmt.Println(json_str)
}
計算字串長度
- len() 函式只能表示字串 ASCII字符的個數或位元組的長度
- 如何真實列印字符的個數
- 使用庫 utf.RuneCountInString
- 查看字串長度 utf8.RuneCountInString
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
name := "Wyc"
//name1 := "Hello World"
//name2 := "test 測驗"
fmt.Printf("%v, %d, %d", name, len(name), utf8.RuneCountInString(name))
}
// len 列印出來的是ascii字符的個數
// utf8.RuneCountInString 列印出來的是字串的長度
字串遍歷
- 如果是ASCII字符,直接使用下標遍歷
- 如果是unicode字符,使用 for range
- 字串遍歷, range, len
package main
import "fmt"
func main() {
name2 := "test 測驗"
// 下標遍歷 中文列印會列印出亂碼
for i := 0; i<len(name2); i++ {
fmt.Printf("%c- %d\n", name2[i], name2[2])
}
// range 遍歷 會把所有的列印出來
for _,i := range name2{
fmt.Printf("%c-%d\n", i, i)
}
}
字串拼接, 拼接符 +
- 支持換行, +拼接
package main
import "fmt"
func main() {
url := "https://"
urlPath := "localhost:8080"
result := url + urlPath
fmt.Println(result)
}
字串修改: 通過[]byte和string轉換 創建新的字串達到
- 字串是不可修改的, 強制轉換可以修改,其實不是修改是重新創建了一塊記憶體重新創建了一個新的變數
// 修改字串8080 改成8081
package main
import "fmt"
func main() {
url := "https://"
urlPath := "localhost:8080"
// 字串拼接
result := url + urlPath
fmt.Println(result)
// 將字串強制換換成byte
sByte := []byte(result)
fmt.Println(sByte)
// 取出byte最后一個元素
fmt.Println(len(sByte) - 1)
// 取出byte最后一個元素強制賦值
sByte[len(sByte)-1] = '1'
s3 := string(sByte)
fmt.Println(s3)
}
/*
結果
https://localhost:8080
[104 116 116 112 115 58 47 47 108 111 99 97 108 104 111 115 116 58 56 48 56 48]
21
https://localhost:8081
*/
string包
- 判斷是否存在某個字符或者字串
package main
import (
"fmt"
"strings"
)
func main() {
url := "https://"
urlPath := "localhost:8080你好"
// 字串拼接
result := url + urlPath
// 查找子串
fmt.Println(strings.Contains(result, "8080"))
// 查看任意字符是否包含, 如果包含就為true
fmt.Println(strings.ContainsAny(result, "80 80"))
// 查看是否包含rune型別字串
fmt.Println(strings.ContainsRune("你好", '測'))
}
/*
結果
true
true
false
*/
字串分割(切分)
- strings.Split() 按照條件驚醒分割
- strings.SplitN() 結果切片的長度為n,沒切完就不切了
- stings.SplitAfter() 保留sep
package main
import (
"fmt"
"strings"
)
func main() {
s1 := "localhost:8080你好"
s2 := "inf.bigdata.kafka"
s3 := "localhost:8080/v1/app/login"
split_s1 := strings.Split(s1, ":")
split_s2 := strings.SplitN(s3, "/", 2)
split_s3 := strings.SplitAfter(s2, ".")
fmt.Println(split_s1)
fmt.Println(split_s2)
fmt.Println(split_s3)
}
/*
結果
[localhost 8080你好]
[localhost:8080 v1/app/login]
[inf. bigdata. kafka]
*/
字串是否有某個前綴或后綴匹配
package main
import (
"fmt"
"strings"
)
func main() {
s1 := "localhost:8080你好"
fmt.Println(strings.HasPrefix(s1, "lo"))
fmt.Println(strings.HasSuffix(s1, "你好"))
}
字串格式化 fmt.Sprintf
- %c 單一欄位
- %T 查看型別
- %v 值查看
- %+v 欄位名+值列印
- %d 十進制列印數字
- %p 指標,十六進制
- %f 浮點數
- %b 二進制
- %s string
package main
import (
"fmt"
"time"
)
func main() {
want := `
[報警觸發型別: %s]
[報警名稱:%s]
[報警次數: %d]
[報警運算式: %s]
[報警時間: %s]
`
newWant := fmt.Sprintf(want,
"微信支付介面預警",
"支付失敗",
4,
`sum(reta(user_pay[1m])) > 100`,
// 2006-01-02 15:04:05 這個是固定的不可修改,修改之后時間獲取錯誤
time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05"),
)
fmt.Println(newWant)
/*
fmt.Sprintf
*/
}
/*
結果
[報警觸發型別: 微信支付介面預警]
[報警名稱:支付失敗]
[報警次數: 4]
[報警運算式: sum(reta(user_pay[1m])) > 100]
[報警時間: 2023-02-24 211:2411:2411]
*/
字串修剪
package main
import (
"fmt"
"strings"
)
func main() {
str := "@@@@ABCDTESTHELLOWORLD@WYC@"
fmt.Println(strings.Trim(str, "@")) // 去除兩邊符號
fmt.Println(strings.TrimRight(str, "@"))
fmt.Println(strings.TrimLeft(str, "@"))
fmt.Println(strings.ToLower(str)) // 變小寫
fmt.Println(strings.ToUpper(str)) // 變大寫
fmt.Println(strings.TrimPrefix("tetetete", "te")) // 去除指定字符
}
字串join
package main
import (
"fmt"
"strings"
)
func main() {
base := "https://www.baidu.com/v1?"
args := strings.Join([]string{"name=Wyc", "age=20"}, "&")
arg := base+args
fmt.Println(arg)
}
/*
結果
https://www.baidu.com/v1?name=Wyc&age=20
*/
字串拼接優化
- Benchmark
使用string.builder 用于拼接字串
package main
import (
"fmt"
"strings"
)
func main() {
ss := []string{
"A",
"B",
"C",
"D",
}
var b strings.Builder
for _,s:=range ss{
b.WriteString(s)
}
fmt.Println(b.String())
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544937.html
標籤:其他
下一篇:位操作運算
