百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Golang基础之字符与字符串

toyiye 2024-06-21 12:00 10 浏览 0 评论

字符串

Go语言默认使用UTF-8编码来处理Unicode。每个中文字符在UTF-8中占3个字节。

简单理解:

  • Unicode字符集:每个字符对应一个十六进制的数字(类似一个字典表)。
  • UTF-8:是一套编码规则,将Unicode字符集中字符对应的数字,转换为字节序列。

Go语言中字符串的声明和初始化非常简单,举例如下:

fmt.Println(utf8.RuneCountInString("中国"))    //out:2

注:

  • 双引号-可以识别转义字符;
  • 反引号-以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源码等功能;
  • 单引号-表示字节。


1、字符串操作

fmt.Println(utf8.RuneCountInString("中国"))    //out:2


2、计算字符串长度

内建函数len()的返回值的类型为int,表示字符串的ASCII字符个数或字节长度。

len('中国') // out:6


使用utf8包的RuneCountInString()函数统计Unicode字符数量。

fmt.Println(utf8.RuneCountInString("中国"))    //out:2

总结:

  • ASCII字符串长度使用len()函数。
  • Unicode字符串长度使用utf8.RuneCountInString()函数。

3、字符串遍历

Go语言支持两种方式遍历字符串。

一种是以字节数组的方式遍历:

str := "Hello,世界"
n := len(str)
for i := 0; i < n; i++ {
    ch := str[i] // 依据下标取字符串中的字符,类型为byte
    fmt.Println(i, string(ch))
}


另一种是以Unicode字符遍历:

str := "Hello,世界"
for i, ch := range str {
    fmt.Println(i, string(ch)) //ch的类型为rune
}

总结:

  • ASCII字符串遍历直接使用下标。中文会乱码。
  • Unicode字符串遍历用for range。中文正常。

4、strings包操作字符串



5、修改字符串

字符串是不可变的,只能通过重新构造新的字符串并赋值给原来的字符串变量实现。

修改字符串时,可以将字符串转换为[]byte进行修改。

[]byte和string可以通过强制类型转换互转。


6、连接字符串

使用"+"对字符串进行连接操作,但不高效。

使用StringBuilder进行高效的字符串连接。

示例:

  a := "hello"
	b := "world"
	
	var s bytes.Buffer  // 声明字节缓冲区
	s.WriteString(a)
	s.WriteString(" ")
	s.WriteString(b)

	fmt.Println(s.String())  // out: hello world


bytes.Buffer?是可以缓冲并可以往里面写入各种字节的数组。字符串也是一种字节数组,使用WriteString()方法进行写入。

将需要连接的字符串,通过调用WriteString()方法,写入stringBuilder?中,然后再通过s.String()方法将缓冲转换为字符串。

7、格式化

fmt.Sprintf(格式化样式,参数列表)

fmt.Printf(格式化样式,参数列表)


 // 格式化布尔型变量 
fmt.Printf("%t\n", true)  

 // 使用`%p`输出一个指针的值 
fmt.Printf("%p\n", &p)  

// 你也可以指定浮点数的输出宽度,同时你还可以指定浮点数的输出精度 
fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)  

// 你也可以指定输出字符串的宽度来保证它们输出对齐。默认是右对齐的 
fmt.Printf("|%6s|%6s|\n", "foo", "b")  

// 为了使用左对齐你可以在宽度之前加上`-`号 
fmt.Printf("|%-6s|%-6s|\n", "foo", "b")  

// 左对齐并在%v的基础上,对结构体字段名和值进行展开 
fmt.Sprintf("%-15s:  %+-v\n", "Labels", item.Labels)  

// 输出像Go源码中那样带双引号的字符串,需使用`%q` 
fmt.Printf("%q\n", "\"string\"") 


字符类型

Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存。

字符串中的每一个元素叫做"字符"。在遍历或者单个获取字符串元素时可以获得字符。

字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。也就是说对于传统的字符串是由字符组成的,而go的字符串不同,它是由字节组成的。

Go语言的字符有以下两种:

  • 一种是uint8类型,或者叫byte型,代表了ASCII码的一个字符。
  • 另一种是rune类型,代表了一个UTF-8字符。当需要处理中文时则需要用到rune类型。rune类型实际是一个int32.


说明:

  • 如果保存的字符在ASCII表的,比如[0-1,a-z,A-Z]可以直接保存到byte,
var c1 byte = 'a'
fmt.Println(c1) // out: 97
  • 如果保存的字符对应码大于255,可以考虑使用int类型保存。
  • 如果需要按照字符的方式输出,需要格式化输出,即
fmt.Printf("%c",c1) // out: a
  • 字符常量是用单引号括起来的单个字符。
