春节期间,再加上疫情,博主学习了几天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类型,常用来处理unicodeutf-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)
}

强调:这个系列并不是教程,如果想系统的学习,博主可推荐学习资源。