Golang数据类型(字符串)

news2025/2/23 20:14:16

字符串重要概念

根据Go语言官方的定义: In Go, a string is in effect a read-only slice of bytes.
意思是Go中的字符串是一组只读的字节切片(slice of bytes),每个字符串都使用一个或多个字节表示(当字符为 ASCII 码表上的字符时占用 1 个字节,比如英文字母,其它字符根据需要占用 2-4 个字节,比如汉语、日语中的汉字、平假名、片假名等)。
  • Go中的字符串使用的是UTF-8编码
  • Go中的纯英文字符串的字节切片长度和它的字母个数完全相等,比如test这个英文单词有4个字母,那么,len("test")返回的值也为4
因为英文字母的编码为ASCII,可以用字节表示。 而其他需要用Unicode编码的语言,比如中文字符串,那么它的字节切片长度往往不会等于它的文字个数,比如"测试"这个词语虽然只包含两个汉字,但是len("测试")会返回6,因为"测"字和"试"字分别需要用3个字节来表示,总共占用6个字节

[c-alert type=“info”]那就有一个疑问了,怎么样才能让中文按字数显示长度呢?[/c-alert]

使用golang中的Rune切片(Rune Slice) 点击查看

  • Go语言中声明一个字符串变量只能用双引号""或者反勾号(backtick,‘’) 在Go中单引号只能用来声明单一字符(character),即rune

 

字符串格式化

Go语言也支持字符串格式化

format()函数以及f-strings三种方式来做字符串格式化,字符串格式化在Go中的的形式较为单一,我们可以通过fmt.Printf()配合取模运算符%来实现字符串格式化,举例如下:

var string1 string = "我是字符串1"
	var int_value int = 100
	var string2 string = "我是字符串2"
	var float_value1 float64 = 3.14
	fmt.Printf("%s %d\n", string1, int_value)
	fmt.Printf("%s %f\n", string2, float_value1)

 

在Go中使用取模运算符来做字符串格式化时,常见的格式码(format code)如下:

格式化输出的各种格式

  1. %v: 通用格式,将变量的默认格式输出。
  2. %T: 变量的类型。
  3. %d: 十进制整数。
  4. %b: 二进制表示的整数。
  5. %o: 八进制表示的整数。
  6. %x: 十六进制表示的整数,使用小写字母。
  7. %X: 十六进制表示的整数,使用大写字母。
  8. %s: 字符串。
  9. %q: 带有双引号的字符串。
  10. %f: 浮点数,默认精度。
  11. %e,%E: 科学计数法表示的浮点数,%e 使用小写字母,%E 使用大写字母。
  12. %g,%G: 根据实际情况选择 %e 或 %f 以产生更紧凑的(无末尾的零)输出,%g 使用小写字母,%G 使用大写字母。
  13. %t: 布尔值,true 或 false。
  14. %p: 指针,以十六进制表示。
  15. %%: 百分号本身。
其实有两种输出供我们选择

第一种,直接输出

       username := "linrux"
	age := 18
	address := "beijing"
	mobile := "123456777"
fmt.Printf("用户名:%s, 年龄:%d, 地址:%s, 电话:%s\r\n", username, age, address, mobile)</code></pre>

输出:

 

这种方式使用 %s、%d 等格式化占位符,通过 Printf 函数直接输出格式化后的字符串。

第二种,拼接后再输出

username := "linrux"
age := 18
address := "beijing"
mobile := "123456777"

msg := fmt.Sprintf(“用户名:%s, 年龄:%d, 地址:%s, 电话:%s\r\n”, username, age, address, mobile)
fmt.Println(msg)
输出:

 

这种方式使用 Sprintf 函数将格式化后的字符串保存在一个变量中,然后通过 Println 函数打印这个变量。

字符串的拼接

