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.

相关文章
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
533 3
|
数据安全/隐私保护
【Azure Function App】PowerShell Function 执行 Get-AzAccessToken 的返回值类型问题:System.String 与 System.Security.SecureString
将PowerShell Function部署到Azure Function App后,Get-AzAccessToken返回值类型在不同环境中有差异。正常为SecureString类型,但部分情况下为System.String类型,导致后续处理出错。解决方法是在profile.ps1中设置环境变量$env:AZUREPS_OUTPUT_PLAINTEXT_AZACCESSTOKEN=false,以禁用明文输出。
373 1
|
存储 JSON Go
Go语言之空接口与类型断言
本文介绍了 Go 语言中空接口(`interface{}`)和类型断言的核心概念及其应用。空接口可存储任意类型数据,适用于通用函数、动态数据结构与 JSON 解析等场景;类型断言用于将接口变量还原为具体类型,推荐使用带 `ok` 的写法以避免程序崩溃。此外,文章通过示例讲解了 `type switch` 类型判断与 JSON 处理技巧,并总结了空接口的注意事项,强调滥用可能导致类型安全性降低。内容深入浅出,帮助开发者灵活运用这些特性。
454 15
|
算法 Go
Go语言模拟集合类型-《Go语言实战指南》
在 Go 语言中,虽然没有内建的集合(Set)类型,但可以通过 `map` 实现其功能。常用方式包括 `map[T]bool` 和更节省内存的 `map[T]struct{}`。前者以布尔值表示元素存在性,后者利用零内存开销的空结构体。文章介绍了集合的基本操作(添加、删除、判断、遍历),并通过封装示例展示如何创建自定义 Set 类型。这种实现方式适用于去重、唯一标记及集合运算等场景,简洁高效且易于扩展。
|
存储 JSON JavaScript
[go]byte类型, string 类型, json 类型
本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。
503 2
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
533 10
|
算法 测试技术 Go
Go 1.24.0 重磅发布:新特性、新工具,开发者必看!
`Go 1.24.0` 已正式发布,带来诸多改进和新特性。语言层面上,泛型类型别名现已被完全支持;性能方面,通过优化 `map` 实现和内存分配,减少了 2-3% 的 CPU 开销;工具链新增模块工具依赖跟踪及测试分析器;标准库增加了弱引用包、FIPS 140-3 合规机制等;WebAssembly 支持也得到了增强。快来下载体验吧!
1062 15
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
312 5
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
667 4
go语言常量的类型
【10月更文挑战第20天】
247 2

热门文章

最新文章