• Golang字符串类型原理及其使用方法


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

    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!
    
    • 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

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

    4.字符串和字节slice的相互转换

    利用 [ ]byte 数据类型实现对字符串的操作,使用[]byte先对字符进行编辑然后再将其转换成字符串类型。

    //不可编辑
    s := "abcdef"
    //可编辑
    b := []byte(s)
    str = string(b)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    byte.Buffer工具: 该工具作为可以不断写入新的字符等byte数据

    func AddByte(str string) string {
    	var buf bytes.Buffer
    	for _, v := range str {
    		//添加原字符
    		buf.WriteRune(v)
    		//插入空格
    		buf.WriteString(" ")
    	}
    	return buf.String()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    【解决问题思路分析】记录hutool默认使用服务端上次返回cookie的问题解决思路
    javaee之黑马旅游网1
    猿创征文|date-fns 秒助手函数
    虹科方案 | 车载以太网转换器&交换机解决方案
    我的编程初学者之旅:那些愚蠢的代码
    JavaScript教程第二篇(作者原创)
    【Android】AndroidStudio自动下载的Gradle大东西从系统盘里怎样转移出去
    树状数组-
    ElementUI - 主页面--动态树&右侧内容管理
    VALSE2022内容总结
  • 原文地址:https://blog.csdn.net/fuhaitao9999/article/details/132848158