Go语言中做字符串拼接的方式很多,主要有字符串拼接符“+”、strings.Join()、bytes.Buffer、strings.Builder等四种形式来实现字符串的拼接(从严格意义上来说,上面讲到的字符串格式化也属于字符串拼接的一种),下面一一举例讲解它们的使用方法及区别:

字符串拼接符“+”

字符串拼接符“+”是最常见也是最为简单的字符串拼接方式,在Go用“+”号做拼接前需要确保做拼接的变量的数据类型为字符串,如果不是字符串,则必须用fmt.Sprint()将其转换成字符串才能完成拼接,否则系统会返回"mismatched types string and int"的异常,如下:
func main() {
	var string1 string = "我是字符串1"
	var int_value int = 100
	var string2 string = "我是字符串2"
	var float_value1 float64 = 3.14
	fmt.Printf(string1 + int_value)
	fmt.Printf(string2 + float_value1)
	//fmt.Printf("%s %f\n", string2, float_value1)
}
 

 

输出:

变量int_value和float_value1因为不是字符类型,所以无法连接字符串,解决方法是将变量的类型转换成字符串

func main() {
	var string1 string = "我是字符串1"
	var int_value int = 100
	var string2 string = "我是字符串2"
	var float_value1 float64 = 3.14
	fmt.Printf(string1 + fmt.Sprint(int_value) + "\n")
	fmt.Printf(string2 + fmt.Sprint(float_value1))
	//fmt.Printf("%s %f\n", string2, float_value1)
}

输出:

 

strings.Join()、切片、数组

在Go中,字符串实际上是一组只读长度可变的字节切片。要知道strings.Join()的用法,必须知道什么是切片(Slice),而要理解切片,又必须先要知道什么是数组(Array),所谓数组可以理解为一种特殊的列表,区别是列表可以包含多种数据类型的元素,而数组只能包含同一种数据类型的元素,即一个数组里的所有元素必须全部为字符串,或者全部为整数

在Go中,切片是数组衍生出来的概念,两者的区别是:数组的长度是固定的,在声明一个数组时,你必须指定该数组的长度(即该数组里面有多少个元素),以及该数组里元素的数据类型。而切片不同,切片的长度不是固定的,在声明一个切片时,只需指明切片里元素的数据类型即可,这里简单举例说明两者的却别:

func main() {
	vendor1 := [5]string{"C", "i", "s", "c", "o"}
	vendor2 := []string{"H", "u", "a", "w", "e", "i"}
	fmt.Printf("%T\n", vendor1)
	fmt.Printf("%T\n", vendor2)
}

输出:

 

对于切片更加详细的说明,在这里已经说

虽然切片是在数组的基础上衍生出来的数据类型,但因为切片的灵活性,实际上它在Go中的应用比数组更广泛,比如strings.Join()就必须配合切片来完成字符串的拼接,举例如下:

func main() {
	var vendor1 []string = []string{"C", "i", "s", "c", "o"}
	var vendor2 []string = []string{"H", "u", "a", "w", "e", "i"}
	result1 := strings.Join(vendor1, "")
	result2 := strings.Join(vendor2, "")
	fmt.Println(result1)
	fmt.Println(result2)
}

输出:

 

注意strings.Join(vendor1, “”)后面的""表示分隔符,这里分隔符为空,表示等下做拼接时,切片里的所有字符串元素将紧贴在一起

可以换成其他的分隔符试一下

func main() {
	var vendor1 []string = []string{"C", "i", "s", "c", "o"}
	var vendor2 []string = []string{"H", "u", "a", "w", "e", "i"}
	result1 := strings.Join(vendor1, ",")
	result2 := strings.Join(vendor2, ",")
	fmt.Println(result1)
	fmt.Println(result2)
}

输出:

 

bytes.Buffer

