golang 學(xué)習(xí)筆記 1.6 字符串

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í),也有 byterune 兩種方式。

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,漢,字,
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容