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