讓我們一起Go(七)

來源:互聯網
上載者:User
前言:

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

 今天就到這裡啦。。。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.