• go 字符串操作


    go 字符串操作

    Go 语言中的字符串是一个字节切片。把内容放在双引号””之间,并且Go 中的字符串是兼容 Unicode 编码的,并且使用 UTF-8 进行编码。由于字符串是一个字节切片,所以我们可以获取字符串的每一个字节。

    func main() {
    	s := "hello world"
    	for i:=0;i<len(s);i++{
    		fmt.Println(string(s[i]))  // 不加 string 打印出来的是字符对应的 Unicode 编码
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    rune

    for 循环字符串,默认是一个字节一个字节循环,但我们的中文是采用3个字节对应一个汉字,因此,直接循环中文,就会导致显示乱码

    func main() {
    	s1 := "中国"
    
    	for i:=0;i<len(s1);i++{
    		fmt.Print(string(s1[i])) // 中国
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    因此,当字符串中出现中文时,为防止乱码现象,可以将字符串做成 rune(int32) 的切片去 for 循环

    func main() {
    	s := "中 国"
    	r := []rune(s)
    	for i:=0;i<len(r);i++{
    		fmt.Print(string(r[i]))  // 中 国
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    byte切片和rune切片构建字符串

    既然 go 底层存储字符串就是存储的byte,那么我们是不是可以直接建立一个切片,切片里面放入一个个字节呢。

    答案显而易见是可以的。

    "hello world" 十进制字节为 104 101 108 108 111 32 119 111 114 108 100 也可以放入16进制
    
    func main() {
    	byteSlice := []byte{104,101,108,108,111,32,119,111,114,108,100}
    	str := string(byteSlice)
    	fmt.Println(str)  // hello world
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    同样,也可以建立rune切片来构建中文字符

    "中 国" 十进制字节为 20013 32 22269 
    func main() {
    	runeSlice := []rune{20013,32,22269 } // 32指的空格
    	str := string(runeSlice)
    	fmt.Println(str) // 中 国
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    byte(uint8, 一个字节)rune(int32, 四个字节) 这两种类型,来代表字节和字符串
    
    • 1

    字符串长度

    字符串长度统计,在python中可以用len方法来统计,同样在go中,也有一个内置函数len(),但是这个len()在go中统计的是字符串的字节数,原因也在 go 中字符串是存储的一个个字节。而统计字符穿长度就需要用到go中另一个内置函数 utf8.RuneCountInString(),案例如下:

    func main() {
    
    	s := "a中国"
    	fmt.Println(len(s))    // 统计的是字节长度
    	fmt.Println(utf8.RuneCountInString(s))  // 统计字符长度
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改字符串的方法

    前面我们提到过,字符串在go中是一个值类型,虽然可以通过索引来取值,但是禁止根据索引修改值

    func main(){
    	s := "hello"
    	fmt.Println(string(s[0]))  // h
        s[0] = 'a'  // 报错,' ' 就是获取该字符的Unicode编码
    }	
    
    • 1
    • 2
    • 3
    • 4
    • 5

    那么如果我们想要对字符串进行更改,也是可以通过切片的方法去实现的, 但原字符串还是未改变的!

    func main() {
    	s := "hello"
    	r := []rune(s)
    	r[1] = 'A'
    	fmt.Println(string(r)) // hAllo
    	fmt.Println(s)		// hello
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    覆盖接入2w+交通监测设备,EMQ为深圳市打造交通全要素数字化新引擎
    Android 12.0Launcher3 电话和短信app图标显示未读短信和未接来电的条数
    线性代数贯串全书各章节的隐含关系(以秩为中心)
    【开源】基于Vue.js的社区买菜系统的设计和实现
    jsonp介绍
    「容器管理系统」 3. 初始化配置和日志监控
    智慧学习环境移动智能终端零信任安全机制改进方案
    C++ Reference: Standard C++ Library reference: C Library: cmath
    设计模式- 模板方法模式(Template Method Pattern) 结构|原理|优缺点|场景|示例
    Docker Hub 镜像代理加速
  • 原文地址:https://blog.csdn.net/qq_55752792/article/details/125603521