【Golang - 90天从新手到大师】Day09 - string

  系列文章合集

Golang - 90天从新手到大师


String

一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,但是通常是用来包含人类可读的文本。

len()返回字符串字节数目(不是rune数)。

通过索引可以访问某个字节值,0 <= index < len(str)。越界会panic。索引不是对应的字符而是对应的字节,因为有有非ASCII的UTF8字符有多个字节。

​​​​​​​s := "hello, world"

fmt.Println(len(s))     // "12" 英文字符占一个字节
fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')
for range

循环是循环的字节,而非字符

for i, r := range "Hello, 世界ꡐ" {
    fmt.Printf("%d\t%q\t%d\n", i, r, r)
}
​​​​​​​0   'H' 72

1   'e' 101
2   'l' 108
3   'l' 108
4   'o' 111
5   ',' 44
6   ' ' 32
7   '世' 19990
10  '界' 30028
13  'ꡐ' 43088


第三列是字符的码点。
 

字符串截取与链接
fmt.Println(s[:5]) // "hello"
fmt.Println(s[7:]) // "world"
fmt.Println(s[:])  // "hello, world"
fmt.Println("hi" + s[5:]) //hi world
比较
1 字符串可以用==和<进行比较。通过逐个字节比较完成的,因此比较的结果是字符串自然编码的顺序。
2 原生字符

