前言
今天在寫代碼的時候,遍歷Golang中的字符串時候,發現竟然和想象中不同,從而認真研究了一下,做個記錄希望與string做一個了斷,這是一篇實戰貼。
你將知道以下知識點:
1.字符串的組成?
2.如何遍歷字符串?
3.如何將字符串與整型互轉?
4.如何改變其中某個字符?
5.如何截取字符串?
6.如何計算長度?
7.如何連接字符串?
正文
1.字符串的組成?
Golang的字符串都是由單個字節連接起來的,每個字節都是UTF8編碼標識的Unicode文本。(不需要在考慮中文不兼容問題)
2.如何遍歷字符串?
先看一個例子:
var str = "123"
for i := 0; i < len(str); i++ {
fmt.Println(str[i])
}
輸出:
49
50
51
我去,和想象中不太一樣,接着看下面。
遍歷有兩種方式:
1.for i:=0;i<len;i++{}
2.for k,v:=range string {}
區別在於第一種遍歷的事ASCII字符,第二種是Unicode字符,當遇到漢字的時候第一種就會亂碼了。這也就解釋了前文爲啥不是輸出123了,需要格式化ASCII碼纔是我們想看到的。
第一種
var str = "123咖啡色的羊駝"
for i := 0; i < len(str); i++ {
fmt.Printf("%c\n", str[i])
}
輸出:
1
2
3
å
’...(後面是亂碼)
這裏亂碼原因需要解釋下:
在遍歷的時候,ASCII字符只需要一個字節,而非ASCII 字符的可能需要不2或者3、4個字節不固定,所以碰到非ASCII 字符的用str[i]來獲取一個字節,獲取的不全,肯定就亂碼了。
有什麼辦法解決亂碼呢?
那就是轉爲rune類型的切片就好了
var str = "123咖啡色的羊駝"
strRune := []rune(str)
for _, v := range strRune {
fmt.Printf("%c\n", v)
}
輸出:
1
2
3
咖
啡
色
的
羊
駝
因爲在Golang中字符類型實際存儲使用rune的。
第二種
var str = "123咖啡色的羊駝"
for _, v := range str {
fmt.Printf("%c\n", v)
}
輸出:
1
2
3
咖
啡
色
的
羊
駝
3.如何將字符串與整型互轉?
轉換 | 表達 |
---|---|
string -> int | string, _ := strconv.Atoi(“1”) |
int -> string | int := strconv.Itoa(1) |
string -> int64 | int64, _ := strconv.ParseInt(“1”, 10, 64) |
int64 -> string | string := strconv.FormatInt(1, 64) |
int -> int64 | string := strconv.FormatInt(1, 64) |
4.如何改變其中某個字符?
根據前文我們知道字符有兩種,一種是ASCII,一種是Unicode。
所以需要根據不同的字節數來替換。
str := "123咖啡色的羊駝"
bytes := []byte(str)
bytes[1] = 'a'
str = string(bytes)
fmt.Println(str)
輸出:
1a3咖啡色的羊駝
如果是想兼容漢字那麼使用rune:
str := "123咖啡色的羊駝"
runes := []rune(str)
runes[4] = 'a'
str = string(runes)
fmt.Println(str)
輸出:
123咖a色的羊駝
5.如何截取字符串?
substr := str[n:m] 左開右閉
6.如何計算長度?
若全爲ASCII字符,則len(str)。
若存在非ASCII的Unicode字符,則utf8.RuneCountInString(str)。
//字符串中字符全爲ASCII中的字符
len(str)
//字符串中含非ASCII的Unicode字符
utf8.RuneCountInString(str)
7.如何連接字符串?
提供三種方式:
第一種(最簡單):使用+
str1 := "123"
str2 := "咖啡色的羊駝"
fmt.Println(str1 + str2)
第二種(最高效):使用字節拼接
str1 := "123"
str2 := "咖啡色的羊駝"
var buf bytes.Buffer
buf.WriteString(str1)
buf.WriteString(str2)
fmt.Println(buf.String())
第三種:使用系統包
str1 := "123"
str2 := "咖啡色的羊駝"
str := strings.Join([]string{str1,str2},"")
fmt.Println(str)
os.Exit(1)