• 浅析rune数据类型


    学习golang基础的时候,发现有个叫rune的的数据类型,当时不理解这个类型的意义。

    查询,官方的解释如下:

    // rune is an alias for int32 and is equivalent to int32 in all ways. It is
    // used, by convention, to distinguish character values from integer values.
    
    //int32的别名,几乎在所有方面等同于int32
    //它用来区分字符值和整数值
    
    type rune = int32
    

      

    看代码:

    package main
    
    import "fmt"
    
    func main() {
    
        var str = "hello 你好"
        fmt.Println("len(str):", len(str))
    
    }
    

      

    们猜测结果应该是:8:5个字符1个空格2个汉字。那么正确答案是多少呢?

    结果是 :12

    这是为什么呢?

    golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。

    解决方法:

    ackage main
    
    import (
        "fmt"
        "unicode/utf8"
    )
    
    func main() {
    
        var str = "hello 你好"
    
        //golang中string底层是通过byte数组实现的,座椅直接求len 实际是在按字节长度计算  所以一个汉字占3个字节算了3个长度
        fmt.Println("len(str):", len(str))
        
        //以下两种都可以得到str的字符串长度
        
        //golang中的unicode/utf8包提供了用utf-8获取长度的方法
        fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
    
        //通过rune类型处理unicode字符
        fmt.Println("rune:", len([]rune(str)))
    }
    

      

    golang中还有一个byte数据类型与rune相似,它们都是用来表示字符类型的变量类型。它们的不同在于:

    • byte 等同于int8,常用来处理ascii字符
    • rune 等同于int32,常用来处理unicode或utf-8字符
  • 相关阅读:
    (40)C#windows服务控制
    (6)C#事务处理
    (1)sqlite基础
    bzoj 2456 mode
    bzoj 2763 [JLOI2011]飞行路线
    bzoj1010[HNOI2008] 玩具装箱toy
    bzoj1034 [ZJOI2008]泡泡堂BNB
    [bzoj1059] [ZJOI2007] 矩阵游戏 (二分图匹配)
    [bzoj1066] [SCOI2007] 蜥蜴
    bzoj1072 [SCOI2007]排列perm
  • 原文地址:https://www.cnblogs.com/echojson/p/10746597.html
Copyright © 2020-2023  润新知