Golang字符串类型原理及其使用方法
Go字符串是不可变的字节序列,按照 UTF-8 编码的 Unicode 码点。字符串的内部序列不可改变,这样设计主要是为了减少内存开支,字符串及其子串都可以使用相同的底层内存。
ASCII码、Unicode字符、UFT-8编码
ASCII码: 使用7位表示128个字符串(大小写英文字母、数字、各种标点及设备控制符)。
Unicode字符: 基本包括了世界上所有的文本字符,使用int32位的数据类型保存单个字符。Go中rune 数据类型就对应该类型。
UTF-8编码: 以字节为单位对Unicode码点做变长编码,兼容ASCII码,相当于是将不同字节大小的字符类型组装到一起,使编码更加紧凑。但是UTF-8编码的字符串不能按下表直接访问某一个字符,需要使用特殊的方式进行处理。
字符串数据类型的基本操作
1.字符串长度
len函数: len(str) 该函数能获取字符串所占的字节数,如果字符串是字母或者数字可以表示该字符串的字符个数,如果包含汉字等特殊字符则无法表示字符个数。此时需要使用utf8.RuneCountInString(str)函数
package main import ( "fmt" "unicode/utf8" ) func main() { str1 := "abcd" str2 := "abc坎" fmt.Printf("len(str1) -> %d\n", len(str1)) fmt.Printf("len(str2) -> %d\n", len(str2)) fmt.Printf("字符数(str1) -> %d\n", utf8.RuneCountInString(str1)) fmt.Printf("字符数(str2) -> %d\n", utf8.RuneCountInString(str2)) } // 输出 // len(str1) -> 4 // len(str2) -> 6 // 字符数(str1) -> 4 // 字符数(str2) -> 4
2.字符串前缀后缀及子字符串问题
基于utf8的优势,许多字符串的操作无需解码,可以直接判断某个字符串是否为前缀、后缀或者子字符串(判断时采用逐字节比较的方法)
package main import ( "fmt" "strings" ) func main() { str := "abcd" s := "abcd" //前缀 if len(s) <= len(str) && str[:len(s)] == s { fmt.Println("Is PreFix!") } //后缀 if len(s) <= len(str) && str[len(str)-len(s):] == s { fmt.Println("Is SufFix!") } //子字符串 if strings.Contains(str, s) { fmt.Println("Is Contanins!") } } // 输出 // Is PreFix! // Is SufFix! // Is Contanins!
3.字符串的遍历
range: 该方法遍历的是字符串的字符个数
package main import ( "fmt" ) func main() { str := "abcd爱莲说" for i, v := range str { fmt.Printf("str[%d] is %c\n", i, v) } } // 输出 // str[0] is a // str[1] is b // str[2] is c // str[3] is d // str[4] is 爱 // str[7] is 莲 // str[10] is 说
4.字符串和字节slice的相互转换
利用 [ ]byte 数据类型实现对字符串的操作,使用[]byte先对字符进行编辑然后再将其转换成字符串类型。
//不可编辑 s := "abcdef" //可编辑 b := []byte(s) str = string(b)
byte.Buffer工具: 该工具作为可以不断写入新的字符等byte数据
func AddByte(str string) string { var buf bytes.Buffer for _, v := range str { //添加原字符 buf.WriteRune(v) //插入空格 buf.WriteString(" ") } return buf.String() }
到此这篇关于Golang字符串类型原理及其使用方法的文章就介绍到这了,更多相关Golang字符串类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解Go语言如何实现类似Python中的with上下文管理器
熟悉 Python 的同学应该知道 Python 中的上下文管理器非常好用,那么在 Go 中是否也能实现上下文管理器呢,下面小编就来和大家仔细讲讲吧2023-07-07
最新评论