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

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:github.com/xianyuyixia/gotrip

交流学习

微信号:xianyuyixia

wx_qrcode_258.jpg

微信公众号:闲渔一下

wx_platform.jpg

go
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!