因为在Go中字符串实际上是一组只读、长度可变的字节切片,因此我们还可以引入Go内置的bytes标准包,通过它创建一个类型为bytes.Buffer的变量(你可以把bytes.Buffer变量理解为组成字符串的字节),然后使用它的WriteString()方法来做拼接,最后通过该变量的String()方法将它转化为字符串,即得到了拼接后的字符串内容,举例如下:
func main() {
	var vendor1 bytes.Buffer
	vendor1.WriteString("l")
	vendor1.WriteString("i")
	vendor1.WriteString("n")
	vendor1.WriteString("r")
	vendor1.WriteString("u")
	vendor1.WriteString("x")
	var vendor2 bytes.Buffer
	vendor2.WriteString("h")
	vendor2.WriteString("e")
	vendor2.WriteString("l")
	vendor2.WriteString("l")
	vendor2.WriteString("o")
	fmt.Println(vendor1.String())
	fmt.Println(vendor2.String())
}
输出:

 

这里我们通过import bytes导入了bytes这个标准包,然后创建了vendor1和vendor2两个类型为bytes.Buffer的变量,我们通过bytes.Buffer自带的WriteString()方法将字母做了拼接

注意使用bytes.Buffer来做字符串拼接可以避免生成一个新的字符串变量(比如前面讲strings.Join()时,我们额外创建了result1和result2两个变量),所有拼接的操作都是在同一个变量上完成的。

strings.Builder

上面讲到的bytes.Buffer()是通过bytes这个模块来操作字符串的拼接,这种方法多少让用户感到有些迷惑。从go1.10开始,Go语言官方在strings这个标准包里新加入了strings.Builder这个数据类型,并且官方鼓励用户在做字符串的拼接时使用strings.Builder,做字节的拼接时使用bytes.Buffer。
func main() {
	var vendor1 strings.Builder
	vendor1.WriteString("l")
	vendor1.WriteString("i")
	vendor1.WriteString("n")
	vendor1.WriteString("r")
	vendor1.WriteString("u")
	vendor1.WriteString("x")
	var vendor2 strings.Builder
	vendor2.WriteString("h")
	vendor2.WriteString("e")
	vendor2.WriteString("l")
	vendor2.WriteString("l")
	vendor2.WriteString("o")
	fmt.Println(vendor1.String())
	fmt.Println(vendor2.String())
}
输出:

 

可以看到,strings.Builder和bytes.Buffer的使用方法几乎一模一样,两者都是通过WriteString()来做字符串的拼接,都是通过String()来获得拼接后的字符串。不过根据Go官方的说法strings.Builder在内存使用上的性能要略优于bytes.Buffer,这里推荐大家按照官方的建议,在做字符串的拼接时使用strings.Builder,做字节的拼接时使用bytes.Buffer。

字符串的索引

在开发的过程中,有时我们需要获取字符串中的某个或者某段字符,这时就需要对字符串做索引(针对单个字符)或者切片(针对多个连续字符)。

Go语言的字符串索引号从0开始,即字符串里从左往右的第一个字符的索引号为0

在Go中,索引返回的值为byte(byte是uint8的别名,uint8的中文叫做无符号8位整数,相关的知识会在下一篇讲解整数的章节中讲到),如果你用fmt.Println(vendor1[0])会打印出字母C对应的uint8的值

func main() {
	vendor1 := "Linrux"
	fmt.Println(vendor1[0])
}

 

解决办法有两个:

1.使用%c格式码(%c格式码表示character,即字符,注意字符不等同于字符串),通过字符串格式化的方式将uint8整数转化为字符:

func main() {
	vendor1 := "Linrux"
	fmt.Printf("%c", vendor1[0])
}

输出:

2.使用string()函数将unit8整数转化为字符串:

func main() {
	vendor1 := "Linrux"
	fmt.Println(string(vendor1[0]))
}

输出:

PS:在Go中,索引号不支持使用负整数,只能使用0或正整数,否则系统会返回“invalid string index -1 (index must be non-negative)”的异常,举例如下:

