天天看點

Go語言學習筆記-06字元與字元串

作者:閑漁一下

字元

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

繼續閱讀