中的字符串-Golang-拥抱最佳通常-防止经常出现陷阱 (linux替换文件中的字符串)
在这篇文章中,咱们将讨论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博客
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。