兄弟連go教程(5)字串

尹成發表於2018-07-04
字串是不可變值型別,內部⽤用指標指向 UTF-8 位元組陣列。
•預設值是空字串 ""。
•⽤用索引號訪問某位元組,如 s[i]。
•不能⽤用序號獲取位元組元素指標,&s[i] ⾮非法。
•不可變型別,⽆無法修改位元組陣列。
•位元組陣列尾部不包含 NULL。
runtime.h
struct String
{
byte* str;
intgo len;
};


使⽤用索引號訪問字元 (byte)。
s := "abc"
println(s[0] == '\x61', s[1] == 'b', s[2] == 0x63)


輸出:
true true true


使⽤用 "`" 定義不做轉義處理的原始字串,⽀支援跨⾏行。
s := `a
b\r\n\x00
c`
println(s)


輸出:

a
b\r\n\x00
c


連線跨⾏行字串時,"+" 必須在上⼀一⾏行末尾,否則導致編譯錯誤。
s := "Hello, " +
"World!"
s2 := "Hello, "
+ "World!" // Error: invalid operation: + untyped string


⽀支援⽤用兩個索引號返回⼦子串。⼦子串依然指向原位元組陣列,僅修改了指標和⻓長度屬性。
s := "Hello, World!"
s1 := s[:5] // Hello
s2 := s[7:] // World!
s3 := s[1:5] // ello


單引號字元常量表⽰示 Unicode Code Point,⽀支援 \uFFFF、\U7FFFFFFF、\xFF 格式。
對應 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


要修改字串,可先將其轉換成 []rune 或 []byte,完成後再轉換為 string。⽆無論哪種轉
換,都會重新分配記憶體,並複製位元組陣列。
func main() {
s := "abcd"
bs := []byte(s)
bs[1] = 'B'
println(string(bs))
u := "電腦"

us := []rune(u)
us[1] = '話'
println(string(us))
}


輸出:
aBcd
電話
⽤用 for 迴圈遍歷字串時,也有 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,漢,字,

尹成老師

QQ77025077 

微信18510341407

所有視訊在尹成學院

www.yinchengxueyuan.com

尹成百度雲請聯絡QQ475318423



相關文章