字符串与字符编码 - GO语言从入门到实战
  87NHThsqHimc 2023年11月02日 39 0


字符串与字符编码 - GO语言从入门到实战

字符串

与其他主要编程语⾔的差异

  1. 基本数据类型:string 是基础数据类型,而不是引用类型或指针类型。string 在内存中占用的空间大小是固定的,且只读、不可改变。
  2. 字节切片:string 是只读的 byte slice,它存储了一组连续的字节。len 函数可以它所包含的 byte 数,而不是字符数。
  3. 存储数据:string 是字节切片的实现,因此可以存储任何类型的数据。因为字节(byte)是一个通用的数据类型,可以表示各种不同的数据。

Unicode UTF8

  1. Unicode 是⼀种字符集(code point),意味着无论在哪个平台、哪个程序或哪种编程语言中,相同的 Unicode 字符代码点总是代表相同的字符。这使得 Unicode 在全球范围内进行文本交流和存储时非常有用。
  2. 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语言中处理字符串的重要包:stringsstrconv
以下是一些这些包中比较常用的函数:

strings 包
  1. strings.Contains(s, substr): 检查字符串 s 是否包含子串 substr。如果包含,返回 true;否则返回 false
  2. strings.Count(s, substr): 返回子串 substr 在字符串 s 中出现的次数。
  3. strings.Index(s, substr): 返回子串 substr 在字符串 s 中第一次出现的索引,如果未找到则返回-1。
  4. strings.LastIndex(s, substr): 返回子串 substr 在字符串 s 中最后一次出现的索引,如果未找到则返回-1。
  5. strings.Replace(s, old, new, n): 将字符串 s 中的所有 old 子串替换为 new 子串,最多替换 n 次。
  6. strings.ToLower(s): 将字符串 s 中的所有字符转换为小写。
  7. strings.ToUpper(s): 将字符串 s 中的所有字符转换为大写。
  8. strings.Split(s, sep): 将字符串 s 根据分隔符 sep 分割为一个字符串切片。
  9. strings.TrimSpace(s): 去除字符串 s 两端的空白字符(包括空格、制表符、换行符等)。
strconv 包
  1. strconv.Atoi(s): 将字符串 s 转换为对应的整数。如果转换失败,返回错误。
  2. strconv.Itoa(n): 将整数 n 转换为对应的字符串。
  3. strconv.FormatFloat(f, fmt, prec, bitSize): 将浮点数 f 格式化为指定格式的字符串,精度为 prec,位数为 bitSize
  4. strconv.ParseFloat(s, bitSize): 将字符串 s 解析为指定位数的浮点数。
  5. strconv.Unquote(s): 将字符串 s 解析为被引号包围的字符串,例如 ‘“hello”’。如果解析失败,返回错误。
  6. 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语言主要是多练,多找些代码段写写,不懂可以私聊咨询。
码字不易,如果该文章有用,请多多关注或者赞赏,谢谢!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
87NHThsqHimc