**string**
字符串是一系列8位字節的集合,通常但不一定代表UTF-8編碼的文本。字符串可以為空,但不能為nil。字符串的值不能被更改,但可以被替換
字符串重新賦值
```
s := "A1" // 分配存儲"A1"的內存空間,s結構體里的str指針指向這快內存
s = "A2" // 重新給"A2"的分配內存空間,s結構體里的str指針指向這快內存
```
[]byte重新賦值
```
s := []byte{1} // 分配存儲1數組的內存空間,s結構體的array指針指向這個數組。
s = []byte{2} // 將array的內容改為2
```
因為string的指針指向的內容是不可以更改的,所以每更改一次字符串,就得重新分配一次內存,之前分配空間的還得由gc回收,這是導致string操作低效的根本原因。
**string和[]byte的相互轉換**
將string轉為[]byte,語法`[]byte(string)`
將[]byte轉為string,語法`string([]byte)`
既然string就是一系列字節,而[]byte也可以表達一系列字節,那么實際運用中應當如何取舍?
- string可以直接比較,而[]byte不可以,所以[]byte不可以當map的key值。
- 因為無法修改string中的某個字符,需要粒度小到操作一個字符時,用[]byte。
- string值不可為nil,所以如果你想要通過返回nil表達額外的含義,就用[]byte。
- []byte切片這么靈活,想要用切片的特性就用[]byte。
- 需要大量字符串處理的時候用[]byte,性能好很多。