這裡的例子很好的解釋了,字串的不可變性,當你把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包如像下面這樣:
今天就到這裡啦。。。。。
讓我們一起Go(十三)
上篇,我們了解了go語言介面的一些知識,在這篇中,我們將繼續聊聊介面這東西。go語言中定義乙個空介面,也就是沒有任何函式需要實現的介面就是乙個空介面,作為乙個空介面,因為物件無需實現它的函式,所以它可以指向任何物件,看下面的示例 上面的empty介面變數分別可以被賦值為int型別,string型別,...
摩卡,讓我們一起成長
本人加入摩卡倒頗有些緣分 在剛籌畫成立天津研發中心時,就差點成為研發中心的一員,但由於種種原因未能成行 經過一年多的等待,最終還是走進了摩卡,成為一名上海本土員工。時間如梭,加入摩卡轉眼三年了,我能很清楚地感覺到自己的成長與進步,同時也目睹了公司快速健康發展與壯大的過程,能成為摩卡人的一分子感到榮幸...
摩卡,讓我們一起成長
本人加入摩卡倒頗有些緣分 在剛籌畫成立天津研發中心時,就差點成為研發中心的一員,但由於種種原因未能成行 經過一年多的等待,最終還是走進了摩卡,成為一名上海本土員工。時間如梭,加入摩卡轉眼三年了,我能很清楚地感覺到自己的成長與進步,同時也目睹了公司快速健康發展與壯大的過程,能成為摩卡人的一分子感到榮幸...