var c1 byte='a'
var c2 int = '中'
var c3 byte='7'
  • Go 语言的字符使用UTF-8编码,英文字母1个字节,汉字3个字节。
  • 在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值。
  • 可以直接给某个变量赋值一个数字,然后格式化输出时%c,会输出该数字对应的Unicode字符。
var c1 int = 22269
fmt.Printf("c1=%c\n",c1) //out: c1=国
  • 字符类型是可以进行运算的,相当于一个整数,因为它都有对应的Unicode码。
var n1 = 10 + 'a'


字符类型本质

1)字符型存储到计算机中,需要将字符对应的码值(整数)找出来

存储:字符--->对应码值--->二进制--->存储

读取:二进制--->码值--->字符--->读取

2)字符和码值的对应关系是通过字符编码表决定的(是规定好的)

相关推荐

python数据预处理技术(python 数据预处理)

在真实世界中,经常需要处理大量的原始数据,这些原始数据是机器学习算法无法理解的。为了让机器学习算法理解原始数据,需要对数据进行预处理。我们运行anaconda集成环境下的“jupyternotebo...

【Python可视化系列】一文教你绘制不同类型散点图(理论+源码)

这是...

OpenCV-Python 特征匹配 | 四十四

目标在本章中,我们将看到如何将一个图像中的特征与其他图像进行匹配。我们将在OpenCV中使用Brute-Force匹配器和FLANN匹配器Brute-Force匹配器的基础蛮力匹配器很简单。它使用第一...

实战python中Random模块使用(python中的random模块)

一、random模块简介Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。要在Python中使用random模块,只需要...

Python随机模块22个函数详解(python随机函数的应用)

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。random模块,用于生成伪随机数,之所以称之为伪随机数,是...

说冲A就冲A,这个宝藏男孩冯俊杰我pick了

爱奇艺新上架了一部网剧叫《最后一个女神》。有个惊人的发现,剧里男三居然是《青春有你》的训练生冯俊杰。剧组穷,戏服没几件,冯俊杰几乎靠一件背背佳撑起了整部剧。冯俊杰快速了解一下。四川人,来自觉醒东方,人...

唐山打人嫌犯陈继志去医院就医的背后,隐藏着三个精心设计的步骤

种种迹象表明,陈继志这帮人对处理打人之后的善后工作是轻车驾熟的,他们想实施的计划应该是这样的:首先第一步与伤者进同一家医院做伤情鉴定,鉴定级别最好要比对方严重,于是两位女伤者被鉴定为轻伤,他们就要求医...

熬夜会造成神经衰弱,别再熬夜了(熬夜会加重神经衰弱吗)

长时间熬夜会出现神经衰弱,皮肤受损,超重肥胖,记忆力下降等现象……熬夜了能补回来吗?每天少睡一两个小时算熬夜吗?必须上夜班怎么办?如何减少熬夜伤害?戳图转给爱熬夜的TA!via央视新闻来源:河北省文...

落叶知秋的图片爬取(落叶知秋的图片有哪些?)

importrequestsfrombs4importBeautifulSoupimporttimeimportjsonpathimportjsonfromurllib.parsei...

小心有毒!长沙海关查获藏匿在“巧克力威化涂层”中的大麻

来源:海关发布近日,长沙黄花机场海关对一票申报为“巧克力威化涂层”的进境快件进行机检查验时,在包裹内查获封装于各独立威化饼干包装袋中的大麻230克。另从其他申报为“巧克力、儿童早餐谷物”的快件中查获藏...

钧正平:编造传播这种谣言,荒谬(钧正公司)

来源:钧正平工作室官方微博【钧评编造传播这种谣言,荒谬!】目前,乌克兰安全形势还在迅速变化之中,各方面安全风险上升。相关事件网上热度极高,倍受瞩目。然而,有一些人却借机大肆制造散播一些低级谣言,比如...

幸运角色过去了,谈一谈DNF起源的元素

总的来说伤害比上个版本强太多了,打卢克每日和团本明显能感觉的到。目前打团B套+圣耀稍微打造下应该都能随便二拖了。组队基本上都是秒秒秒(以前得强力辅助,现在随便带个毒奶都行)。单刷除了王座和顶能源阿斯兰...

DNF元素超大凉打桩测试(把括号的伤害加起来好像比较正常)

最近修练场的二觉老是很奇怪,发现以前都是习惯性先减抗然后丢二觉,结果伤害。。。直接丢二觉就正常了下面是其他技能伤害,没达到BUG线,估计问题不大。装备打造方面:全身红字加起来353(41*5+74*2...

ANSYS接触和出图技巧(ansys rough接触)

1.ANSYS后处理时如何按灰度输出云图?1)你可以到utilitymenu-plotctrls-style-colors-windowcolors试试2)直接utilitymenu-plotctr...

ANSYS有限元使用经验总结-后处理(4)

28.求塑性极限荷载时,结构的变形应该较大,建议把大变形打开。...

取消回复欢迎 发表评论:

请填写验证码