go string类型的特性

简介: 获取ascii类型字符的长度个数和获取utf8类型字符长度的个数

参考文章: http://c.biancheng.net/view/36.html


1. 获取ascii类型字符的长度个数和获取utf8类型字符长度的个数


a. len("咪咪")  //return 6 这获取的是ASCII长度


b.utf8.RuneCountInString("咪咪") // return 2获取的是utf8汉字长度个数


2. 字符串遍历, 以ASCII方式遍历和以Unicode方式遍历


// 测试字符串长度
str := "我是 abcd"
// ASCII码类型遍历
for i := 0; i < len(str); i++ {
  fmt.Printf("ASCII  %c, %d\n", str[i], str[i])
}
// unicode码类型遍历
for _, s := range str {
  fmt. Printf("Unicode  %c, %d \n", s, s)
}


输出结果


ASCII  æ, 230
ASCII  ˆ, 136
ASCII  ‘, 145
ASCII  æ, 230
ASCII  ˜, 152
ASCII  ¯, 175
ASCII   , 32
ASCII  a, 97
ASCII  b, 98
ASCII  c, 99
ASCII  d, 100
Unicode  我, 25105 
Unicode  是, 26159 
Unicode   , 32 
Unicode  a, 97 
Unicode  b, 98 
Unicode  c, 99 
Unicode  d, 100 


可以看到以ASCII方式插入的代码是有乱码的, 我们可以以unicode方式打印处理. 这两者的区别在于使用哪一种for循环


ASCII: 使用for 下标遍历, 后面的数字表示的是在ASCII中的编码.


Unicode: 使用 for range遍历. 后面的数字表示的是, 在unicode中的编码

 

扩展: UTF-8 和 Unicode 有何区别?


Unicode 与 ASCII 类似,都是一种字符集。


字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。


UTF-8 是编码规则,将 Unicode 中字符的 ID 以某种方式进行编码,UTF-8 的是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:


  • 0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。


  • 从 128 到 0x10ffff 表示其他字符。


根据这个规则,拉丁文语系的字符编码一般情况下每个字符占用一个字节,而中文每个字符占用 3 个字节。


广义的 Unicode 指的是一个标准,它定义了字符集及编码规则,即 Unicode 字符集和 UTF-8、UTF-16 编码等。


参考: http://c.biancheng.net/view/18.html


3. 类型强转


1 //类型强转
2 str := "这是一个aaa"
3 bytestr := []byte(str)
4 fmt.Println(bytestr)
5 fmt.Println(string(bytestr))


a. string强转成byte: []byte(str)


b. byte强转成string: string(byte)


4. 高效字符串拼接方式


1 //字符串拼接
 2 hammer := "吃我一锤"
 3 sickle := "死吧"
 4 
 5 /** 普通字符串拼接方式 */
 6 hammer += sickle
 7 fmt.Println(hammer)
 8 fmt.Println(sickle)
 9 
10 /** 高效字符串连接的方式 */
11 // 声明字节缓冲区
12 var stringBuilder bytes.Buffer
13 
14 //把字符串写入缓冲
15 stringBuilder.WriteString(hammer)
16 stringBuilder.WriteString(sickle)
17 
18 // 将缓冲以字符串形式输出
19 fmt.Println(stringBuilder.String())


输出:


1 吃我一锤死吧
3 死吧
4 吃我一锤死吧死吧


简单的东西未必高效。除了加号连接字符串,Go 语言中也有类似于 StringBuilder 的机制来进行高效的字符串连接


5. 常用的一些格式化样式中的动词及功能


表:字符串格式化时常用动词及功能


动  词 功  能
%v 按值的本来值输出
%+v 在 %v 基础上,对结构体字段名和值进行展开
%#v 输出 Go 语言语法格式的值
%T 输出 Go 语言语法格式的类型和值
%% 输出 % 本体
%b 整型以二进制方式显示
%o 整型以八进制方式显示
%d 整型以十进制方式显示
%x 整型以十六进制方式显示
%X 整型以十六进制、字母大写方式显示
%U Unicode 字符
%f 浮点数
%p 指针,十六进制方式显示


6.


7.

相关文章
|
4月前
|
JSON 安全 前端开发
类型安全的 Go HTTP 请求
类型安全的 Go HTTP 请求
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
54 4
|
1月前
|
Go
go语言常量的类型
【10月更文挑战第20天】
29 2
|
1月前
|
并行计算 安全 Go
Go语言的并发特性
【10月更文挑战第26天】Go语言的并发特性
19 1
|
2月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
67 4
|
2月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
29 3
|
2月前
|
安全 Java Go
Go语言的其他特性
【10月更文挑战第10天】Go语言的其他特性
|
3月前
|
存储 Go
Go: struct 结构体类型和指针【学习笔记记录】
本文是Go语言中struct结构体类型和指针的学习笔记,包括结构体的定义、成员访问、使用匿名字段,以及指针变量的声明使用、指针数组定义使用和函数传参修改值的方法。
|
3月前
|
安全 Go C语言
Go常量的定义和使用const,const特性“隐式重复前一个表达式”,以及iota枚举常量的使用
这篇文章介绍了Go语言中使用`const`定义常量的方法,包括常量的特性“隐式重复前一个表达式”,以及如何使用`iota`实现枚举常量的功能。
|
4月前
|
安全 Go