Go 之为什么 rune 是 int32 的别名而不是 uint32 的别名

我对这个问题其实也是一直有疑问的,毕竟像 byte 都是 uint8 的别名。然后找了一些问答资料,不知道还没有没其他更好的解释。

范围足够

在 Unicode 字符集中,一个字符的码点范围是从 U+0000 到 U+10FFFF,共计 1114112 个码点,可以用 32 位的整数类型来表示。 Unicode 转换格式,虽然使用的是 4 字节(32bit),但实际上只用到了 21bit。所以 int32 是足够包含该编码范围的。

扩展兼容

使用 int32 类型能有效避免符号扩展等不必要的类型转换,以及提供向下兼容的能力。

算术运算方便

定义为 int32 是为了方便 rune 类型进行算数运算。

package mainimport "fmt"func main() {s := "hello world"a := []rune(s)fmt.Println(a)b := a[1] - a[0]if b < 0 {fmt.Println(b)}
}

比如像 byte 进行算术运算时,就会出现溢出的情况(所以也建议大家尽量不要拿 byte 的运算结果做条件判断等)。

package mainimport "fmt"func main() {s := "hello world"a := []byte(s)fmt.Println(a) // [104 101 108 108 111 32 119 111 114 108 100]if a[1] - a[0] > 0 {fmt.Println("a[1] > a[0]", a[1] - a[0]) // a[1] > a[0] 253}if a[0] - a[1] > 0 {fmt.Println("a[0] > a[1]", a[0] - a[1]) // a[0] > a[1] 3}
}

uint8 别名 byte

既然如此,还有一个疑问,为什么 Go 中 byte 是 uint8 的别名,而不是 int8 的别名呢?

哈哈,这个就不得不提到 UTF-8 编码了,正好也是 Go 默认的编码方式。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:

  • 对于单字节的符号,字节的第一位设为 0,后面 7 位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的
  • 对于 n 字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
package mainimport ("fmt"
)func main() {s := "好"b := []byte(s)fmt.Println(b) // [229 165 189]for _, c := range b {fmt.Printf("%b ", c) // 11100101 10100101 10111101}
}

这样的话,在 UTF-8 编码下使用 byte 表示非 ASCII 字符的话(需要多字节表示),就不得不涉及到字节高位的情况了,而字节高位的表示显然是用 int8 无法处理的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转向敏捷财务规划,实现更快更自信的决策

随着数字化的到来&#xff0c;原本基于电子表格的时代正逐渐拉下帷幕&#xff0c;大部分企业开始摆脱依赖于电子表格进行计划、预算和预测的传统规划系统&#xff0c;寻求更符合当今市场要求的敏捷财务规划。但不得不承认&#xff0c;当下电子表格仍然是多数企业使用最广泛的工…

代码随想录-字符串 | 右旋字符串

代码随想录-字符串 | 7右旋字符串 卡码网 右旋字符串解题思路代码复杂度难点总结 卡码网 右旋字符串 题目链接 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串…

Wireshark数据包分析入门

Wireshark数据包分析 1. 网络协议基础1.1. 应传网数物&#xff08;应表会传网数物&#xff09; 2. 三次握手2.1. 第一次握手2.2. 第二次握手2.3. 第三次握手2.4. 三次握手后流量特征 3. 第一层---物理层&#xff08;以太网&#xff09;4. 第二层---数据链路层&#xff08;PPP L…

ele pls 表格行内样式超出隐藏

使用 模板实现方案&#xff1a; 实现效果&#xff1a; 相关样式&#xff1a;

【网络技术】【Kali Linux】Wireshark嗅探(十)IPv4和IPv6

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

Jenkins CI/CD 持续集成专题四 Jenkins服务器IP更换

一、查看brew 的 services brew services list 二、编辑 homebrew.mxcl.jenkins-lts.plist 将下面的httpListenAddress值修改为自己的ip 服务器&#xff0c;这里我是用的本机的ip 三 、重新启动 jenkins-lts brew services restart jenkins-lts 四 浏览器访问 http://10.85…

Python技术:从入门到精通的指南

Python&#xff0c;作为一种高级编程语言&#xff0c;因其简洁的语法和强大的功能而广受开发者喜爱。它不仅适用于初学者快速上手&#xff0c;也能满足专业开发者的复杂需求。 Python语言的特点 简洁易读 Python的语法接近英语&#xff0c;易于编写和阅读&#xff0c;是初学者…

小米金融警示非法集资风险 助力消费者守护“钱袋子”

随着公安机关对电信网络诈骗打击力度的持续加大&#xff0c;不法分子的诈骗手段也在不断翻新&#xff0c;其隐蔽性和欺骗性日益增强。根据《2022年度反诈报告》数据显示&#xff0c;投资理财类诈骗已成为当前黑灰产活动的主要类型之一&#xff0c;给广大金融消费者带来了严重的…

