golang -- 字符串就地取反

字符串

定义

在golang中字符串是一种不可变的字节序列,它可以包含任意的数据,包括0值字节,但主要是人类可以阅读的文本。golang中默认字符串被解读为utf-8编码的Unicode码点(文字符号)序列。

特性

golang中字符串具有不可变性。例如

str := "hello 世界!"

str[0] = 'L'

这种写法会引起编译错误:str[0] 不可赋值

字符串支持类似数组中分片的引用写法:


fmt.Println(str[:5]) // 输出 hello

fmt.Println(str[7:]) // 输出 世界

fmt.Println(str[len(s)+1:) // 宕机 

str[i:j] , 当i、j 越界 (j 、i < 0 或 j、i > len(str) )或 j < i 时会发生宕机。

str := "Hello"

t := str

str += "world"

这种写法可以通过,虽然str指向了一个新的字符串“Hello world”,但t指向的旧字符串仍然存在。
不可变意味着两个字符串能够安全的共享同一段底层内存,是的复制任何长度字符串的开销都低廉,类似的字符串s及其子串(s[n:])字符串的复制也开销低廉。

常见问题

  1. 顺序输出字符串中的每一个字符。

这个问题乍一看十分的简单,直接遍历就好了:


str := "Hello 世界!" 

for i := 0; i < len(str) ; i++{
    fmt.Printf(“%c \t”,str[i])
}

然而事实没那么简单,其输出结果如下:

H   e   l   l   o       ?   ?   -   ?   ?   ?   ?   ?   ?

中文字符部分全部为乱码。这与utf-8的编码规则有关, utf-8是以字节为单位对unicode码点进行变长编码。每一个文字符号用1~4个字节表示,ASCII字符仅仅占1字节的内存,其他常用的文书符号会占到2~3个字节。一个字符编码的首字节高位指明后面还有多少个字节:

规则 表示范围 说明
0xxxxxxx 文字符号0~127 Ascii 字符
110xxxxx 10xxxxxx 128~2047 少于128个未使用的值
1110xxxxx 10xxxxxx 10xxxxxx 2048~65535 少于2048个未使用的值
1110xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 65536~0x10ffffff 其他未使用值

比如Ascii字符串,0x00~0x7f

Hello子串中的字符为Ascii字符,占用一个字节, 而 世界这两个符号占用的字符为 3 个,所以遍历的时候会出现乱码的情况。

原文地址:https://www.cnblogs.com/cnblogs-wangzhipeng/p/10577212.html

时间: 2024-10-17 02:18:23

golang -- 字符串就地取反的相关文章

iOS 十六进制的相加取反

ios中将NSstring字符串转换成char类型 NSString *string = [NSString stringWithFormat:@"5D"]; const char *result = [string UTF8String]; char字符转成NSstring char a[10] = "3Er4"; NSString *string = [NSString stringWithUTF8String:a]; 将char类型字符转成十进制类型,然后需要

PHP中关于位运算符 与 或 异或 取反

<?php /** * author:LMS * createTime:2015/07/22 * desctiption:位运算[ & | ^ ~ ] * 与&:如果a.b两个值不相同,则与结果为0.如果a.b两个值相同,与结果为1 * 或|:与逻辑中的或一致[只有两个值都为假时才为假,其余都为真] * 异或[xor]如果a.b两个值不相同,则异或结果为1.如果a.b两个值相同,异或结果为0 * 取反[~]:对每一位取反 * [注意!非 ==>是逻辑运算符,返回是个布尔值 */

位运算常用操作总结位运算应用口诀清零取反要用与,某位置一可用或若要取反和交换,轻轻松松用异或移位运

来源:http://www.educity.cn/wenda/381487.html 位运算常用操作总结位运算应用口诀 清零取反要用与,某位置一可用或 若要取反和交换,轻轻松松用异或 移位运算 要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形.     2 " $amp;     3 "$amp;>amp;>quot;$右移:右边的位被挤掉.对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统.     4 "

2016-05-30 checkbox取反 两种方式

<script> //第一种方式:利用自身的属性设置取反 window.onload=function(){ var oInputs=document.getElementsByTagName("input"); oInputs[0].onclick=function(){ for(var i=1;i<oInputs.length;i++){ oInputs[i].checked=!oInputs[i].checked; } } } //第二种方式 设置取反 wind

关于取反~的运算

今天看到一个东西 SELECT ~32767 ----------- -32768 按位反的话为什么结果为什么不是-520而是-521呢? 然后我又看了看,才想起在二进制的世界里,第一个数位是表示正负数,所以在smallint 的2字节里面,是这样纸的 32767 0111 1111 1111 1111 所以当取反的时候就是 -32768 10 0000 0000 0000 有时候就是转不过弯,不确定的时候还是要动手看下才能巩固自己的只是

gcvt(将浮点型数转换为字符串,取四舍五入)

/*gcvt(将浮点型数转换为字符串,取四舍五入) 相关函数 ecvt,fcvt,sprintf 表头文件 #include<stdlib.h> 定义函数 char *gcvt(double number,size_t ndigits,char *buf); 函数说明 gcvt()用来将参数number转换成ASCII码字符串,参数ndigits表示显示的位数.gcvt()与ecvt()和fcvt()不同的地方在于,gcvt()所转换后的字符串包含小数点或正负符号.若转换成功,转换后的字符串会

Golang字符串处理以及文件操作

GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也是有过之而无不及,甚至可以说远远的甩python几条街.学过python基础或是shell的童鞋应该知道我们在定义一个变量的时候是不需要指定其所属数据类型的,直接让其等于一个变量即可,他们的解释器会自动识别你定义的是个整数,浮点数,字符串,还是数组或是函数.而Golang在定义每个变量的时候都被指定

javascript取反再取反的作用

在javascript中按位取反再取反可以将一个浮点数的转化为整形,而且其效率要比parseInt高出将近一倍 var start = new Date().getTime(); for (var i = 0; i < 10000000; i++) { var a = Math.random() * 5; ~~a; } console.info(new Date().getTime() - start); start = new Date().getTime(); for (var i = 0;

PHP去掉转义后字符串中的反斜杠\函数stripslashes

addslashes函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes则是去掉转义后字符串中的反斜杠\,比如当你提交一段 json数据到PHP端的时候可能会遇到json字符串中有\导致json_decode函数无法将json数据转换成数组的情况,这时你就需要 stripslashes函数. 该函数用于清理从数据库或 HTML 表单中取回的数据.