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


    字符串与字符编码 - 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 中的表示方式:

    字符UnicodeUTF-8string/[]byte
    0x4E2D0xE4B8AD[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)  
     	}  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    常⽤字符串函数

    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)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    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)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    学习Go语言主要是多练,多找些代码段写写,不懂可以私聊咨询。
    码字不易,如果该文章有用,请多多关注或者赞赏,谢谢!

    欢迎关注云尔Websites CSDN博客

  • 相关阅读:
    JSP开发环境搭建(Tomcat的安装和配置)
    Ubuntu上的论文翻译软件 --- 兰译
    基于java+SpringBoot+HTML+Mysql线上视频购买学习
    金九银十进大厂必刷的Java面试题 (全彩版)
    【数据结构】深入探讨二叉树的遍历和分治思想(一)
    白杨SEO:2024年短视频怎么做?转型做抖音、快手、视频号等短视频流量难吗?怎么做更好?
    Java/.Net双平台核心,Jvm和CLR运行异同点
    SpringCloud 06 Ribbon
    基于JAVA图书馆借阅系统计算机毕业设计源码+数据库+lw文档+系统+部署
    10大数据恢复软件可以帮助您恢复电脑数据
  • 原文地址:https://blog.csdn.net/wuchengzeng/article/details/133690408