孩子如何才能学好python

Python是一种高级编程语言&#xff0c;因为其简单易学、功能强大和易于阅读的语法&#xff0c;已经成为了最受欢迎的编程语言之一。对于孩子来说&#xff0c;学习Python不仅可以提高他们的计算机技能&#xff0c;还可以为他们未来的职业生涯打下基础。下面是一些学习Python的建…

python 常用库

python 常用库 以下是对每个包的作用的简要解释&#xff1a; absl-py&#xff1a;是 Abseil Python 库&#xff0c;提供了一些实用的工具和功能。accelerate&#xff1a;用于加速数据处理。addict&#xff1a;用于操作嵌套字典。aiofiles&#xff1a;支持异步文件操作。aiohtt…

redis7安装与配置

一、下载 通过 redis官网 或者 redis中文网 下载。 以下是 redis 相关文档资料链接&#xff1a; redis源码地址 redis在线测试 redis命令参考 redis中文文档 历史发布版本的源码地址 二、版本命名规则 Redis从发布到现在&#xff0c;已经有十余年的时光了&#xff0c;…

Redis 大KEY/慢查询问题的排查和解决

1.排查大KEY/慢查询问题 &#xff08;1&#xff09;设置慢查询参数 slowlog-log-slower-than 10000 --设置慢查询的时间阀值&#xff0c;单位微秒 slowlog-max-len 128 --设置慢查询FIFO队列的长度 &#xff08;2&#xff09;模拟大KEY public class Re…

云原生Service Mesh服务网格简单介绍

serviceMesh是什么 Service Mesh是一个用于处理服务间通信的基础设施层&#xff0c;旨在实现云原生应用复杂服务拓扑中的可靠请求传递。其基本构成是一组与应用一起部署的轻量级网络代理&#xff0c;这些代理对应用来说是透明的。Service Mesh通过统一的方式来控制和处理服务间…

C++期末考试注意点2

函数重载和虚函数处理&#xff1a;函数重载处理的是同一层次上的同名函数问题。虚函数处理的是不同派生层次上的同名函数问题。同一类族的虚函数的首部是相同的&#xff0c;而函数重载时函数的首部是不同的(参数个数或类型不同)。虚函数&#xff1a; (1)只能用virtual声明类的…

双筒水封式防爆器使用方法要记好

双筒水封式防爆器使用方法要记好 型号&#xff08;YC-STFB型&#xff09; 双筒水封式防爆器属于双罐结构的水封式防爆器&#xff0c;安装在抽放瓦斯泵吸气侧和排气端的 管路上靠防爆器底部的水封保护井上井下、抽放泵站设备及用户按全&#xff1b;当瓦斯抽放时气体经由 进气…

【深度学习实战(24)】如何实现“断点续训”?

一、什么是断点续训&#xff1a; 中断的地方&#xff0c;继续训练。与加载预训练权重有什么区别呢&#xff1f;区别在于优化器参数和学习率变了。 二、如何实现“断点续训” 我们需要使用checkpoint方法保存&#xff0c;模型权重&#xff0c;优化器权重&#xff0c;训练轮数…

【Redis】Spring Boot应用中的Redis分布式锁示例

前言 Spring Boot应用中&#xff0c;使用Redisson框架实现一个分布式锁的详细示例&#xff0c;其中获取锁超时时间为30秒&#xff0c;锁失效时间为20秒。 引入依赖 首先&#xff0c;确保你的Spring Boot应用中包含了Redisson的依赖&#xff0c;你可以在pom.xml中添加如下依赖&…

旅游景区一体化污水处理设备产品特点

诸城市鑫淼环保小编带大家了解一下旅游景区一体化污水处理设备产品特点 产品特点 1、埋设于地表以下&#xff0c;设备上面的地表可作为绿化或其他用地&#xff0c;不需要建房及采暖、保温。 2、二级生物接触氧化处理工艺均采用推流式生物接触氧化&#xff0c;其处理效果优于完全…

游戏自动脚本挂机可行性分析

随着科技的不断发展,自动化和智能化技术逐渐渗透到我们生活的各个方面。在游戏领域,自动脚本挂机技术也应运而生,为玩家提供了一种全新的游戏方式。那么,游戏自动脚本挂机到底可行吗?本文将从多个角度进行深入分析。 一、游戏自动脚本挂机的定义与功能 游戏自动脚本挂机…

100.qt qml-MultiPointTouchArea多点触摸缩放拖拽

介绍 MultiPointTouchArea是一个不可见的项目,用于跟踪多个触摸点,它的父类是Item,所以我们可以通过enabled来设置触摸是启用还是禁用。 它提供了一个mouseEnabled属性,该属性默认为true,也就是说也会处理鼠标事件,鼠标事件其实就是当个触摸点,如果设置为false,则只会处理多…