【Golang】快速复习指南QuickReview(一)——字符串string
春节期间,再加上疫情,博主学习了几天Golang,之后便缺乏使用。这几天看到一些Golang项目的源码,发现自己对Golang好像有点不熟,为了加深自己的记忆,艾宾浩斯记忆遗忘曲线告诉我们:要勤于复习。作为一个C#使用频率超高的.NET开发者,预备在接下来采用:C#与Golang的对比,以Golang为主,C#为辅的复习系列。既然是复习,面不会全部覆盖,所以这个系列并不是教程,如果想系统的学习,博主可推荐。
golang相对于其他语言(C#,python等),语法糖相对较少。大家都知道C#和python的语法糖很多,特别是python,有时候读别人写过的源码,不一定都能快速读懂,甚至几个开发人员编写的都不一样,而Golang不同,Golang只要坚持打牢基础,就能阅读源代码,甚至读懂,所以需要打牢基础(这也说明博主基础并不牢靠)。
String-字符串
1.C#的字符串
字符串在C#中,是一个特殊的类型,不能简单把它归纳为值类型,或者引用类型。需要记住的有两点:
- 1.无论对字符串做什么操作,都会在内存中生成一个新的实例,即使是一个简单的重新赋值操作。
- 2.string字符串可以看作一个只读数组。
string name="randyfield";
char name_0=name[0];
name[0]="R";//错误:内部是一个索引器,public char this[int index] { get; },只读的
2.Golang的字符串
字符串在Golang中,string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,其他没多少内容,唯一需要注意的就是字符:
- 如果是英文字符,就用
byte
,实质是一个int8
类型,常用来处理ascii
字符 - 如果是中文、日文或者其他符合字符就用
rune
,实在是一个int32
类型,常用来处理unicode
或utf-8
字符
3.字符串翻转
最后来巩固一下,用两者代码分别实现字符串翻转,效果如下:“RandyField 喜欢吃凤尾!”—"!尾凤吃欢喜 dleiFydnaR"
3.1 C#实现
string Reverse(string str)
{
//转换为数组
char[] nameArray = str.ToCharArray();
for (int i = 0; i < nameArray.Length / 2; i++)
{
char temp;
temp = nameArray[i];
nameArray[i] = nameArray[nameArray.Length - 1 - i];
nameArray[nameArray.Length - 1 - i] = temp;
}
return new string(nameArray);
}
C# 为我们提供了很多api,还可以更简单
static string StringReverse(string str)
{
return new string(str.ToCharArray().Reverse().ToArray());
}
3.2 Golang实现
func Reverse(str string) string {
//转换为切片
strSlice := []rune(str)
for i := 0; i < len(strSlice)/2; i++ {
var temp rune
temp = strSlice[i]
strSlice[i] = strSlice[len(strSlice)-1-i]
strSlice[len(strSlice)-1-i] = temp
}
return string(strSlice)
}
使用Golang的多重赋值的特性,把脏活累活扔给编译器,代码可以更简单:
func reverse(str string) string {
//转换为切片
strSlice := []rune(str)
for i, j := 0, len(strSlice)-1; i < j; i, j = i+1, j-1 {
strSlice[i], strSlice[j] = strSlice[j], strSlice[i]
}
return string(strSlice)
}
强调:这个系列并不是教程,如果想系统的学习,博主可推荐学习资源。
- 原文作者:Garfield
- 原文链接:http://www.randyfield.cn/post/2020-11-22-golang-string-rune/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。