当前位置:首页 > 数码 > 中的字符串-Golang-拥抱最佳通常-防止经常出现陷阱 (linux替换文件中的字符串)

中的字符串-Golang-拥抱最佳通常-防止经常出现陷阱 (linux替换文件中的字符串)

admin8个月前 (04-30)数码79
Golang

在这篇文章中,咱们将讨论Golang中的字符串,并检查一些不同的场景,以防止经常出现失误。让咱们深化讨论!

1.字符串能否可以为nil?

咱们曾经对Golang中的字符串有了基本的了解,但咱们可以从Golang字符串不能为开局,除非您经常使用指向字符串的指针。

如下代码所示,当咱们创立一个字符串变量时,自动值必定是空的""。假设咱们用值初始化字符串变量,咱们将面临在变量申明中不能经常使用作为字符串值的失误。例如:

funcmn(){varsstrings=nil//Cannotuse'nil'asthetypestringfmt.Println(s)}

编译器会提醒咱们不能经常使用赋予类型。因此,咱们可以只是定义变量,或许经常使用""作为自动值:

funcmain(){varsstringvarss=""fmt.Println(s,ss)}

假设咱们保持在字符串类型变量中经常使用值,则应经常使用指针,如下所示:

funcmain(){vars*stringfmt.Println(s)}

这个时刻输入则为:

然而,咱们必定审慎经常使用这种方法。每无所谓为变量赋值时,咱们都必定编写更多的代码,而且在赋新值之前还要审核能否有零值或前一个值。

funcmain(){vars*stringtmp:="hello"s=&tmpfmt.Printf("address:%+v,value:%s",s,*s)}

这个时刻打印进去s的地址以及所指向的值:

address:0xc00008a030,value:hello

2.字符串是无法变的

Golang中的字符串是无法变的,这象征着咱们不能更改每个字符的值。例如:

funcmain(){tmp:="hello"tmp[0]='J'fmt.Println(tmp)}

上述代码会造成编译时失误,由于无法赋值给。

更改字符串中单个字符的经常出现失误如下:

funcmain(){tmp:="hello"tbs:=[]byte(tmp)tbs[0]='J'fmt.Println(string(tbs))chi:="你好"chiTBS:=[]byte(chi)chiTBS[0]='J'fmt.Println(string(chiTBS))}

输入为:

JelloJ��好

只管第一个输入显示的结果合乎咱们的预期,但这并不是更改某个字符的正确方法。

这是由于咱们计划修正的单个局部或许存储在多个字节中,即使你想将变量转换为符文类型并更改你想要的局部,我也不得不说,这是无法能做到的,由于它或许被搁置在多个符文中,咱们须要审慎行事!

3.字符串是字节数组

在Golang中,字符串由字节(字节的片段)组成,某些字符须要存储在多个字节中,例如:"♥"。

因此,当须要确定一个字符串类型变量的长度时,咱们必定审慎编码。例如

funcmain(){tmp:="¥"fmt.Println("bytes:",len(tmp))fmt.Println("runes:",utf8.RuneCountInString(tmp))}

函数前往的是字符串的字节数,而不是字符数。当咱们须要找出字符串的符文数时,可以经常使用 uft8.RuneCountIntString() 函数。

另一个经常出现的曲解是经常使用 uft8.RuneCountIntString() 来确定字符数,但这并不是在任何状况下都正确,由于一个字符串变量或许超过多个符文。请看这个例子:

funcmain(){tmp:="❤️"fmt.Println("bytes:",len(tmp))fmt.Println("runes:",utf8.RuneCountInString(tmp))}

输入为:

bytes:6runes:2

4.字符串索引和forrange

在Golang中,经常使用索引检索字符串的单个局部将为咱们提供字符的值,并且只能检索第一个字节。但在字符串变量的循环中,咱们可以访问每个字符的符值:

funcmain(){tmp:="❤¥%……&*"fmt.Printf("charat0index,hastype%Tandvalueis%+vn",tmp[0],tmp[0])for_,t:=rangetmp{fmt.Printf("valueis%+vtypeis%Tn",t,t)}}

输入:

charat0index,hastypeuint8andvalueis226valueis10084typeisint32valueis65509typeisint32valueis37typeisint32valueis8230typeisint32valueis8230typeisint32valueis38typeisint32valueis42typeisint32

在对字符串启动迭代时,还要留意变量中或许存在的非UTF8字符,假设Golang无法将其了解为UTF8,则会经常使用unicode交流而非实践值。

5.字符串对等

在Golang中,咱们总是可以经常使用来审核便捷的字符串能否相等,但假设咱们的变量存在暗藏点,则应在比拟两个字符串变量之前经常使用规范包将其规范化:

funcmain(){cafe1:="Café"cafe2:="Cafeu0301"normalizeCafe1:=norm.NFC.String(cafe1)normalizeCafe2:=norm.NFC.String(cafe2)fmt.Println(cafe1==cafe2)fmt.Println(normalizeCafe1==normalizeCafe2)}

6.高效字符串构建

经常使用衔接少量字符串的效率或许十分低。经常使用 strings.Builder 是高效构建字符串的最佳方法之一:

funcmain(){sb:=strings.Builder{}fori:=0;i<1000;i++{sb.WriteString("hello")}result:=sb.String()fmt.Println(result)}

与传统的+衔接方法相比,这种方法速度更快,内存消耗更少,而且可以防止创立不用要的两边字符串。咱们还可以经常使用 bytes.Buffer 软件包来成功这一指标。

总结


golang 怎么判断字符串中的\0

有个spilt的方法,直接转换成数组,然后再遍历

golang面试题2之判断字符串中字符是否全都不同

请实现 个算法,确定 个字符串的所有字符【是否全都不同】。 这 我们要求【不允 许使 额外的存储结构】。 给定 个string,请返回 个bool值,true代表所有字符全都 不同,false代表存在相同的字符。 保证字符串中的字符为【ASCII字符】。 字符串的度 于等于【3000】。 这 有 个重点,第 个是 ASCII字符 , ASCII字符 字符 共有256个,其中128个是常 字符,可以在键盘上输 。 128之后的是键盘上 法找到的。 然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使 额外的储存结 构,且字符串 于等于3000。 如果允许其他额外储存结构,这个题 很好做。 如果不允许的话,可以使 golang内置 的 式实现。 通过 函数判断: 使 的是golang内置 法 ,可以 来判断在 个字符串中包含 的另外 个字符串的数量 还有不同的方法同样可以实现,你了解吗? 推荐go相关技术 专栏 gRPC-go源码剖析与实战_带你走进gRPC-go的源码世界-CSDN博客

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Golang

“中的字符串-Golang-拥抱最佳通常-防止经常出现陷阱 (linux替换文件中的字符串)” 的相关文章

Go-可裁减的运行程序-言语构建高效-基于 (可裁剪性是啥意思)

Go-可裁减的运行程序-言语构建高效-基于 (可裁剪性是啥意思)

简介 Go是整洁架构(CleanArchitecture)的完美选用。整洁架构自身只是一种方法,并没有通知咱们如何构建源代码,在尝试用新言语成功时,看法到这点十分关键。 自从我有了经常...

可保养性和优雅感-明晰代码指南-Golang-为您的代码注入可读性

可保养性和优雅感-明晰代码指南-Golang-为您的代码注入可读性

施展易读和易保养软件的好处-第一局部 嗨,开发者们,明晰的代码是指编写易于浏览、了解和保养的软件代码。它是遵照一组准则和通常,优先思考明晰性、繁难性和分歧性的代码。明晰的代码旨在使代码库更易...

慢聊Golang协程池Ants实现原理 (音乐慢慢摇我俩慢慢聊)

慢聊Golang协程池Ants实现原理 (音乐慢慢摇我俩慢慢聊)

简介 协程是 Go Lang 中的轻量级线程实现,由 Go 运行时 (runtime) 管理。Go 程序会智能地将协程中的任务合理地分配给每个 CPU。创建一个协程的大小约为 2kb,非常节省机...

优雅组织-Golang-项目结构的指南 (优雅van)

优雅组织-Golang-项目结构的指南 (优雅van)

Go语言社区在系统总结之前,由一些开发者总结了像 cmd 和 internal 这样的目录结构。随后,标准Go项目布局对此进行了进一步的概括,该项目已获得了超过4万个s...

深化探求-中的追加操作-APPEND函数及其外部上班原理来高效地裁减-了解如何经常使用-Golang-Go-容器 (深化要求)

深化探求-中的追加操作-APPEND函数及其外部上班原理来高效地裁减-了解如何经常使用-Golang-Go-容器 (深化要求)

经过实践示例探求Golang中的追加操作 简介 在Golang编程畛域,操作是一种多才多艺的工具,使开发人员能够灵活裁减切片、数组、文件和字符串。在这篇正式的博客文章中,咱们将踏上一段...

Bytes-Golang-包详解之-Bytes.Buffer-中 (byte数据类型)

Bytes-Golang-包详解之-Bytes.Buffer-中 (byte数据类型)

上篇文章具体解说了一次性性明码OTP相关的常识,基于时期的一次性性明码TOTP是OTP的一种成功方式。这种方法的优势是不依赖网络,因此即使在没有网络的状况下,用户也可以生成明码。所以这种方式被许多...

中备受争议的失误处置机制-Golang-深化讨论 (中备受争议的成语)

中备受争议的失误处置机制-Golang-深化讨论 (中备受争议的成语)

一、error是什么? 在C中,前往失误经过errno.h中的失误代码来示意,比如0代表Noerror,也就是没有失误;2代表Nosuchfileordirectory,也就是找不到指定门路...