新闻中心

Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解

2025-11-29
浏览次数:
返回列表
rune是字符,byte是字节。Go中byte为uint8别名,用于ASCII字符或二进制数据;rune为int32别名,表示Unicode码点,处理中文、emoji等多字节字符需用rune,字符串遍历和字符计数应基于rune避免乱码。

golang中的rune与byte类型区别是什么_golang字符与字节处理详解

在Go语言中,runebyte 是处理字符与字节时最常遇到的两种类型,它们虽然都用于表示数据单元,但用途和底层含义完全不同。理解它们的区别对正确处理字符串、中文字符和其他多字节文本至关重要。

byte 是 uint8 的别名,表示一个字节

byte 在Go中其实是 uint8 类型的别名,用来表示一个8位的无符号整数,取值范围是 0 到 255。它通常用于处理原始的二进制数据或ASCII字符。

例如,英文字符 'A' 的ASCII码是65,可以用 byte 表示:

  • var b byte = 'A' // 值为 65
  • 字符串底层由字节组成,但仅当字符串是ASCII时,每个 byte 才对应一个字符

对于只包含ASCII字符的字符串,使用 len(str) 返回的字节数等于字符数。但一旦涉及非ASCII字符(如中文),情况就不同了。

rune 是 int32 的别名,表示一个Unicode码点

rune 是 Go 中 int32 的别名,用来表示一个Unicode字符(即一个码点)。它可以表示包括中文、 emoji、拉丁扩展字符在内的所有Unicode字符。

Unicode编码支持多字节字符,比如:

N世界 N世界

一分钟搭建会展元宇宙

N世界 138 查看详情 N世界
  • '你' 是一个中文字符,对应 Unicode 码点 U+4F60,占用3个字节(UTF-8编码下)
  • 用 rune 可以准确表示这个字符本身,而不是它的某个字节

Go中的字符串默认以UTF-8格式存储,因此一个字符可能由多个字节组成。使用 []rune(str) 可以将字符串正确拆分为字符序列。

实际使用中的关键区别

看一个例子来理解差异:

str := "Hello, 世界"
fmt.Println("字节数:", len(str))           // 输出: 13("世"和"界"各占3字节)
fmt.Println("字符数:", len([]rune(str)))   // 输出: 8(H,e,l,l,o,,, ,世,界)

for i, b := range []byte(str) {
    fmt.Printf("%d: %d\n", i, b)  // 遍历每一个字节
}
for i, r := range str {
    fmt.Printf("%d: %c\n", i, r)  // 遍历每一个字符(rune)
}
  • range 字符串时,每次迭代返回的是 rune 而不是 byte
  • 要获取真实字符数量,应使用 utf8.RuneCountInString(str) 或转换为 []rune
  • 直接索引字符串(str[i])得到的是 byte,可能截断多字节字符

何时使用 byte,何时使用 rune?

选择依据是你要处理的是字节流还是字符逻辑

  • 处理文件I/O、网络传输、图片数据等原始二进制时,用 byte
  • 处理用户输入、文本显示、字符串截取、统计字符长度时,优先用 rune
  • 需要操作单个Unicode字符时,用 rune 切片:[]rune(str)

比如实现一个截取前N个字符的函数,必须基于 rune:

func substr(s string, n int) string {
    runes := []rune(s)
    if n >= len(runes) {
        return s
    }
    return string(runes[:n])
}

基本上就这些。掌握 byte 和 rune 的本质区别,能避免在处理中文、emoji或多语言文本时出现乱码或截断错误。核心记住:byte 是字节,rune 是字符。

以上就是Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解的详细内容,更多请关注其它相关文章!


# 多个  # 营销推广建议都有哪些呢  # 百度运营seo  # 企业长尾关键词排名系统  # 高密建设网站哪家好  # 表情包推广素材网站  # seo 外链甚意思  # seo关键词解析  # 芜湖谷歌seo方案公司  # 丹东抖音seo加盟推荐  # 竹山县关键词seo排名优化  # 可以用  # 你要  # go  # 二进制数  # 是一个  # 而不是  # 遍历  # 的是  # 多字  # 区别  # 多语言  # 字节  # 编码  # go语言  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  解决Bootstrap卡片顶部边距导致背景图下移的问题  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  学习通在线学习平台 学习通网页版直接进入课程中心  AO3官方可用镜像 Archive of Our Own网页版最新入口  J*aScript中针对特定容器内图片动画的实现教程  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  处理嵌套交互式控件:前端可访问性指南  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  随机参数递归函数的基准调用次数与时间复杂度探究  css绝对定位元素脱离父容器怎么办_确保父元素position非static  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  Python实时数据流中的动态最值查找策略  Node.js中HTML按钮与J*aScript函数交互的正确姿势  J*aScript中赋值与自增运算符的复杂交互与执行机制  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  葱吃多了会怎样 葱吃多了会伤胃吗  J*aScript中安全有效地处理localStorage字符串数据  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  不同用户不同价格! 索尼开启账户个性化定价测试  Flexbox布局实践:实现粘性导航栏与底部固定页脚  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  QQ官网正版登录链接 QQ在线登录入口最新  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  CSS子选择器:如何区分并样式化嵌套列表的子层级  PostgreSQL海量数据高效导入策略:Python与Django实践指南  网易大神账号申诉需要多久_网易大神账号申诉流程说明  mc.js免安装版 mc.js一键畅玩入口  Golang指针如何与map组合使用_Golang map指针组合实践  J*a应用集成GitHub CLI与API认证指南  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  Go语言中高效处理x-www-form-urlencoded表单数据  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  c++ dfs和bfs代码 c++深度广度优先搜索算法  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  一加 14R 快充无反应_一加 14R 充电优化  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  Python多版本共存与虚拟环境管理深度指南  微信网页版官方入口直达 微信网页版网页版登录使用方法  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率 

搜索