Go语言中byte类型和rune类型(五)
本篇内容本来准备在上一篇写的,想了想还是拆开写。
go语言中字符串需要使用用双引号,而单引号用来表示单个的字符,字符也是组成字符串的元素。go语言的字符有两种:
uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。rune类型,代表一个UTF-8字符。
ASCII编码是1个字节,而UTF-8是可变长的编码,当要表示中文等非ASCll编码的字符时,需要使用UTF-8编码来保证不会乱码。
举个例子,来遍历打印一个字符串,当使用byte类型时:
func main() {
str:="hello 世界"
for i:=0;i<len(str);i++{
fmt.Printf("%c",str[i]) // hello ä¸ç
}
}
上面结果,英文字符正确打印,但中文乱码。是因为UTF8编码下一个中文汉字由3~4个字节组成,而字符串是由byte字节组成,所以长度也是byte字符长度,这样遍历时遇到中文就乱码了。
遇到这种带中文的字符串,可以使用go提供的另一个方法来遍历:
func main() {
str:="hello 世界"
for _,r:=range str{
fmt.Printf("%c",r) // hello 世界
}
}
使用range,其实是使用rune类型来编码的,rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
修改字符串
所谓对字符串的修改其实不是对字符串本身的修改,而是复制字符串,同时修改值,即重新分配来内存。
在go中修改字符串,需要先将字符串转化成数组,[]byte 或 []rune,然后再转换成 string型。
对于全是ASCII编码的字符串:
func main() {
str:="abc"
s2:=[]byte(str)
s2[0]='b'
fmt.Println(string(s2)) //bbc
}
对于包含非ASCII编码的字符串:
func main() {
str:="白猫"
s2:=[]rune(str)
s2[0]='黑'
fmt.Println(string(s2)) //黑猫
}
上面使用到的 string(),表示强制类型转换,转换为字符串。
本篇主要介绍 byte 和 rune 两种类型的字符,涉及到的for循环和强制类型转换可以简单了解下,有编程基础的很容易懂。
Go语言中byte类型和rune类型(五)的更多相关文章
- 着重基础之—MySql Blob类型和Text类型
着重基础之—MySql Blob类型和Text类型 在经历了几个Java项目后,遇到了一些问题,在解决问题中体会到基础需要不断的回顾与巩固. 最近做的项目中,提供给接口调用方数据同步接口,传输的数据格 ...
- 关于C语言中的Complex(复数类型)和imaginary(虚数类型)
关于C语言中的Complex(复数类型)和imaginary(虚数类型) 其实这里的复数complex就是数学里的复数,包含实部和虚部两个部分,比如:x=2.1+6i,下面进行详细介绍. C99 新增 ...
- MIME类型和Java类型
MIME类型和Java类型 类型转换Spring Cloud Stream提供的开箱即用如下表所示:“源有效载荷”是指转换前的有效载荷,“目标有效载荷”是指转换后的“有效载荷”.类型转换可以在“生产者 ...
- DATETIME类型和BIGINT 类型互相转换
项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...
- Timestame类型和String 类型的转化
Timestame类型和String 类型的转化 String转化为Timestamp: SimpleDateFormat df = new SimpleDateFormat("yyyy-M ...
- Python3.x中bytes类型和str类型深入分析
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...
- Date类型和Long类型的相互转换
Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...
- java中XMLGregorianCalendar类型和Date类型之间的相互转换
import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...
- 关于 Go 中 Map 类型和 Slice 类型的传递
关于 Go 中 Map 类型和 Slice 类型的传递 Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Printl ...
随机推荐
- oracle 循环的一种写法
for v_n in( select bb.temNum, bb.LOANTYPE from (select decode(bns.assignstate, '{016D68F9-719B-4EFC- ...
- C++:std::map的遍历
for (auto &kv : myMap) { count<<kv.first<<" has value "<<kv.second&l ...
- head first 设计模式笔记3-装饰者模式:星巴兹饮料
开放原则:类应该对扩展开放,对修改关闭. - 上篇博客中的观察者模式中,通过加入新的观察者,我们可以在任何时候扩展主题(Subject),而且不需向主题中添加代码. - 装饰者模式也完全遵循开放原则. ...
- Confluence 6 文件
通过将你的文件上传到 Confluence 能够让你在一个统一的地方分享你项目小组的 PDF 文件,Office 文档,图片以及更多的内容. 自动版本,即时预览,权限控制和全文搜索意味着在网络驱动器上 ...
- scrapy项目5:爬取ajax形式加载的数据,并用ImagePipeline保存图片
1.目标分析: 我们想要获取的数据为如下图: 1).每本书的名称 2).每本书的价格 3).每本书的简介 2.网页分析: 网站url:http://e.dangdang.com/list-WY1-dd ...
- JIRA7.13版本创建项目:字段和界面(三)
这是我从网上找的资料和最新版的相差不大,可以借鉴原文链接:http://ju.outofmemory.cn/entry/367224 项目的版本号取决于修复版本,不是影响版本 字段 我们已经知道如何在 ...
- 实验吧(你真的会PHP吗)CTF之代码审计最终版---解析是错的 我的才是对的
0X01代码的详细讲解 0X02代码分析完了 我们来理一下 思路 条件 A POST提交一个number参数的值不能为纯数字 C number取整数后是回文数 D number经过strval转译后的 ...
- 「POI 2010」Bridges
题目链接 戳我 \(Solution\) 看到"最大值最小",就知道应该要二分 二分之后,对于每个\(mid\),只要计算小于\(mid\)的边,然后在剩下的图中判断有无欧拉回路 ...
- 2019年9月17 发布 Java 13
Java 13 明天发布,最新最全新特性解读 2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 目前,JDK官网 ...
- LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
题目描述 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也 ...