Go 開發常用操作技巧 -- 字符串
Go 語言字符串的字節使用的是 UTF-8 編碼,是一種變長的編碼方式。使用 1~4 個字節表示一個符號,根據不同的符號而變化字節長度。
含中文字符串截取
- 字符串的長度
我們可以使用 len()
函數來獲取字符串的長度,英文爲 1 個字節長度,中文爲 3 個字節長度。可以使用 變量[n]
的方式來獲取第 n+1 個字節,返回的是對應的 Unicode 值。其中 n 的範圍是 [0,len(n)-1]。
由於中文一個字是由多個字節組成,所以直接通過上面切片的方式獲取可能會把一箇中文字的編碼截成兩半,導致亂碼。解決辦法是先將其轉爲 []rune
類型,然後截取,再轉爲字符串類型。
示例:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "go 語言測試字符串"
fmt.Println(len(str)) //打印字節長度
fmt.Println(utf8.RuneCountInString(str)) //打印字符串長度
str1 := str[0:5] //獲取字符串前6個字符
fmt.Println(str1)
strRune := []rune(str) //字符串轉爲 []rune類型
fmt.Println(len(strRune)) //轉後的長度
fmt.Println(string(strRune[0:5])) //獲取字符串前6個字符
}
結果:
生成隨機字符串
math/rand 包可以生成整型與浮點型僞隨機數。
簡單示例:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano()) // 取納秒時間戳,可以保證每次的隨機數種子都不同
fmt.Println(rand.Int())
fmt.Println(rand.Int31())
fmt.Println(rand.Intn(5))
}
自定義生成 Rand 結構體,設置隨機數種子, 本質上與 Rand 提供好的結構體沒有太大區別:
-
func NewSource(seed int64) Source
-
使用給定的種子創建一個僞隨機資源。
-
func New(src Source) *Rand
-
返回一個使用 src 生產的隨機數來生成其他各種分佈的隨機數值的 * Rand
示例:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
randlen := 5 //設定隨機串長度
str := "0123456789abcdefghijklmnopqrstuvwxyz"
bytes := []byte(str) //轉成數組
result := []byte{}
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for i :=0;i < randlen;i++{
result = append(result,bytes[r.Intn(len(str))])
}
fmt.Println(string(result))
}
大小寫
Go 中的 strings 包提供的 ToUpper()/ToLower() 函數,可以將字符串轉換成大 / 小寫。
package main
import (
"fmt"
"strings"
)
var orig = "How Are You"
var lower string
var upper string
func main() {
fmt.Printf("%s\n", orig) //How Are You
lower = strings.ToLower(orig)
fmt.Printf("%s\n", lower) //how are you
upper = strings.ToUpper(orig) //HOW ARE YOU
fmt.Printf("%s\n", upper)
}
去除字符串首尾空格
Go 中的 strings 包提供的 TrimSpace() 函數,可以去除字符串的空格。
package main
import (
"fmt"
"strings"
)
func main() {
str := " hello world "
str1 := strings.TrimSpace(str)
str2 := strings.Trim(str," ")
fmt.Println(str)
fmt.Println(str1)
fmt.Println(str2)
}
結果:
hello world
hello world
hello world
合併 / 分割字符串
- 合併 Go 中的 strings 包提供的 Join() 函數,可以合併字符串。
package main
import (
"fmt"
"strings"
)
func main() {
str := []string{"hello","world","!"}
str1 := strings.Join(str,"") //第一個參數是字符串數組,第二個參數是分隔符
str2 := strings.Join(str,"-") //第一個參數是字符串數組,第二個參數是分隔符
fmt.Println(str1) // helloworld!
fmt.Println(str2) // hello-world-!
}
- 分割
strings 包提供的 Split()、SplitN()、SplitAfter()、SplitAfterN() 四個函數處理正則分割字符串。
-
Split:分隔符會被去掉,參數 1 爲字符串,參數 2 爲分隔符
-
SplitN:分隔符會被去掉,參數 1 爲字符串,參數 2 爲分隔符,參數 3 爲分割的片數(-1 則不限制)
-
SplitAfter:保存分割符,參數 1 爲字符串,參數 2 爲分隔符
-
SplitAfterN:保存分割符,參數 1 爲字符串,參數 2 爲分隔符,參數 3 爲分割的片數(-1 則不限制)
Split(s,sep) 等價於 SplitN(s,sep,-1)
SplitAfter(s,sep) 等價於 SplitAfterN(s,sep,-1)
示例:
package main
import (
"fmt"
"strings"
)
func main() {
str := "Hello_World_!"
res := strings.Split(str,"_")
fmt.Printf("str:%#v\n",res)
res1 := strings.SplitN(str,"_",2)
fmt.Printf("str1:%#v\n",res1)
res2 := strings.SplitAfter(str,"_")
fmt.Printf("str2:%#v\n",res2)
res3 := strings.SplitAfterN(str,"_",2)
fmt.Printf("str3:%#v\n",res3)
}
結果:
str:[]string{"Hello", "World", "!"}
str1:[]string{"Hello", "World_!"}
str2:[]string{"Hello_", "World_", "!"}
str3:[]string{"Hello_", "World_!"}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/lAexEAsbCmoxF8yj5ahLZg