Go语言学习笔记-06字符与字符串

字符

Go中的字符是一个Unicode字符,应用UTF-8编码格局,一个字符由一个或多个字节存储在内存中,字符的默认类型为int32

应用rune类型示意一个Unicode码点,一个码点对应一个字符。rune类型实质是int32类型

// $GOROOT/src/builtin.gotype rune = int32

应用byte类型示意一个字节以内的字符,byte类型实质是int8类型

// $GOROOT/src/builtin.gotype byte = uint8

字面值

应用'','a','闲'

应用\x,接十六进制数,最多示意FF,'\x61',

应用\,接八进制数,最多示意377,'\141'

应用\u前缀接四个十六进制数,'\u95f2'

应用\U前缀接四个或八个十六进制数,'\u000095f2','\U000095f2'

ch06/main.go

package mainimport "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 mainimport "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 mainimport "fmt"func main() {    s1 := `今人学识无遗力,少壮时间老始成。纸上得来终觉浅,绝知此事要躬行。`    fmt.Println(s1)}

输入

今人学识无遗力,少壮时间老始成。纸上得来终觉浅,绝知此事要躬行。

读取字符串

应用[]和下标去获取字符串对应的字节

ch06/getchar/main.go

package mainimport "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的第一个字节为:e9s1的第一个字符为:闲

字符串不可变性

无奈通过下标操作批改字符串某个字节的数据

package mainfunc main() {    s1 := "闲渔一下"    s1[0] = 'a'  // 报错}

获取长度

应用内置函数len获取字符串长度,等于组成字符串的字节序列的字节个数

ch06/stringlength/main.go

package mainimport (    "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的长度为:12s1的字符个数为:4

字符串拼接

应用+拼接字符串

ch06/joinstring/main.go

package mainimport "fmt"func main() {    s1 := "闲渔"    s2 := "一下"    s3 := s1 + s2    fmt.Println(s3)}

遍历字符串

第一种形式,应用for遍历,每次遍历进去的值是组成字符串的每个字节

第二种形式,应用for range遍历,每次遍历进去的是Unicode字符的码点值及该字符在字符串中的偏移量

ch06/iterstring/main.go

package mainimport "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/xianyuyixi...

交流学习

微信号:xianyuyixia

微信公众号:闲渔一下