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语言中的字符和字符串相关推荐

  1. C语言中的字符和字符串

    C语言在中常常出现字符和字符串,而一串字符或者字符串其实就是数组 字符数组的定义 char arr[]={'h','e','l','l','o','\0'}; 而定义字符串: char arr1[]= ...

  2. 查找字符串中指定字符的位置c语言,C语言中查找字符在字符串中出现的位置的方法...

    C语言strchr()函数:查找某字符在字符串中首次出现的位置 头文件:#include strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char * strchr (const ...

  3. C语言中的字符与字符串库函数的使用以及模拟实现

    目录 一.求字符串长度 1.strlen库函数如何使用? 2.如何模拟实现strlen函数 二.长度不受限制的字符串函数 1.库函数 strcpy 如何使用? 2.如何模拟实现 strcpy 函数? ...

  4. 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 ...

  5. android 数组赋值字符串_c语言中的字符数组与字符串

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...

  6. c 语言 字符 查找,C 语言实例 - 查找字符在字符串中出现的次数

    C 语言实例 - 查找字符在字符串中出现的次数 C 语言实例 C 语言实例 查找字符在字符串中的起始位置(索引值从 开始). 实例 #include int main() { char str[], ...

  7. C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

    C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...

  8. 2.3 Go语言中的字符型和常量定义

    字符类型 字符类型也是常用的类型之一,Go语言中的字符类型使用string关键字,我们对最早的hello, world示例进行改造. package mainimport "fmt" ...

  9. (四)C语言中的字符类型

    (四)C语言中的字符类型 C语言中的字符型数据分为字符和字符串数据两类.**字符数据是指由单引号括起来的单个字符,**如'a'.'2'.'&'等:字符串数据是指由双引号括起来的一串字符序列,如 ...

最新文章

  1. python 内推_网易有道2017内推编程题 洗牌(python)
  2. What you should know about .so files
  3. python语言怎么学-如何学习Python,以及新手如何入门?
  4. 解决GIT代码仓库不同步问题
  5. Linux中硬盘转速查看
  6. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例
  7. 大牛书单 | 云原生技术领域好书推荐
  8. ubuntu下修复U盘只读问题
  9. po 价格条件表_SAP 定价
  10. 扩展欧几里得算法(简单易懂,详细分析)
  11. Minpro-I编程器的驱动安装
  12. 用python在大麦网抢票_大麦网抢票python+selenium实现
  13. MySQL 视图(详解)
  14. python太阳花画法_Python——教你画朵太阳花
  15. Kubernetes的Startup, Liveness, Readiness深入探索
  16. 从深圳地铁看-------以损害乘客利益为目标的营运方式
  17. Kail教程(三)—私人订制(设置字体、netspeed流量监控 、文件目录)
  18. Android Studio中的keystore
  19. 1月13日科技资讯|苹果官网以旧换新价格暴跌;戴威退出 ofo 法人代表及高管;TensorFlow 2.1.0 发布
  20. 冒险者传说pc6java_我的世界1.10.2冒险者传说

热门文章

  1. 计算机组成mod2是什么意思,计算机组成原理 第2讲_数据表示.ppt
  2. thymeleaf th:href 多个参数传递格式
  3. 如何进行文件管理、备份
  4. 小学用计算机画画的课件,用计算机画图画.ppt
  5. Python入门--为什么将元组设计为不可变序列
  6. 关于Mysql模糊查询下划线的问题
  7. JQueryDOM之CSS操作
  8. access 此程序未正确安装_一款让“微软爸爸杀不死”的数据库软件——生于1992的Access...
  9. 蛮力法 —— 求解最大连续子序列和问题
  10. bzoj 1685: [Usaco2005 Oct]Allowance 津贴(贪心)