字符串与字符编码 - GO语言从入门到实战
字符串
与其他主要编程语⾔的差异
- 基本数据类型:string 是基础数据类型,而不是引用类型或指针类型。string 在内存中占用的空间大小是固定的,且只读、不可改变。
- 字节切片:string 是只读的 byte slice,它存储了一组连续的字节。
len
函数可以它所包含的 byte 数,而不是字符数。 - 存储数据:string 是字节切片的实现,因此可以存储任何类型的数据。因为字节(byte)是一个通用的数据类型,可以表示各种不同的数据。
Unicode UTF8
- Unicode 是⼀种字符集(code point),意味着无论在哪个平台、哪个程序或哪种编程语言中,相同的 Unicode 字符代码点总是代表相同的字符。这使得 Unicode 在全球范围内进行文本交流和存储时非常有用。
- UTF-8 是一种变长编码的字符编码标准,用于将 Unicode 字符编码为字节序列。UTF-8 是 Unicode 的存储和传输形式,因为它能够以不同的字节长度来表示不同的字符。
编码与存储
字符 “中” 在 Unicode 和 UTF-8 中的表示方式:
字符 |
Unicode |
UTF-8 |
string/[]byte |
中 |
0x4E2D |
0xE4B8AD |
[0xE4, 0xB8, 0xAD] |
附上代码:
package string_test
import (
"fmt"
"testing"
)
func TestString(t *testing.T) {
var s string
fmt.Println(s) //initializes to default zero value ""
s = "hello"
fmt.Println(len(s))
//s[1] = '3' //string is an immutable byte slice
//s = "\xE4\xB8\xA5" //can store any binary data
s = "\xE4\xBA\xBB\xFF"
fmt.Println(s)
fmt.Println(len(s))
s = "中"
fmt.Println(len(s)) //is byte count
c := []rune(s)
fmt.Println(len(c))
//t.Log("rune size:", unsafe.Sizeof(c[0]))
fmt.Printf("中 unicode %x\n", c[0])
fmt.Printf("中 UTF8 %x\n", s)
}
func TestStringToRune(t *testing.T) {
s := "中华人民共和国"
for _, c := range s {
fmt.Printf("%c %x\n", c, c)
}
}
常⽤字符串函数
Go语言中处理字符串的重要包:strings
和 strconv
。
以下是一些这些包中比较常用的函数:
strings 包
-
strings.Contains(s, substr)
: 检查字符串s
是否包含子串substr
。如果包含,返回true
;否则返回false
。 -
strings.Count(s, substr)
: 返回子串substr
在字符串s
中出现的次数。 -
strings.Index(s, substr)
: 返回子串substr
在字符串s
中第一次出现的索引,如果未找到则返回-1。 -
strings.LastIndex(s, substr)
: 返回子串substr
在字符串s
中最后一次出现的索引,如果未找到则返回-1。 -
strings.Replace(s, old, new, n)
: 将字符串s
中的所有old
子串替换为new
子串,最多替换n
次。 -
strings.ToLower(s)
: 将字符串s
中的所有字符转换为小写。 -
strings.ToUpper(s)
: 将字符串s
中的所有字符转换为大写。 -
strings.Split(s, sep)
: 将字符串s
根据分隔符sep
分割为一个字符串切片。 -
strings.TrimSpace(s)
: 去除字符串s
两端的空白字符(包括空格、制表符、换行符等)。
strconv 包
-
strconv.Atoi(s)
: 将字符串s
转换为对应的整数。如果转换失败,返回错误。 -
strconv.Itoa(n)
: 将整数n
转换为对应的字符串。 -
strconv.FormatFloat(f, fmt, prec, bitSize)
: 将浮点数f
格式化为指定格式的字符串,精度为prec
,位数为bitSize
。 -
strconv.ParseFloat(s, bitSize)
: 将字符串s
解析为指定位数的浮点数。 -
strconv.Unquote(
s)
: 将字符串s
解析为被引号包围的字符串,例如 ‘“hello”’。如果解析失败,返回错误。 -
strconv.Quote(s)
: 将字符串s
用双引号包围,例如 ‘“hello”’。
以上只是这些包中函数的一部分,这两个包都有更多功能,用于处理各种字符串相关的问题。查阅Go的官方文档来了解更多详情。
下面提供一些函数的代码案例:
strings.Split 和 strings.Join
package main
import (
"strings"
"fmt"
)
func main() {
s := "A,B,C"
//使用 strings.Split 函数按照逗号分割这个字符串,将分割后的各个部分存储在 parts 切片中
parts := strings.Split(s, ",")
for _, part := range parts {
fmt.Println(part)
}
//使用 strings.Join 函数将 parts 中的元素用连字符连接起来
fmt.Println(strings.Join(parts, "-"))
s := strconv.Itoa(10)
fmt.Println("str" + s)
if i, err := strconv.Atoi("10"); err == nil {
fmt.Println(10 + i)
}
}
strconv.Itoa 和 strconv.Atoi
package main
import (
"strconv"
"fmt"
)
func main() {
//使用 strconv.Itoa 函数将整数10转换为对应的字符串。
s := strconv.Itoa(10)
fmt.Println("str" + s)
//使用 strconv.Atoi 函数尝试将字符串 "10" 转换为一个整数。如果转换成功(即没有错误发生),那么就会打印出 10 + i 的结果,其中 i 是 "10" 转换后的整数。
if i, err := strconv.Atoi("10"); err == nil {
fmt.Println(10 + i)
}
}
学习Go语言主要是多练,多找些代码段写写,不懂可以私聊咨询。
码字不易,如果该文章有用,请多多关注或者赞赏,谢谢!