前言:
在上一篇中,我們初步學習了下Go語言的字串,這篇繼續學習字串的其它內容,我們要不急不慌,慢慢學習Go語言,一口氣是吃不成大胖子的。我也希望喜歡這個系列的同學就當這個是某些八卦新聞,不要有任何壓力,等全部看完這個系列後,再繼續深入學習,這個只是新聞,能掌握多少就多少了,等全部看完了,或許你真的“變胖”了。那麼我們就繼續學習吧~
一 不可變的字串
在上一篇中,我們在最開始的時候提到過這個特性,不過不小心後來給忘記說了,對此非常抱歉(= =||),所以就今天補上了。還是用例子來說明,比較容易,請看下面:
這裡的例子很好的解釋了,字串的不可變性,當你把13行注釋去掉後,編譯該檔案就會報錯,因為不允許修改字串內容。很多初學者可能認為第10行不是改變字串內容了嗎?這種理解是錯誤的,第10行只是將變數cat指向了另一個記憶體位址,原來字串並沒改變,你改變的只是變數的地址。
或許有人有疑問,第13行是不是單引號的問題?在Go語言中,單引號表示一個Unicode字元,這樣是沒問題的,不信,可以試試下面:
這裡使用長度為5的位元組數組來存放,並且在第一個位置放入‘c’字元,最後列印結果:
數組的第一個位置被填上了99,沒錯,這個99就對應了'c'字元的ascii碼值。其餘位置預設初始化為0。但是,當去掉第7行的注釋後,當我們把一個中文字元賦值給數組某個位置時,變會編譯出錯了。因為,我們在Linux的vi下預設編碼方式是UTF-8,所以對於中文的編碼需要3個位元組。而該byte類型的數組,每個數組元素只有一個位元組容量,所以放不下中文字元,那麼如果我們非要放中文字元,怎麼辦?看下面:
將byte數組換成rune類型的數組就行了。原因就是rune是有32位的長度,足夠放下3個位元組表示的中文字元了。
二 字串的遍曆操作
在Go語言中,要遍曆一個字串,訪問每個字元方法與其他語言類似,當然是使用for迴圈了,關於for迴圈也與其它語言類似,所以以後就不單獨介紹了,這裡直接使用學習for迴圈:
如果像上面這樣,你會發現最後列印出一堆亂碼,其中代碼中的%c表示格式化成字元,這樣可以列印每個字元,不過不幸的是,我們失敗了,如果將a賦值為全部英文,那麼你又會發現可以列印出來。很明顯,這裡又是字元編碼在搞怪了。因為字串內部結構是一個byte的數組,這個在前一篇已經看到過了,所以預設調用len()函數,求得的字串長度其實就是byte數組中元素個數,於是你取出來的每一個元素,就是一個byte,如果是英文字元,那麼沒關係,正好是一個byte,但是當是中文的時候,由於是UTF-8編碼,所以,你的一個中文需要三個位元組才能表示,如今你只取出了3個中的一個位元組,可想而知,當然只能是一個亂碼了。
看到這裡,馬上可以想到解決方案了,把字串裡面的byte數組轉成rune數組就可以了,是的,看下面:
除了這個方法外,也可以使用Go語言的迭代文法:
三 字串的拼接
在Go語言中,一般的字串拼接直接用+號就可以了:
但是如果需要提高效能,可以匯入bytes包如像下面這樣:
今天就到這裡啦。。。。。