讓我們一起Go(七)


前言:

  在上一篇中,我們初步學習了下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包如像下面這樣:

 今天就到這里啦。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM