zoukankan      html  css  js  c++  java
  • go string类型的特性

    参考文章: http://c.biancheng.net/view/36.html

    1. 获取ascii类型字符的长度个数和获取utf8类型字符长度的个数

    a. len("咪咪")  //return 6 这获取的是ASCII长度

    b.utf8.RuneCountInString("咪咪") // return 2获取的是utf8汉字长度个数

    2. 字符串遍历, 以ASCII方式遍历和以Unicode方式遍历

    // 测试字符串长度
    str := "我是 abcd"
    
    
    // ASCII码类型遍历
    for i := 0; i < len(str); i++ {
      fmt.Printf("ASCII  %c, %d
    ", str[i], str[i])
    }
    
    // unicode码类型遍历
    for _, s := range str {
      fmt. Printf("Unicode  %c, %d 
    ", s, s)
    }
    

      输出结果

    ASCII  æ, 230
    ASCII  ˆ, 136
    ASCII  ‘, 145
    ASCII  æ, 230
    ASCII  ˜, 152
    ASCII  ¯, 175
    ASCII   , 32
    ASCII  a, 97
    ASCII  b, 98
    ASCII  c, 99
    ASCII  d, 100
    Unicode  我, 25105 
    Unicode  是, 26159 
    Unicode   , 32 
    Unicode  a, 97 
    Unicode  b, 98 
    Unicode  c, 99 
    Unicode  d, 100 

    可以看到以ASCII方式插入的代码是有乱码的, 我们可以以unicode方式打印处理. 这两者的区别在于使用哪一种for循环

    ASCII: 使用for 下标遍历, 后面的数字表示的是在ASCII中的编码. 

    Unicode: 使用 for range遍历. 后面的数字表示的是, 在unicode中的编码

     

    扩展: UTF-8 和 Unicode 有何区别?

    Unicode 与 ASCII 类似,都是一种字符集。

    字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。

    UTF-8 是编码规则,将 Unicode 中字符的 ID 以某种方式进行编码,UTF-8 的是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:

    • 0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
    • 从 128 到 0x10ffff 表示其他字符。


    根据这个规则,拉丁文语系的字符编码一般情况下每个字符占用一个字节,而中文每个字符占用 3 个字节。

    广义的 Unicode 指的是一个标准,它定义了字符集及编码规则,即 Unicode 字符集和 UTF-8、UTF-16 编码等。

    参考: http://c.biancheng.net/view/18.html

    3. 类型强转

    1 //类型强转
    2 str := "这是一个aaa"
    3 bytestr := []byte(str)
    4 fmt.Println(bytestr)
    5 fmt.Println(string(bytestr))

    a. string强转成byte: []byte(str)

    b. byte强转成string: string(byte)

     4. 高效字符串拼接方式

     1 //字符串拼接
     2 hammer := "吃我一锤"
     3 sickle := "死吧"
     4 
     5 /** 普通字符串拼接方式 */
     6 hammer += sickle
     7 fmt.Println(hammer)
     8 fmt.Println(sickle)
     9 
    10 /** 高效字符串连接的方式 */
    11 // 声明字节缓冲区
    12 var stringBuilder bytes.Buffer
    13 
    14 //把字符串写入缓冲
    15 stringBuilder.WriteString(hammer)
    16 stringBuilder.WriteString(sickle)
    17 
    18 // 将缓冲以字符串形式输出
    19 fmt.Println(stringBuilder.String())

    输出:

    1 吃我一锤死吧
    3 死吧
    4 吃我一锤死吧死吧

      简单的东西未必高效。除了加号连接字符串,Go 语言中也有类似于 StringBuilder 的机制来进行高效的字符串连接

    5. 常用的一些格式化样式中的动词及功能

    表:字符串格式化时常用动词及功能
    动  词功  能
    %v 按值的本来值输出
    %+v 在 %v 基础上,对结构体字段名和值进行展开
    %#v 输出 Go 语言语法格式的值
    %T 输出 Go 语言语法格式的类型和值
    %% 输出 % 本体
    %b 整型以二进制方式显示
    %o 整型以八进制方式显示
    %d 整型以十进制方式显示
    %x 整型以十六进制方式显示
    %X 整型以十六进制、字母大写方式显示
    %U Unicode 字符
    %f 浮点数
    %p 指针,十六进制方式显示

    6.

    7.

     

  • 相关阅读:
    JavaScript 多个空格替换成1个空格
    「DIARY」NOI2021 小结
    kubernetes常用命令总结
    Qt绘图(使用QPainter)翻转图像的两种方法
    android 11 R framework 新特证 开发备忘
    浏览器的缓存机制
    记el-tree 懒加载复选框回显的坑
    VUE根据文件流下载EXC
    西瓜视频播放器VUE
    推荐系统打散算法--权重
  • 原文地址:https://www.cnblogs.com/ITPower/p/11925668.html
Copyright © 2011-2022 走看看