func main() {
	vendor1 := "Linrux"
	fmt.Println(string(vendor1[-1]))
}

输出:

解决的方法是使用len()函数:

func main() {
	vendor1 := "Linrux"
	fmt.Println(string(vendor1[len(vendor1)-1]))
}

输出:

字符串的不可变性

作为一组字节的切片,Go语言中的字符串具有不可变性(immutability),一旦创建了一个字符串变量后,我们无法对它的内容做任何修改,哪怕一个字符,举例如下:
func main() {
	vendor1 := "Linrux"
	vendor1[0] = "s"
	fmt.Println(vendor1)
}
输出:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医院室内导航解决方案:智慧医疗的重要组成部分

医院作为人们生活中不可或缺的一部分&#xff0c;面临着巨大的挑战。每天都有大量的患者前来就医&#xff0c;而医院内部的复杂结构和科室众多&#xff0c;常常让患者感到困惑和迷失。为了解决这个问题&#xff0c;医院室内导航解决方案应运而生&#xff0c;以其创新的技术和卓…

4G工业路由器智慧楼宇门禁无人值守、实时监控

门禁是我们日常生活中常见的基础设施&#xff0c;就像是现代社会智慧城市中的“门神”&#xff0c;在楼宇管理领域中普遍采用的安防卫士。4G工业路由器的物联网应用则为楼宇门禁管理带来了更加便捷和高效的解决方案。 在传统的楼宇门禁系统中&#xff0c;人员需要手动刷卡、输…

多个加速度计/麦克风连接指引

座舱内的振动投诉&#xff1a;如乘客/驾驶员在车厢内感受到传动轴、方向盘抖动剧烈 图1.三轴模式下的单个加速度计 图2.软件设置界面 如果您只有一个加速度计&#xff0c;可以在三轴模式下使用一个加速度计找出客户投诉车厢内振动最强烈的区域。例如将加速度计连接到驾驶员座椅…

PCIe学习必读——《PCI Express System Architecture》

PCI Express (peripheral component interconnect express) 简称 PCIe&#xff0c;是一种高速串行计算机扩展总线标准。是一种全双工总线&#xff0c;使用高速串行传送方式&#xff0c;能够支持更高的频率&#xff0c;连接的设备不再像 PCI 总线那样共享总线带宽。PCIe目前发布…

完美滤波器

完美滤波器 如下图所示&#xff0c;第 j j j级为输入图像&#xff0c;其中第 j − 1 j-1 j−1级为第 j j j级的尺寸减半的存在&#xff0c;直至为 1 1 1\times 1 11 的大小&#xff0c;这样的模式被称为图像金字塔 设原图像像素点个数为 N 2 N^2 N2&#xff0c;则图像金字塔的…

IP地址规划的基本方法与最佳实践

IP地址规划是建立网络基础设施的关键步骤之一&#xff0c;它涉及到为网络中的设备分配唯一的IP地址&#xff0c;确保网络的高效性和可管理性。本文将介绍IP地址规划的基本方法和最佳实践&#xff0c;以帮助网络管理员设计并维护高效的IP地址方案。 1. 了解网络拓扑结构&#x…

Java的字符流和字节流

Java的字节流&#xff1a;把数据从程序存储到文件&#xff0c;把数据从文件读取程序中 File&#xff1a;只操作文件和文件属性&#xff0c;createNewFile getPath--->项目目录 ,getAbsolutePath() getName()---->substring() list()-->列出当前目录的所有文件或文…

vue+less+style-resources-loader 配置全局颜色变量

全局统一样式后&#xff0c;可配置vue.config.js实现全局颜色变量&#xff0c;方便在编写时使用统一风格的色彩 一、新建global.less 二、下载安装style-resources-loader npm i style-resources-loader --save-dev三、在vue.config.js中进行配置 module.exports {pluginOpt…

架构图是什么,该怎么制作?

