讓咱們一塊兒Go(六)

前言:

  一如既往,繼續Go語言的學習,不過繼續學習以前,允許我再廢話幾句。最近發現堅持一件事情很重要,並且最近也發現堅持一件事情真的有點難。雖然文章基礎,不過我仍是要堅持的,廢話完畢,那麼就繼續吧。java

 

一 Go語言之字符串

  與大多數面向對象編程語言同樣,Go語言也具備string(字符串)類型,只不過它與其它語言例如java中的String類型不同的是它是值類型。而且注意聲明的關鍵字是string,所有小寫的哦,親(java程序員尤爲注意,c#程序員偷樂中......)。除此以外,它還有個特性就是不可變性,這裏須要注意的是指字符串自己不可變並非字符串變量不可變,稍後看例子就能明白。在Go語言中string類型的結構以下:python

1 struct String2 {3     byte*    str;4     int32    len;5 };

上述結構能夠在Go語言的源代碼中的runtime.h頭文件中找到。
從上述結構,咱們能夠看出,其實string類型是由一個byte指針和int32類型的表示字符串長度的變量兩部分組成。其中這裏的byte是uint8的別名,實質上它就表示8位的無符號整數,所以本質上在計算機上字符串其實也就是數字而已。只不過,經過不一樣的編碼方式將數字映射到相應的字符上。並且在Go語言中使用的是UTF-8編碼方式。若是你還不明白所謂的編碼方式,那麼請本身經過網絡查閱吧,由於涉及的知識點又會比較多,而今天咱們只關注Go語言,因此這裏就不細說了。程序員

以上結構是Go語言的runtime中的c語言的結構體,因此,實際上在Go語言中的string類型你能夠理解成內部就是上面的結構,至因而如何實現的,如今不必搞清楚,這關乎Go的語言底層實現了,暫時咱們只須要使用就能夠了。固然有興趣的也能夠從底層去挖。編程

爲了讓事情更好玩些,咱們固然也能夠在Go語言層面上模擬下上面的結構,固然實際中是毫無心義的,看下面:c#

 sk

 

在main函數中首先聲明定義了一個animal的字符串,而後將它轉成byte數組,並將它的地址傳給咱們自定義的String結構體,可是String結構體的第一個參數不是一個指針類型嗎?沒錯,其實指針變量就是用來存放該類型的內存地址的變量,當它接收一個byte數組的首地址時,就能夠控制數組了。因此,當咱們傳遞給String結構體前面的那個b的byte數組的地址後,其實也就能夠控制這個數組了。是否是已經暈了?嘿嘿,正常,當初剛學C語言的時候,筆者也一直沒明白指針。後來慢慢的就習慣了。再看上圖30行,這的print是咱們本身定義的打印這個結構體的函數,當咱們傳入String結構體類型cat變量後,第16行,咱們循環遍歷結構體的指針變量,打印出它的每個byte,因爲Go語言不能和C語言同樣直接進行指針運算,因此須要引入unsafe包,經過它進行運算,這裏就不詳細介紹了,如非須要瞭解能夠查詢文檔,不過對於初學者來講沒什麼大的意義,並且Go原本就不建議直接指針運算,否則直接用C好了,嘿嘿。經過上面的一頓折騰,最終將byte轉成string打印出來,因此最後byte數組又被還原成string了。windows

看完上面一段,估計有讀者要罵了,Go語言那麼麻煩,比C語言還麻煩。請冷靜啊,上面的在實際開發中是幾乎不多用到的,否則還真不如直接用C語言了,我這裏寫這一大堆,只是想闡釋下它的內部結構,順帶練習下Go的結構體,徹底沒明白的也不用管,或許等隨着咱們的深刻學習,時間久了,再回來看就能明白了哦。數組

 

二 字符串操做

  瞭解了字符串的基本狀況後,咱們再來看看對於字符串的操做。在上一節中,咱們其實已經對字符串求了它的長度,就是經過len函數。不過它求得的結果並非字符串中字符的個數,這彷佛和其它一些的語言不太同樣,例如java。不過,當你賦值給它的都是英文字符的時候,彷佛這個結果就是字符個數,可是當你將中文賦值給它後,就有些不太對了,不信能夠試試。這裏我將開發平臺切換到了Linux,由於在windows下命令提示符下對於UTF-8的字符集操做不太方便。請看例子:網絡

 

最終結果是:編程語言

結果是12,有圖有真相,爲何是這個結果呢?緣由是在Go語言中,字符是utf-8編碼的,其中英文字符一個算一個字節,中文算三個字節。那麼,咱們若是非要獲得字符個數呢?能夠將string轉換成[]rune類型:函數

rune沒啥好奇怪的,其實就是int32的別名,因此這裏實際上是將string轉成了32位整數數組分別存入對應字符的unicode,這樣最終有幾個字符就對應幾個unicode分別位於數組中。所以最後能夠獲得長度爲2。固然能夠打印看下unicode是什麼:

 接下來,來點輕鬆的,你們都知道python中對數組能夠切片,在Go中,也能夠。以下:

最終結果:

 今天就到這裏,感受文章愈來愈長了,額,沒辦法,隨着深刻學習必然會這樣,可是我仍是會盡可能縮短每篇的長度的。但願對你們有幫助~

相關文章
相關標籤/搜索