Go语言中的字符和字符串
Go语言中的字符
在Go语言中,没有字符类型,字符类型是rune类型,rune是int32的别称。
下面用一个简单的程序来演示字符类型:
package mainimport ("fmt""reflect"
)func main() {r := '我'fmt.Printf("%q的类型为:%t 二进制为:%b\n", r, r, r)rType := reflect.TypeOf(r).Kind()fmt.Printf("r的实际类型为:%s\n", rType)
}
程序输出:
'我'的类型为:%!t(int32=25105) 二进制为:110001000010001
r的实际类型为:int32
Go语言天生支持Unicode,那我产生一个问题:Unicode字符的长度是多少?
这个问题的问法有没有问题?其实仔细想想,这样问是有问题的。首先,Unicode的基础是一个有编号的字符集,在字符集之上又规定了模块化的编码等等技术层次,各种具体的编码形式并不一致。因此,严格来说,Unicode是没有“长度”这一说的,它是抽象的字符,只有Unicode的编码才有具体的字节长度。而且不同的编码实现,长度也不一样。
Unicode 目前规划的总空间是17个平面(平面0至16),每个平面有 65536 个码点。我们常用的平面0(「Basic Multilingual Plane」,即「BMP」)码点范围为0x0000 至 0xFFFF,这并不是 Unicode 的全部。
BMP 的字符是 Unicode 中最基础和最常用的一部分,以 UTF-16 编码时使用2字节,以 UTF-8编码时使用1至3字节。超出 BMP 的字符以 UTF-16 或 UTF-8 编码都需要4字节。另外还有一个比较少用的编码形式,UTF-32,它编码任何 Unicode 字符都需要4个字节。
Go语言中的字符串
Go语言的字符串有两种方式来表示:
- 双引号,可以使用转义字符,如
s := "Go语言字符串\n不能跨行赋值"
- 反引号,字符串跟反引号中的格式一样,即Raw Type
s := `Go原格式字符串可以跨行`
Go语言的字符串是以UTF-8格式编码并存储的,下面有一个简单的例子:
package mainimport ("fmt"
)func main() {s := "我"fmt.Printf("s的类型为:%t, 长度为:%d, 16进制为:%x\n", s, len(s), s)for i, b := range []byte(s) {fmt.Printf("第%d个字节为:%b\n", i, b)}
}
程序输出:
s的类型为:%!t(string=我), 长度为:3, 16进制为:e68891
第0个字节为:11100110
第1个字节为:10001000
第2个字节为:10010001
变量s中存放的是这个字符串的UTF-8编码,当你使用len(s)函数获取字符串的长度时,获取的是该字符串的UTF-8编码长度,存储一个字符可能需要 2个、3个或者4个字节,它是不固定的。
UTF-8的编码遵循如下2条规则:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
- 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
根据这两条简单的规则,我们可以把UTF-8编码转换为Unicode的码点:
//utf8转为unicode1110 0110 1000 1000 1001 0001 // s0110 00 1000 01 0001 // s utf8 -> unicode0000 0000 0110 0010 0001 0001 // s utf8 -> unicode
0000 0000 0000 0000 0110 0010 0001 0001 // r
我们可以看到上面推导的结果跟程序的输出结果相符。
参考
- 字符编码笔记:ASCII,Unicode和UTF-8
转载于:https://www.cnblogs.com/gowk/p/char-and-string-in-go.html
Go语言中的字符和字符串相关推荐
- C语言中的字符和字符串
C语言在中常常出现字符和字符串,而一串字符或者字符串其实就是数组 字符数组的定义 char arr[]={'h','e','l','l','o','\0'}; 而定义字符串: char arr1[]= ...
- 查找字符串中指定字符的位置c语言,C语言中查找字符在字符串中出现的位置的方法...
C语言strchr()函数:查找某字符在字符串中首次出现的位置 头文件:#include strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char * strchr (const ...
- C语言中的字符与字符串库函数的使用以及模拟实现
目录 一.求字符串长度 1.strlen库函数如何使用? 2.如何模拟实现strlen函数 二.长度不受限制的字符串函数 1.库函数 strcpy 如何使用? 2.如何模拟实现 strcpy 函数? ...
- C语言中的字符函数和字符串函数
目录 前言 1.常用函数介绍 1.1 strlen 1.2 stycpy 1.3 strcat 1.4 strcmp 1.5 strncpy 1.6 strncat 1.7 strncmp 1.8 s ...
- android 数组赋值字符串_c语言中的字符数组与字符串
1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...
- c 语言 字符 查找,C 语言实例 - 查找字符在字符串中出现的次数
C 语言实例 - 查找字符在字符串中出现的次数 C 语言实例 C 语言实例 查找字符在字符串中的起始位置(索引值从 开始). 实例 #include int main() { char str[], ...
- C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符
C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...
- 2.3 Go语言中的字符型和常量定义
字符类型 字符类型也是常用的类型之一,Go语言中的字符类型使用string关键字,我们对最早的hello, world示例进行改造. package mainimport "fmt" ...
- (四)C语言中的字符类型
(四)C语言中的字符类型 C语言中的字符型数据分为字符和字符串数据两类.**字符数据是指由单引号括起来的单个字符,**如'a'.'2'.'&'等:字符串数据是指由双引号括起来的一串字符序列,如 ...
最新文章
- python 内推_网易有道2017内推编程题 洗牌(python)
- What you should know about .so files
- python语言怎么学-如何学习Python,以及新手如何入门?
- 解决GIT代码仓库不同步问题
- Linux中硬盘转速查看
- 【机器学习实战】Machine Learning in Action 代码 视频 项目案例
- 大牛书单 | 云原生技术领域好书推荐
- ubuntu下修复U盘只读问题
- po 价格条件表_SAP 定价
- 扩展欧几里得算法(简单易懂,详细分析)
- Minpro-I编程器的驱动安装
- 用python在大麦网抢票_大麦网抢票python+selenium实现
- MySQL 视图(详解)
- python太阳花画法_Python——教你画朵太阳花
- Kubernetes的Startup, Liveness, Readiness深入探索
- 从深圳地铁看-------以损害乘客利益为目标的营运方式
- Kail教程(三)—私人订制(设置字体、netspeed流量监控 、文件目录)
- Android Studio中的keystore
- 1月13日科技资讯|苹果官网以旧换新价格暴跌;戴威退出 ofo 法人代表及高管;TensorFlow 2.1.0 发布
- 冒险者传说pc6java_我的世界1.10.2冒险者传说
热门文章
- 计算机组成mod2是什么意思,计算机组成原理 第2讲_数据表示.ppt
- thymeleaf th:href 多个参数传递格式
- 如何进行文件管理、备份
- 小学用计算机画画的课件,用计算机画图画.ppt
- Python入门--为什么将元组设计为不可变序列
- 关于Mysql模糊查询下划线的问题
- JQueryDOM之CSS操作
- access 此程序未正确安装_一款让“微软爸爸杀不死”的数据库软件——生于1992的Access...
- 蛮力法 —— 求解最大连续子序列和问题
- bzoj 1685: [Usaco2005 Oct]Allowance 津贴(贪心)