架构图是指可视化展示软件、系统、应用程序、网络等各种体系结构的一类图表或图形&#xff0c;它能够形象地展示体系结构中各个组成部分和它们之间的关系。 架构图的类型 架构图的种类比较多&#xff0c;逐一列举不太合适&#xff0c;这里只列举一些常见的架构图类型&#…

爬虫-基于python的旅游景点推荐系统的设计与实现-计算机毕业设计源码24044

摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于旅游景点管理也是十分常见的。过去使用手工的管理方式对旅游景点进行管理&#xff0c;造成了管理繁琐、难以维护等问题&#xff0c;如今使用计算机对旅游景点的各项基本信息进…

2021年2月16日 Go生态洞察:Go 1.16版本发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CentOS 7 部署 Nacos (单机版)

CentOS 7 部署 Nacos &#xff08;单机版&#xff09; 1. 下载 Nacos 安装包 历史版本&#xff1a;https://github.com/alibaba/nacos/releases/ 我选的是 2.1.0 版本&#xff0c;https://github.com/alibaba/nacos/releases/download/2.1.0/nacos-server-2.1.0.tar.gz 2. …

2021年09月 Scratch图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 程序中要使用不确定的数值,这时要用到的是?( ) A、图章 B、变量 C、广播 D、随机数 答案:D 第2题 执行下列程序后,角色会说?( ) A、3 B、6 C、10 D、15 答案:D 第3题…

现货白银怎样数点数?

由于数十倍资金杠杆的存在&#xff0c;现货白银投资者可以把很细微的行情波动&#xff0c;转化为相对显著的收益。但另一方面&#xff0c;现货白银交易过程中会难免会涉及一定的点差成本&#xff0c;所以投资者在入市之前&#xff0c;一定要清晰地知道自己需要能够拿下多少的行…

onlyoffice文件大小超出了服务器设置处理

onlyoffice文件大小超出了服务器设置处理 1.前言2. onlyoffice服务安装2.1 docker安装命令2.2 访问测试 3. 修改服务器文件大小限制方案3.1 旧方案-7.2版本不可行3.1.1 进入 OnlyOffice Document Server 容器3.1.2 编辑配置文件3.1.3 找到并修改文件大小限制3.1.4 保存并退出编…

封装一些可能会用到的JS的Dom操作方法(非JS自带的方法)

1. 父元素节点下的子元素节点逆序 HTMLElement.prototype.childRevers function () {var all_num this.childElementCount;if (all_num) {while(all_num--){this.appendChild(this.children[all_num]);}} } // 获取 ul 父节点对象 var oul document.getElementsByTagName(u…

python获取系统当前进程数和最大进程数

参考&#xff1a; https://blog.51cto.com/u_16213345/7115864 https://www.baidu.com/s?wdpython%20%E8%8E%B7%E5%8F%96%E7%B3%BB%E7%BB%9F%E5%BD%93%E5%89%8D%E8%BF%9B%E7%A8%8B%E6%95%B0%E5%92%8C%E6%9C%80%E5%A4%A7%E8%BF%9B%E7%A8%8B%E6%95%B0&rsv_spt1&rsv_iqid…

基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…

M1安装RabbitMQ

1.查看centos内核版本 uname -a uname -r2.安装之前的准备工作 安装RabbitMQ必装Erlang(RabbitMQ官网添加链接描述) 2.1.Erlang简介 Erlang是一种通用的面向并发的编程语言&#xff0c;它由瑞典电信设备制造商爱立信所辖的CS-Lab开发&#xff0c;目的是创造一种可以应对…

Java高级技术(动态代理)

一&#xff0c;代理 二&#xff0c;案例 放到代码中演示&#xff1a; 首先&#xff0c;创建一个明星接口&#xff0c;这个接口有一个skill方法&#xff0c;说明只要是明星就必须有点技能。 public interface Star {void skill(); } 然后&#xff0c;创建坤坤对象&#xff0c…