使用`反引号括起来,没有转义操作。
应用:HTML模板、JSON面值、命令行提示信息等。

编码

1 Unicode让我们可以通过Unicode码点输入特殊的字符。有两种形式:\uhhhh对应16bit的码点值,\Uhhhhhhhh对应32bit的码点值,其中h是一个十六进制数字,每一个对应码点的UTF8编码。以下表示相同字符:

"世界"
"\xe4\xb8\x96\xe7\x95\x8c"
"\u4e16\u754c"
"\U00004e16\U0000754c"

2 对于小于256码点值可以写在一个十六进制转义字节中,例如'\x41'对应字符'A',但是对于更大的码点则必须使用\u或\U转义形式。因此,'\xe4\xb8\x96'并不是一个合法的rune字符,虽然 这三个字节对应一个有效的UTF8编码的码点。
3 字符串长度用utf8.RuneCountInString(s)来获取。

rune

1 Unicode码点对应Go语言中的rune整数类型。
2 因为 rune大小一致,所以支持数组索引和方便切割。

string与[]rune转换
r := []rune("你好 world!")
fmt.Printf("%x\n",  r) // "[4f60 597d 20 77 6f 72 6c 64 21]"
fmt.Println(string(r)) // "你好 world"
}
fmt.Println(string(65)) // "A", not "65" 整形字符串输出为unicode码点的utf8字符串。
fmt.Println(string(0x4eac)) // "京"
对字符串操作的4个包bytes、strings、strconv、unicode包
  • bytes包操作[]byte。因为字符串是只读的,因此逐步构创建字符串会导致很多分配和复制。使用 bytes.Buffer类型会更高。

  • strings包提供切割,索引,前缀,查找替换等功能。

  • strconv包提供了布尔型、整型数、浮点数和对应字符串的相互转换,还提供了双引号转义相 关的转换。

  • unicode包提供了IsDigit、IsLetter、IsUpper和IsLower等类似功能,它们用于给字符分类。

字符串与数字转换

将一个整数转为字符串

x := 123
fmt.Println(strconv.Itoa(x)) // "123"

​​​​​​​将一个字符串解析为整数

x, err := strconv.Atoi("123") // x is an int
y, err := strconv.ParseInt("123", 10, 64) 

​​​​​​​FormatInt和FormatUint函数可以用不同的进制来格式化数字:

fmt.Println(strconv.FormatInt(int64(23), 2)) //将int64转换成2进制
 

底层原型及编码

#runtime/string.go
type stringStruct struct {
    str unsafe.Pointer
    len int
}

从字符串定义可以看出字符串是一个结构体,包含字符串指针和长度。
测试代码见下方:

package main
var s string
func main()  {
    s = "123 你好 world!"
}

​​​​​​​编译及通过gdb查看变量s的内存数据分布见图1:

图片

图1

从上图可得知字符串数字123占3个字节分别为0x31 0x32 0x33。分别对应的是ascii。

"\344\275\240\345\245\275"是8进制表示的你好。
"0xe4 0xbd 0xa0 0xe5 0xa5 0xbd"是16进制表示的你好。

​​​​​​​那计算机是如何识别是ascii还是unicode的呢,内存中存储的都是以字节为单元的,相邻哪几个是组成一个汉字呢?为了说明这个问题还是看一下上图1以”好“这个字说明,见下表格:

8进制345245275
16进制0xe50xa50xbd
2进制111001011010010110111101

“好”字的依据图2可知,unicode的十六进制值为\u597d。
参考:https://www.unicode.org/charts/PDF/Unicode-5.2/U52-4E00.pdf

图片

图2

那如何将3个字节转换成unicode的呢?
根据utf8编码规则见图3-go语言圣经截图:

图片

图3-go语言圣经截图


发现好字的2进制表示正好符合1110xxxx  10xxxxxx  10xxxxxx
所以计算机识别的时候只要识别到1110且后两个字节的前2位都是10那这3个字节组成的就表示成一个字。
具体如何将这3个字节转换成unicode,有兴趣的朋友可以查查。
转换成unicode之后就可以根据unicode码找到字体包中的字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/726847.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 头像是圆形,hover上去时头像出现黑色半透明样式,且中间显示修改两字的实现

实现效果 原头像 hover效果 实现方式 博主在实际开发过程中使用mouseover和mouseout会出现无法点击或hover频繁闪动的问题&#xff0c;故这里采用的是css中的hover&#xff0c;利用hover也能轻松实现上述效果&#xff0c;且完全不会影响点击事件的使用。 <template> &…

Walrus:去中心化存储和DA协议,可以基于Sui构建L2和大型存储

Walrus是为区块链应用和自主代理提供的创新去中心化存储网络。Walrus存储系统今天以开发者预览版的形式发布&#xff0c;面向Sui开发者征求反馈意见&#xff0c;并预计很快会向其他Web3社区广泛推广。 通过采用纠删编码创新技术&#xff0c;Walrus能够快速且稳健地将非结构化数…

实践分享|关于 nebula-stats-exporter 的使用

大家好&#xff0c;这里是玖叁叁&#xff0c;目前从事全栈工程师工作&#xff0c;刚刚接触 NebulaGraph 不久&#xff0c;还在努力学习当中。图数据库可以高效地表达、存储和分析复杂关系和网络&#xff0c;在特定场景下有着不错的性能。希望通过这篇 nebula-stats-exporter 的…

从0-1实现一个自己的脚手架

当我们在开发的时候&#xff0c;时常会在创建项目的时候重复很多操作&#xff0c;比如下载相同的依赖(锁定依赖版本)、封装网络请求、封装路由、配置代码提示/检查、配置vite/webpack打包、配置自动导入(auto-import)、配置项目基础结构、注册全局指令等&#xff0c;有非常多重…

连锁餐厅降低员工离职率:发誓!绝不是靠“舌尖上的诱惑”

员工社交与成长&#xff0c;企业福利与文化&#xff0c;沃可趣多维度优化员工体验。 连锁餐饮业在全球范围内迅速发展&#xff0c;要为消费者提供更多便利&#xff0c;2023年中国餐饮市场连锁化率达到21%。 然而&#xff0c;这些分散式门店为企业运营创造了挑战。Black Box I…

爬山算法优点

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

前端练习小项目——视觉冲击卡片

前言&#xff1a; 前言&#xff1a;在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了&#xff0c;本篇文章所讲的小项目为——视觉冲击卡片 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下效果&a…

美国铁路客运巨头Amtrak泄漏旅客数据,数据销毁 硬盘销毁 文件销毁

旅客的Guest Rewards常旅客积分账户的个人信息被大量窃取。 美国国家客运铁路公司&#xff08;Amtrak&#xff09;近日披露了一起数据泄露事件&#xff0c;旅客的Guest Rewards常旅客积分账户的个人信息被大量窃取。 根据Amtrak向马萨诸塞州提交的泄露通知&#xff0c;5月15日…

微信小程序navigateTo异常(APP-SERVICE-SDK:Unknown URL)

背景 在开发小程序时&#xff0c;可能会用到banner&#xff0c;通过banner跳转至各种子页面。但是因为小程序自身的因素&#xff0c;有些是不允许的&#xff0c;比如通过banner跳转一个http/https链接。如果使用 wx.navigateTo完成跳转时&#xff0c;就会发生异常。 navigate…

HarmonyOS模拟器(phone-x86-api9)一直卡顿的解决方法

在DevEco Studio 3.1.1 Release版本中的Device Manager中创建本地的模拟器&#xff0c;创建phone-x86-api9模拟器成功&#xff0c;但是启动该新建的模拟器一直显示"HarmonyOS"logo图片&#xff0c;然后一直卡在这里&#xff0c;运行结果如下所示&#xff1a; 检查模…

分布式锁三种方案

基于数据库的分布式锁&#xff08;基于主键id和唯一索引&#xff09; 1基于主键实现分布式锁 2基于唯一索引实现分布式锁 其实原理一致&#xff0c;都是采用一个唯一的标识进行判断是否加锁。 原理&#xff1a;通过主键或者唯一索性两者都是唯一的特性&#xff0c;如果多个…

Ike-scan一键发现通过互联网的IPsec VPN服务器(KALI工具系列二十八)

目录 1、KALI LINUX 简介 2、Ike-scan工具简介 3、信息收集 3.1 目标主机IP&#xff08;服务器&#xff09; 3.2 KALI的IP 4、操作示例 4.1 简单扫描 4.2 范围扫描 4.3 扫描多个目标 4.4 输出扫描结果 4.5 特殊扫描 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功…

区块链技术:探索7个物联网应用的潜力

在当今数字化时代&#xff0c;区块链技术逐渐成为一种受到广泛关注的技术创新。本文将以《区块链技术&#xff1a;探索7个物联网应用的潜力》为题&#xff0c;介绍区块链技术在物联网领域的七个应用潜力。物联网作为未来发展的重要方向&#xff0c;结合区块链技术的应用将为我们…

SAP PI/PO获取文件名及路径

Sender Adapter设置如下&#xff1a; UDF定义如下&#xff1a; DynamicConfiguration conf (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION); //get file name DynamicConfigurationKey keyFile…

r2frida:基于Frida的远程进程安全检测和通信工具

关于r2frida r2frida是一款能够将Radare2和Frida的功能合二为一的强大工具&#xff0c;该工具本质上是一个Radare2的自包含插件&#xff0c;可以帮助广大研究人员利用Frida的功能实现对目标进程的远程安全检测和通信管理。 Radare2项目提供了针对逆向工程分析的完整工具链&…

[Shell编程学习路线]——for循环应用技巧 语法和案例

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点21分 &#x1f004;️文章质量&#xff1a;96分 目录 ————前言———— for 循环语句 基本结构 图示原理…

设计程序,实现高精度圆周率的计算和存储,使用线性表突破程序设计语言内置变量的数值和有效数字范围限制

一、使用线性表突破程序设计语言内置变量的数值和有效数字范围的限制&#xff0c;为了实现高精度圆周率的计算&#xff0c;先根据数学公式进行对PI高精度运算&#xff0c;如图1-1。根据这个数学公式 π2 0nn!2n1‼ 即 Rn1Rn*n2n1&#xff0c;R11&#xff0c;sum π2* n1∞Rn 来…

02 Pytorch_NLP

1. N-gram n决定关联信息 2. TF____IDF TF&#xff1a;词频 IDF&#xff1a;逆向序列 假如&#xff1a;TF * IDF 就是当前的文件&#xff0c;那么乘积反而更大&#xff01; 因为它只出现在 特定的文章中&#xff01; TF-IDF 简介 TF-IDF&#xff08;Term Frequency-Inverse…

Ansys Mechanical|学习方法

Ansys Mechanical是Ansys的旗舰产品之一&#xff0c;涉及的学科体系全面丰富&#xff0c;包括的力学分支主要有理论力学&#xff0c;振动理论&#xff0c;连续介质力学&#xff0c;固态力学&#xff0c;物理力学&#xff0c;爆炸力学及应用力学等。 在自媒体及数字经济飞速发展…

【CSS in Depth2精译】1.2 继承~1.3 特殊值

文章目录 1.2 继承1.3 特殊值1.3.1 inherit 关键字1.3.2 initial 关键字1.3.3 unset 关键字1.3.4 revert 关键字 1.2 继承 除了层叠&#xff0c;还有一种给元素设置样式的方式&#xff1a;继承。经常有人把层叠与继承的概念弄混淆。它们虽然有关联&#xff0c;但也应该分辨清楚…