1.6 字符串
- 字符串是不可變值類型,內(nèi)部用指針指向 UTF-8 字節(jié)數(shù)組。
- 默認(rèn)值是空字符串 ""。
- 用索引號訪問某字節(jié),如 s[i]。
- 不能用序號獲取字節(jié)元素指針,&s[i] 非法。
- 不可變類型,無法修改字節(jié)數(shù)組。
- 字節(jié)數(shù)組尾部不包含 NULL。
struct String
{
byte* str;
intgo len;
};
使用索引號訪問字符 (byte)。
s := "abc"
println(s[0] == '\x61', s[1] == 'b', s[2] == 0x63)
//輸出:
true true true
使用 " ` " 定義不做轉(zhuǎn)義處理的原始字符串,支持跨行。
s := `a
b\r\n\x00
c`
println(s)
// 輸出:
a
b\r\n\x00
c
連接跨行字符串時(shí),"+" 必須在上一行末尾,否則導(dǎo)致編譯錯誤。
s := "Hello, " +
"World!"
// error :
s2 := "Hello, "
+ "World!" // Error: invalid operation: + untyped string
支持用兩個索引號返回子串。子串依然指向原字節(jié)數(shù)組,僅修改了指針和長度屬性。
s := "Hello, World!"
s1 := s[:5] // Hello
s2 := s[7:] // World!
s3 := s[1:5] // ello
單引號字符常量表示 Unicode Code Point
,支持 \uFFFF、\U7FFFFFFF、\xFF
格式。對應(yīng) rune
類型,UCS-4
。
func main() {
fmt.Printf("%T\n", 'a')
var c1, c2 rune = '\u6211', '們'
println(c1 == '我', string(c2) == "\xe4\xbb\xac")
}
// 輸出:
int32 // rune 是 int32 的別名
true true
要修改字符串,可先將其轉(zhuǎn)換成 []rune
或 []byte
,完成后再轉(zhuǎn)換為 string
。無論哪種轉(zhuǎn)換,都會重新分配內(nèi)存,并復(fù)制字節(jié)數(shù)組。
func main() {
s := "abcd"
bs := []byte(s)
bs[1] = 'B'
println(string(bs))
u := "電腦"
us := []rune(u)
us[1] = '話'
println(string(us))
}
輸出:
aBcd
電話
用 for
循環(huán)遍歷字符串時(shí),也有 byte
和 rune
兩種方式。
func main() {
s := "abc漢字"
for i := 0; i < len(s); i++ { // byte
fmt.Printf("%c,", s[i])
}
fmt.Println()
for _, r := range s { // rune
fmt.Printf("%c,", r)
}
}
// 輸出:
a,b,c,,±,,,,,
a,b,c,漢,字,