当前位置: 首页 > news >正文

【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' 721   '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.Pointerlen 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码找到字体包中的字。

相关文章:

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

系列文章合集 Golang - 90天从新手到大师 String 一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据&#xff0c;但是通常是用来包含人类可读的文本。 len()返回字符串字节数目&#xff08;不是rune数&#xff09;。 通过索引可以访问某个字节值&#xff0c;0…...

网络安全与区块链技术:信任与安全的融合

# 网络安全与区块链技术&#xff1a;信任与安全的融合 在网络空间&#xff0c;信任是一种宝贵而稀缺的资源。区块链技术以其独特的分布式账本、加密算法和共识机制&#xff0c;为构建网络安全提供了新的解决方案。本文将探讨网络安全与区块链技术如何融合&#xff0c;以增强信…...

MySQL之复制(九)

复制 复制管理和维护 确定主备是否一致 在理想情况下&#xff0c;备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误&#xff0c;备库同样可能因为MySQL自身的特性导致数据不一致&#xff0c;例如MySQL的Bug、网络中断、服务…...

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现 1、HashSet 的底层实现2、 HashSet 的特点3、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HashSet 是 Java 集合框架中的一个重要成员&#xff0c;它提供了不存储重复元素的集合。但是&am…...

爬虫经典案例之爬取豆瓣电影Top250(方法二)

在上一篇文章的基础上&#xff0c;改进了代码质量&#xff0c;增加了多个正则表达式匹配&#xff0c;但同事也增加了程序执行的耗时。 from bs4 import BeautifulSoup import requests import time import re from random import randint import pandas as pdurl_list [https…...

如何优化React应用的性能?

优化React应用的性能是一个多方面的过程&#xff0c;涉及到代码的编写、组件的设计、资源的管理等多个层面。以下是一些常见的性能优化策略&#xff1a; 避免不必要的渲染: 使用React.memo、useMemo和useCallback来避免组件或其子组件不必要的重新渲染。 代码分割: 使用React.…...

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…...

python数据分析与可视化

Python 在数据分析和可视化方面有着广泛的应用,并且拥有众多强大的库和工具来支持这些任务。以下是一些常用的 Python 库和它们的主要用途: 数据分析 Pandas: Pandas 是 Python 中用于数据处理和分析的主要库。 它提供了数据框(DataFrame)和序列(Series)两种数据结构…...

webkit 的介绍

WebKit 是一个开源的网页浏览器引擎&#xff0c;它是 Safari 浏览器和许多其他应用程序的基础。WebKit 最初由苹果公司开发&#xff0c;并在2005年作为开源项目发布。WebKit 的核心组件包括 WebCore 和 JavaScriptCore。以下是 WebKit 的详细介绍&#xff1a; ### WebKit 的主…...

make与makefile

目录 一、make的默认目标文件与自动推导 二、不能连续make的原因 执行原理 touch .PHONY伪目标 make指令不回显 makefile多文件管理 简写依赖方法 三、回车与换行 四、缓冲区 一、make的默认目标文件与自动推导 假设这是一个makefile文件&#xff0c;make的时候默认生…...

深度神经网络一

文章目录 深度神经网络 (DNN)1. 概述2. 基本概念3. 网络结构 深度神经网络的层次结构详细讲解1. 输入层&#xff08;Input Layer&#xff09;2. 隐藏层&#xff08;Hidden Layers&#xff09;3. 输出层&#xff08;Output Layer&#xff09;整体流程深度神经网络的优点深度神经…...

Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn

在探索现代 JavaScript 生态系统时&#xff0c;我们常常会遇到新兴技术的快速迭代和改进。其中&#xff0c;包管理工具的发展尤为重要&#xff0c;因为它们直接影响开发效率和项目性能。最近&#xff0c;pnpm 作为一种新的包管理工具引起了广泛关注。它不仅挑战了传统工具如 np…...

汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto

前言: 对于NXP的i.mx,如果基于linux开发,需要熟悉以下文档: IMX_YOCTO_PROJECT_USERS_GUIDE.pdf IMX_LINUX_USERS_GUIDE.pdf IMX_GRAPHICS_USERS_GUIDE.pdf 如果基于android开发,需要熟悉一下文档: Android_Auto_Quick_Start_Guide.pdf ANDROID_USERS_GUIDE.pdf …...

tessy 编译报错:单元测试时,普通桩函数内容相关异常场景

目录 1&#xff0c;失败现象 2&#xff0c;原因分析 1&#xff0c;失败现象 1&#xff0c;在 step 桩函数正常的情况下报错。 2&#xff0c;测试代码执行的数据流 和 step 桩函数内容不一致。 2&#xff0c;原因分析 桩函数分为 test object, test case, test step 三种类别。…...

计算机专业是否仍是“万金油”

作为一名即将参加高考的学生&#xff0c;我站在人生的分岔路口上&#xff0c;面临着选择大学专业的重大抉择。在这个关键节点&#xff0c;计算机相关专业是否仍是炙手可热的选择&#xff1f;  首先&#xff0c;从行业的角度来看&#xff0c;计算机相关专业确实在近年来持续火…...

雷池社区版自动SSL

正常安装雷池&#xff0c;并配置站点&#xff0c;暂时不配置ssl 不使用雷池自带的证书申请。 安装&#xff08;acme.sh&#xff09;&#xff0c;使用域名验证方式生成证书 先安装git yum install git 或者 apt-get install git 安装完成后使用 git clone https://gitee.com/n…...

怎样减少徐州服务器租用的成本?

服务器租用的出现&#xff0c;十分便于网络行业的发展&#xff0c;但是随着服务器租用的广泛应用&#xff0c;整体还是有着一定的成本的吗&#xff0c;不同的服务器类型在价格方面也是不同的&#xff0c;那么企业在选择服务器租用后&#xff0c;怎样才能减少服务器租用的成本呢…...

【性能优化】表分桶实践最佳案例

分桶背景 随着企业的数据不断增长&#xff0c;数据的分布和访问模式变得越来越复杂。我们前面介绍了如何通过对表进行分区来提高查询效率&#xff0c;但对于某些特定的查询模式&#xff0c;特别是需要频繁地进行数据联接查或取样的场景&#xff0c;仍然可能面临性能瓶颈。此外…...

数据仓库的挑战

建设数据仓库是一个复杂且资源密集的过程&#xff0c;需要考虑多个方面。以下是建设数据仓库时常见的挑战及其详细解释&#xff1a; 1. 数据集成 挑战&#xff1a; 数据来源多样&#xff1a;数据来自不同的系统、数据库、文件格式&#xff08;如CSV、JSON、XML&#xff09;、…...

基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)

引言 先看问题&#xff1a; 我手边有一数据集&#xff0c;然后我想分分类&#xff01;~~ 咳咳&#xff0c;最近刚做了一个&#xff1a;训练集有1143张&#xff0c;分为5类&#xff0c;里面图片是打乱的。测试集有248张&#xff0c;想把它分分类看看咋样。 再看一下效果: …...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...