1. 程式人生 > 實用技巧 >【Golang】快速複習指南QuickReview——字串string

【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);
}

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)
}