go语言字符类型byte与rune

2023-10-26

字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。
 

Go语言的字符有以下两种:

  • 一种是 byte 型,是 uint8 的别名,代表了 ASCII 码的一个字符。
  • 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。

字符集

Unicode 与 ASCII 类似,都是一种字符集。
字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。

案例

package main

import "fmt"

/*
	尝试使用索引遍历字符串,来更新字符串中的个别字符,是不允许的。
	string 类型的值是只读的二进制 byte slice,如果真要修改字符串中的字符,将 string 转为 []byte 修改后,再转为 string 即可
*/

func main()  {
	s1 := "Hello"

	// bad
	//s1[1] = 'a'

	// good
	sBytes := []byte(s1)
	sBytes[1] = 'a'
	s2 := string(sBytes)

	fmt.Println(s2) //Hallo
}
package main

import "fmt"

/*
	之前的示例并不是更新字符串的正确姿势,因为一个 UTF8 编码的字符可能会占多个字节,比如汉字就需要 3~4个字节来存储,此时更新其中的一个字节是错误的。
	更新字串的正确姿势:将 string 转为 rune slice(此时 1 个 rune 可能占多个 byte),直接更新 rune 中的字符
*/

func main()  {
	s1 := "Hello"

	// bad
	//sBytes := []byte(s1)
	//sBytes[1] = '嗨'

	// good
	sBytes := []rune(s1)
	sBytes[1] = '嗨'
	s2 := string(sBytes)

	fmt.Println(s2) //H嗨llo
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go语言字符类型byte与rune 的相关文章

  • 如何在Go中从interface{}解组到interface{}

    我的系统中有多个通过 RPC 进行通信的节点 我正在尝试通过 RPC 将 map string interface 发送到另一个节点 发送方使用 json Marshal 接收方使用 json Unmarshal 来获取地图 假设在发送方
  • 地图中的最大元素数

    GO 中的 Map 最多可以存储多少个元素 如果我需要经常从 Map 访问数据 那么在长时间运行的程序中不断向 Map 添加项目并从中检索项目是一个好主意吗 除了map length类型的最大值之外 map中的元素数量没有理论上的限制 in
  • 如何检查我的 golang 应用程序是否使用 Boringcrypto 而不是本机 golang crypto?

    上下文 我正在阅读多篇有关使我的 golang 应用程序符合 FIPS 要求的文章 换句话说 使我的应用程序使用 Boringcrypto 而不是本机 golang crypto https kupczynski info posts fi
  • IntelliJ 2017.1.2 GOLANG 调试不适用于包中的断点

    我的应用程序由一个 main go 文件和一些包组成 当在 main go 中命中断点时 IntelliJ 按预期工作 显示变量值等 但是 当在不同的包中设置断点时 除了被命中之外 不会显示任何变量 并且不会跳过 进入功能按预期工作 被击中
  • mysql 查询中的 golang 切片,带有 where in 子句

    我正在运行以下查询 但只获取第一个 id 值 select from table where table id in 1 2 3 4 5 6 7 9 11 13 14 15 17 and table deleted at is null 我
  • 为什么我不能执行 fmt.Sprintf("%d.%d.%d.%d", a...)?

    我正在学习 Go 但我一直坚持 Go 之旅 exercise stringer go https tour golang org methods 7 https tour golang org methods 7 这是一些代码 type I
  • foo.Name undefined(类型接口{}没有字段或方法名称)

    我使用本机 golang 包 container list 来管理堆栈中的 inotify 事件 当我访问堆栈的项目时 我的类型失败 我认为 import golang org x exp inotify container list lo
  • 具有多个等待组的管道中通道范围内的死锁

    我正在练习通过同时将计算分为 100 组来计算阶乘的挑战 我解决了 WaitGroups 上的很多问题 但仍然处于calculateFactorial函数我在通道部分的范围上陷入了僵局 希望有人能指出这个问题 谢谢 package main
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • Cgo 生成的源无法在 MVC 上编译

    我有一个用 CGo 制作的共享库 它在 Linux 和 Android 上链接得很好 但是 当使用 Microsoft Visual Studio 2017 在 Windows 10 上进行编译时 出现以下错误 Microsoft R Pr
  • 如何通过模板中的变量访问对象字段?

    我有一个嵌套循环 columns columns range dx dataList range c columns index dx c end end dataList是orm模型数组 和ID Title字段 那么columns is
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 如何顺序运行 golang 测试?

    当我跑步时go test 我的输出 FAIL TestGETSearchSuccess 0 00s Location drivers api test go 283 Error Not equal 200 expected 204 actu
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • 构建链代码时 ltdl.h 未找到错误

    我正在尝试使用构建链码go build 当我运行 Go build 命令时它的报告 hyperledger fabric vendor github com miekg pkcs11 pkcs11 g o 29 18 fatal error
  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 为什么 Go 禁止取 (&) 映射成员的地址,却允许取 (&) 切片元素?

    Go 不允许获取地图成员的地址 if I do this p mm abc Syntax Error cannot take the address of mm abc 理由是 如果 Go 允许使用此地址 那么当地图后台存储增长或缩小时 该

随机推荐

  • CleanShot X for mac安装下载,mac系统录屏、截图、标注软件

    您是否经常需要截图 录屏或者标注图片 如果是 那么您一定会喜欢CleanShot X for mac 这是一款专为Mac用户设计的强大而简洁的工具 CleanShot X for mac可以让您轻松地截取任何区域的屏幕 无论是整个屏幕 窗口
  • [586]使用requests来爬取大众点评

    看完本文 你可以 1 了解大众点评的CSS反爬虫机制 2 破解反爬虫机制 3 使用requests即可正确获取到评论数 平均价格 服务 味道 环境数据 评论文本数据 1 前言 在工作生活中 发现越来越多的人对大众点评的数据感兴趣 而大众点评
  • spring 解析swagger.json

    微服务开发 经常会用到swagger 开发过程中也可以直接验证 测试接口是否可用 但是由于swagger不是正式的对接文档 我们提供给前端或者外部来进行联调时还是要正式的文档 为了解决这一痛点 发现swagger是通过swagger jso
  • 软件测试面试HR常问问题及回答技巧,看完丝毫不需要慌,稳过

    前言 当你去一家公司面试 可能会经历好几轮的面试 然后到HR面试 很多公司的HR都有一票否决权 可以直接决定录不录用你 就算你的技术很硬 实例很强 HR不满意还是可以不录用你 尤其对于技术一般的人 HR的这关面试就显得极为重要了 我这个里准
  • memtool使用指南

    最近在用Infineon Memtool 的过程中遇到的一点问题 看了英文help解决了 现总结一下memtool的使用指南 1 target选择change 选择芯片型号 添加配置文件 打开电源 2 对右边的各个rom进行remove a
  • GNU Linux核心命令和工具的源代码路径

    GNU Linux核心命令和工具的源代码路径 2015 08 20 09 44 57 分类 LINUX 原文地址 GNU Linux核心命令和工具的源代码路径 作者 ubuntuer Commands and Utilities The t
  • Linux系统下安装Redis-7.0.0

    一 准备工作 1 下载安装新版的gcc编译器 redis的安装需要gcc环境的支持 所以首先要检查下服务器上时候已经安装了gcc环境 离线安装gcc包 执行安装命令 rpm ivh rpm nodeps force 1 1 下载Redis客
  • 前端面试题(js篇)

    1 解释一下什么是闭包 什么是闭包 函数使用了不属于自己的局部变量 函数套函数 里面函数使用了外面函数定义的变量 闭包的作用 避免全局污染 闭包的缺点 使用过多会造成内存泄漏 占用的内存释放不掉 2 js中的本地存储有哪些 区别是什么 1
  • QT日常报错解决方案

    日常报错 3 1 undefined reference to vtable vtable 表示的是虚表 这个错误出现时 请检查你的父类所有虚函数是否实现 或者子类是否把父类的虚函数都处理完 注意 析构函数也算 有时候一开始没有添加Q OB
  • 专业程序员开发-老狼孩插件懒人精灵版

    老狼孩插件懒人版 综合分类版 v1 7 5有新版啦 完全开放 免费使用 全新改版 1 优化 调试输出默认延迟1000毫秒 2 新增 更新类 阿里云json版热更新 定时关闭界面自动更新 无界面自动更新 3 新增 更新类 坚果云json版热更
  • 服务器太小是什么情况 显示小,服务器内存显示的比实际的小

    服务器内存显示的比实际的小 内容精选 换一换 弹性云服务器创建成功后 使用free m命令查询内存大小 查询结果与实际配置不符 较之创建时的配置要小一些 示例 假设创建该弹性云服务器时 配置的实际内存大小为4194304KB 即4096MB
  • QT之QChart的简介

    QT之QChart的简介 1 创建图表 2 设置图表标题和坐标轴标签 3 定制图表样式 4 显示图表 5 保存图表为图像 QChart 是 Qt Charts 模块中的一个主要类 用于创建和管理图表 QChart 提供了一组用于创建各种类型
  • Vue实现面包屑功能(el-breadcrumb)

    vue3 elementPlus 实现面包屑功能 文章后面附效果图 数据结构 首先展示一下数据基础结构 红色框框是默认存在的数据 其他数据就是通过选中侧边栏菜单进行数据插入 关键数据字段为 path meta 准备侧边栏 首先需要自己准备一
  • 常用对象类型之间的转换

    ads point 是原来的ADS 编程中定义的一种数据类型 其定义为 typedef ads real ads point 3 而ads real 则被定义为 typedef double ads real 可以看出 ads point
  • 前端知识14:webpack打包图片资源

    需要下载url loader 和 file loader两个包 前者依赖于后者 安装 npm i url loader file loader D 图片在css中使用的场景 注意图片在src目录下 注意图片路径的写法用的是相对路径 引用插件
  • C++ vector 容器浅析

    C STL 教程 C STL 教程 C vector 容器浅析 C vector 容器浅析 个人理解 vector就是一个模板类 具有元素多少可以变化的优点 一般为了根据数据类型 会选择显式实例化 下为一个利用vector模板 将一维数组转
  • 【华为OD统一考试B卷

    题目描述 一群大雁往南飞 给定一个字符串记录地面上的游客听到的大雁叫声 请给出叫声最少由几只大雁发出 具体的 1 大雁发出的完整叫声为 quack 因为有多只大雁同一时间嘎嘎作响 所以字符串中可能会混合多个 quack 2 大雁会依次完整发
  • blender 线框效果/Line Art

    Blender 2 93 新功能 Line Art 效果 哔哩哔哩 bilibilihttps www bilibili com video BV19Z4y1w7mk from search seid 1496511710922071136
  • 在Linux系统如何修改profile文件后立即生效呢?

    方法1 让 etc profile文件修改后立即生效 可以使用如下命令 etc profile 注意 和 etc profile 有空格 方法2 让 etc profile文件修改后立即生效 可以使用如下命令 source etc prof
  • go语言字符类型byte与rune

    字符串中的每一个元素叫做 字符 在遍历或者单个获取字符串元素时可以获得字符 Go语言的字符有以下两种 一种是 byte 型 是 uint8 的别名 代表了 ASCII 码的一个字符 另一种是 rune 类型 代表一个 UTF 8 字符 当需