字元
Go中的字元是一個Unicode字元,使用UTF-8編碼格式,一個字元由一個或多個位元組存儲在記憶體中,字元的預設類型為int32
使用rune類型表示一個Unicode碼點,一個碼點對應一個字元。rune類型本質是int32類型
// $GOROOT/src/builtin.go
type rune = int32
使用byte類型表示一個位元組以内的字元,byte類型本質是int8類型
// $GOROOT/src/builtin.go
type byte = uint8
字面值
使用'','a','閑'
使用\x,接十六進制數,最多表示FF,'\x61'
使用\,接八進制數,最多表示377,'\141'
使用\u字首接四個十六進制數,'\u95f2'
使用\U字首接四個或八個十六進制數,'\u000095f2','\U000095f2'
ch06/main.go
package main
import "fmt"
func main() {
// 本質上是int32類型
var ch1 rune
ch1 = '閑'
// 使用%c格式化輸出字元
fmt.Printf("閑的Unicode碼點值:%d,字元:%c\n", ch1, ch1)
ch2 := '漁'
fmt.Printf("漁的Unicode碼點值:%d,字元:%c\n", ch2, ch2)
// 使用八進制數表示字元a
ch3 := '\141'
// 使用十六進制數表示字元a
ch4 := '\x61'
fmt.Printf("八進制141表示的字元為:%c\n", ch3)
fmt.Printf("十六進制61表示的字元為:%c\n", ch4)
// 使用\u接四個十六進制數表示
ch5 := '\u95f2'
fmt.Printf("\\u95f2表示的字元為:%c\n", ch5)
// 使用\U接四個或八個十六進制數表示
ch6 := '\U000095f2'
fmt.Printf("\\u95f2表示的字元為:%c\n", ch6)
// 使用byte表示單位元組字元
var ch7 byte
ch7 = 97
fmt.Printf("97對應的ascii為%c\n", ch7)
// 使用rune表示一個Unicode碼點
var ch8 rune
ch8 = 38386
fmt.Printf("38386對應的Unicode字元為%c", ch8)
}
輸出
閑的Unicode碼點值:38386,字元:閑
漁的Unicode碼點值:28180,字元:漁
八進制141表示的字元為:a
十六進制61表示的字元為:a
\u95f2表示的字元為:閑
\u95f2表示的字元為:閑
97對應的ascii為a
38386對應的Unicode字元為閑
字元串
字元串是由多個字元組成,也就是由位元組序列組成
字面值
使用"","閑漁一下"
其他形式與字元一緻
ch06/string/main.go
package main
import "fmt"
func main() {
s1 := "閑漁一下"
// 使用\u字首接四個十六進制數
s2 := "\u95f2\u6e14\u4e00\u4e0b"
// 使用\U字首接八個十六進制數
s3 := "\U000095f2\U00006e14\U00004e00\U00004e0b"
// 使用十六進制,utf-8編碼
s4 := "\xe9\x97\xb2\xe6\xb8\x94\xe4\xb8\x80\xe4\xb8\x8b"
// 混合使用
s5 := "閑\u6e14\U00004e00\xe4\xb8\x8b"
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(s3)
fmt.Println(s4)
fmt.Println(s5)
}
輸出
閑漁一下
閑漁一下
閑漁一下
閑漁一下
閑漁一下
原始字元串
使用反引号,裡面字元都不會轉義,所見即所得
package main
import "fmt"
func main() {
s1 := `古人學問無遺力,少壯工夫老始成。
紙上得來終覺淺,絕知此事要躬行。`
fmt.Println(s1)
}
輸出
古人學問無遺力,少壯工夫老始成。
紙上得來終覺淺,絕知此事要躬行。
讀取字元串
使用[]和下标去擷取字元串對應的位元組
ch06/getchar/main.go
package main
import "fmt"
func main() {
s1 := "閑漁一下"
// 使用下标擷取
fmt.Printf("s1的第一個位元組為:%x\n", s1[0])
// 取前3個位元組組成的字元串,因為是utf-8編碼,1個中文用3個位元組表示,是以為閑
fmt.Printf("s1的第一個字元為:%s\n", s1[0:3])
}
輸出
s1的第一個位元組為:e9
s1的第一個字元為:閑
字元串不可變性
無法通過下标操作修改字元串某個位元組的資料
package main
func main() {
s1 := "閑漁一下"
s1[0] = 'a' // 報錯
}
擷取長度
使用内置函數len擷取字元串長度,等于組成字元串的位元組序列的位元組個數
ch06/stringlength/main.go
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
// utf-8編碼,一個中文由3個位元組組成,是以長度為12
s1 := "閑漁一下"
fmt.Printf("s1的長度為:%d\n", len(s1))
fmt.Printf("s1的字元個數為:%d\n", utf8.RuneCountInString(s1))
}
輸出
s1的長度為:12
s1的字元個數為:4
字元串拼接
使用+拼接字元串
ch06/joinstring/main.go
package main
import "fmt"
func main() {
s1 := "閑漁"
s2 := "一下"
s3 := s1 + s2
fmt.Println(s3)
}
周遊字元串
第一種方式,使用for周遊,每次周遊出來的值是組成字元串的每個位元組
第二種方式,使用for range周遊,每次周遊出來的是Unicode字元的碼點值及該字元在字元串中的偏移量
ch06/iterstring/main.go
package main
import "fmt"
func main() {
s1 := "閑漁一下"
fmt.Println("方式一")
//方式一,周遊出來的是utf8編碼的位元組
for i := 0; i < len(s1); i++ {
fmt.Printf("0x%x ", s1[i])
}
fmt.Println()
// 以字元格式輸出為亂碼
for i := 0; i < len(s1); i++ {
fmt.Printf("%c ", s1[i])
}
fmt.Println("\n方式二")
// 方式二,周遊出來的是Unicode字元的碼點值
for i, ch := range s1 {
fmt.Printf("偏移量%d對應的字元為%c\n", i, ch)
}
fmt.Println()
// 列印每個字元的碼點值,十六進制表示
for _, ch := range s1 {
fmt.Printf("%c:%x ", ch, ch)
}
fmt.Println()
// 列印每個字元的碼點值,十進制表示
for _, ch := range s1 {
fmt.Printf("%c:%d ", ch, ch)
}
}
輸出
方式一
0xe9 0x97 0xb2 0xe6 0xb8 0x94 0xe4 0xb8 0x80 0xe4 0xb8 0x8b
é
方式二
偏移量0對應的字元為閑
偏移量3對應的字元為漁
偏移量6對應的字元為一
偏移量9對應的字元為下
閑:95f2 漁:6e14 一:4e00 下:4e0b
閑:38386 漁:28180 一:19968 下:19979
筆記位址
github:https://github.com/xianyuyixia/gotrip