zoukankan      html  css  js  c++  java
  • 浅析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字符
  • 相关阅读:
    BDB c++例子,从源码编译到运行
    Linux的nm查看动态和静态库中的符号
    转:js包装DOM对象
    svn笔记4属性Properties
    c++ 友元函数
    转:js包装DOM对象
    整除规则(原理,性质)
    回溯法求幂集
    转:Javascript继承机制的设计思想
    javascript prototype __proto__区别
  • 原文地址:https://www.cnblogs.com/echojson/p/10746597.html
Copyright © 2011-2022 走看看