go 语言字符类型 byte 与 rune案例详解

作者:岳来 时间:2024-04-26 17:22:57 

golang的字符有如下两种:

  • 一种是 uint8['ju:nɪt] 类型叫做 byte 型,代表了 ASCII 码的一个字符。

  • 另一种是 rune[ruːn] 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。

一、byte类型介绍

byte 类型是 uint8 的别名,可以表达只占用 1 个字节的传统 ASCII 编码的字符,例如 var c byte = 'A'

用单引号括起来的单个字符是字符类型,用双引号括起来的字符是字符串类型

package main

import "fmt"

func main(){
   var c byte = 'A'
   fmt.Println(c)
   fmt.Printf("%T ",c)
   fmt.Printf("\n")
   var d rune = 'A'
   fmt.Println(d)
   fmt.Printf("%T ",d)
   // var e byte = 'AB' // more than one character in rune literal
   // var e rune = 'AB'  // more than one character in rune literal
   var e string = "AB"
   fmt.Println(e)
   fmt.Printf("%T ",e)
   fmt.Printf("\n")
   var f byte = 'C'
   println(f)
   f = 88
   println(f)
}

// 结果如下
65
uint8
65
int32
AB
string
67
88

二、rune类型介绍

  • 在书写 Unicode 字符时,需要在 16 进制数之前加上前缀\u或者\U

  • Unicode 至少占用 2 个字节,所以我们使用 int16 或者 int 类型来表示。

  • 需要使用到 4 字节,则使用\u前缀,如果需要使用到 8 个字节,则使用\U前缀。

var h int = '\u0041'
fmt.Println(h)   // 65
var i int = '\U00000041'
fmt.Println(i)   // 65

三、遍历含有中文(Unicode)时差异

3.1、遍历打印一个字符串,当使用byte类型时:

package main

import "fmt"

func main(){
   str:="hello 世界"
   for i:=0;i<len(str);i++{
       fmt.Printf("%c",str[i]) // hello ä¸ç
       fmt.Printf("\n")
   }
}

// 结果如下:
h
e
l
l
o

ä
¸

ç

上面结果,英文字符正确打印,但中文乱码。是因为UTF8编码下一个中文汉字由3~4个字节组成,而字符串是由byte字节组成,所以长度也是byte字符长度,这样遍历时遇到中文就乱码了。

3.2、使用rune 类型来遍历字符串

在 Go 中,有一个遍历方式是 range,它默认就是以 UTF-8 编码形式去读每一个字符。当涉及到的字符串中含有非英文字符时,可以使用 range 来遍历:

104
101
108
108
111
32
19990
30028

此时输出的字节编码就是 UTF-8 编码号,UTF-8 编码是包含 ASCII 编码的,所以前 6 个编号还是一样的,后面两个编号分别代表世,界。

四、go 语言字符串修改

所谓对字符串的修改其实不是对字符串本身的修改,而是复制字符串,同时修改值,即重新分配来内存。

在go中修改字符串,需要先将字符串转化成数组,[]byte[]rune,然后再转换成 string型。

4.1、对于全是ASCII编码的字符串:

package main

import "fmt"

func main(){
   str:="hello"
   fmt.Println(str)
   s1:=[]byte(str)
   s1[0]='H'
   fmt.Println(string(s1))
}

// 结果如下
hello
Hello

4.2、对于包含非ASCII编码的字符串:

package main

import "fmt"

func main(){
   str01:="hello 世界"
   fmt.Println(str01)
   s2:=[]rune(str01)
   s2[0]='H'
   fmt.Println(string(s2))
}

// 结果如下
hello 世界
Hello 世界

参考文档

1、https://blog.csdn.net/AXIMI/article/details/120379225
2、https://lesscode.work/sections/62b076e9d22ba.html
3、https://www.liaoxuefeng.com/wiki/1016959663602400/1016959856222624
4、https://www.cnblogs.com/wjaaron/p/14822799.html
5、https://www.bbsmax.com/A/D854aVKpdE/

来源:https://blog.csdn.net/yuelai_217/article/details/129256360

标签:go,字符类型,byte,rune
0
投稿

猜你喜欢

  • ASP访问带多个参数的存储过程

    2008-10-14 16:45:00
  • Go开源项目分布式唯一ID生成系统

    2024-02-14 22:08:15
  • php 时间计算问题小结

    2023-11-03 14:37:06
  • 如何做一个只搜索本网站的引擎?

    2010-07-12 19:02:00
  • 解析SQLServer2005的Top功能

    2024-01-27 05:37:16
  • python2 对excel表格操作完整示例

    2022-08-27 00:35:06
  • mysql随机抽取一定数量的记录实例讲解

    2024-01-21 07:19:38
  • 解决Unable to access 'https://gitee.com/自己的项目/': Could not resolve host: gitee.com问题

    2023-11-06 06:47:59
  • python dataframe astype 字段类型转换方法

    2022-02-19 07:58:50
  • Python爬虫基础初探selenium

    2023-07-26 17:40:50
  • Python中的Cookie模块如何使用

    2023-04-12 15:54:46
  • 举例讲解Python中的list列表数据结构用法

    2021-05-07 08:02:53
  • 解析MySQL join查询的原理

    2024-01-17 13:28:46
  • python爬取微信公众号文章

    2021-12-30 18:46:35
  • js清空form表单中的内容示例

    2023-08-23 16:22:02
  • Elasticsearch属性单词常用解析说明

    2023-06-12 14:47:36
  • 利用Python实现端口扫描器的全过程

    2021-07-08 01:25:32
  • Oracle数据库与SQL Server数据库镜像对比

    2009-04-11 16:24:00
  • 浅谈Python的正则表达式

    2022-05-11 00:54:16
  • python进行相关性分析并绘制散点图详解

    2023-02-25 14:45:54
  • asp之家 网络编程 m.aspxhome.com