春節期間,再加上疫情,博主學習了幾天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);
}
3.2 Golang實現
func Reverse(str string) string {
//轉換爲切片
strSlice := []rune(str)
for i := 0; i < len(strArray)/2; i++ {
var temp rune
temp = strArray[i]
strArray[i] = strArray[len(strArray)-1-i]
strArray[len(strArray)-1-i] = temp
}
return string(strArray)
}
使用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(strArray)
}