一看就懂系列之Golang的String

前言

今天在寫代碼的時候,遍歷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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章