《快學 Go 語言》第 7 課 —— 誘人的烤串
字串通常有兩種設計,一種是「字元」串,一種是「位元組」串。「字元」串中的每個字都是定長的,而「位元組」串中每個字是不定長的。Go 語言裡的字串是「位元組」串,英文字元佔用 1 個位元組,非英文字元佔多個位元組。這意味著無法通過位置來快速定位出一個完整的字元來,而必須通過遍歷的方式來逐個獲取單個字元。
圖片
我們所說的字元通常是指 unicode 字元,你可以認為所有的英文和漢字在 unicode 字符集中都有一個唯一的整數編號,一個 unicode 通常用 4 個位元組來表示,對應的 Go 語言中的字元 rune 佔 4 個位元組。在 Go 語言的原始碼中可以找到下面這行程式碼,rune 型別是一個衍生型別,它在記憶體裡面使用 int32 型別的 4 個位元組儲存。
type rune int32
使用「字元」串來表示字串勢必會浪費空間,因為所有的英文字元本來只需要 1 個位元組來表示,用 rune 字元來表示的話那麼剩餘的 3 個位元組都是零。但是「字元」串有一個好處,那就是可以快速定位。
為了進一步方便讀者理解位元組 byte 和 字元 rune 的關係,我花了下面這張圖
相關推薦
快學 Go 語言第 2 課 —— 變數什麼的最討厭了
任何一門語言裡面最基礎的莫過於變量了。如果把記憶體比喻成一格一格整齊排列的儲物箱,那麼變數就是每個儲物箱的標識,我們通過變數來訪問計算機記憶體。沒有變數的程式對於人類來說是可怕的,需要我們用數字位置來定位記憶體的格子,人類極不擅長這樣的事。這就好比一歲半左右的幼兒還沒有學會很多名詞,只能用手來對物
《快學 Go 語言》第 7 課 —— 誘人的烤串
字串通常有兩種設計,一種是「字元」串,一種是「位元組」串。「字元」串中的每個字都是定長的,而「位元組」串中每個字是不定長的。Go 語言裡的字串是「位元組」串,英文字元佔用 1 個位元組,非英文字元佔多個位元組。這意味著無法通過位置來快速定位出一個完整的字元來,而必須通過遍歷的方式來逐個獲取單個
《快學 Go 語言》第 7 課 —— 字串
字串通常有兩種設計,一種是「字元」串,一種是「位元組」串。「字元」串中的每個字都是定長的,而「位元組」串中每個字是不定長的。Go 語言裡的字串是「位元組」串,英文字元佔用 1 個位元組,非英文字元佔多個位元組。這意味著無法通過位置來快速定位出一個完整的字元來,而必須通過遍歷的方式來逐個獲取單個字元。
《快學 Go 語言》第 4 課 —— 低調的陣列
陣列就是一篇連續的記憶體,幾乎所有的計算機語言都有陣列,只不過 Go 語言裡面的陣列其實並不常用,這是因為陣列是定長的靜態的,一旦定義好長度就無法更改,而且不同長度的陣列屬於不同的型別,之間不能相互轉換相互賦值,用起來多有不方便之處。 切片是動態的陣列,是可以擴充內容增加長度的陣列。當長度不變時,它用起來就
《快學 Go 語言》第 5 課 —— 靈活的切片
切片無疑是 Go 語言中最重要的資料結構,也是最有趣的資料結構,它的英文詞彙叫 slice。所有的 Go 語言開發者都津津樂道地談論切片的內部機制,它也是 Go 語言技能面試中面試官最愛問的知識點之一。初級使用者很容易濫用它,這小小的切片想要徹底的理解它是需要花費一番功夫的。在使用切片之前,我覺得很有必要將切
《快學 Go 語言》第 6 課 —— 字典
字典在數學上的詞彙是對映,將一個集合中的所有元素關聯到另一個集合中的部分或全部元素,並且只能是一一對映或者多對一對映。 陣列切片讓我們具備了可以操作一塊連續記憶體的能力,它是對同質元素的統一管理。而字典則賦予了不連續不同類的記憶體變數的關聯性,它表達的是一種因果關係,字典的 key 是因,
《快學 Go 語言》第 8 課 —— 程式大廈是如何構建起來的
本節我們要開講 Go 語言在資料結構上最重要的概念 —— 結構體。如果說 Go 語言的基礎型別是原子,那麼結構體就是分子。分子是原子的組合,讓形式有限的基礎型別變化出豐富多樣的形態結構。結構體裡面裝的是基礎型別、切片、字典、陣列以及其它型別的結構體等等。 因為結構體的存在,Go 語言的變數
《快學 Go 語言》第 9 課 —— 介面
介面是一個物件的對外能力的展現,我們使用一個物件時,往往不需要知道一個物件的內部複雜實現,通過它暴露出來的介面,就知道了這個物件具備哪些能力以及如何使用這個能力。 我們常說「佛有千面」,不同的人看到的佛並不一樣。一個複雜的複合物件常常也可以是一個多面手,它具備多種能力,在形式上實現了多種介面。「弱水三千,只
《快學 Go 語言》第 10 課 —— 錯誤與異常
Go 語言的異常處理語法絕對是獨樹一幟,在我見過的諸多高階語言中,Go 語言的錯誤處理形式就是一朵奇葩。一方面它鼓勵你使用 C 語言的形式將錯誤通過返回值來進行傳遞,另一方面它還提供了高階語言一般都有的異常丟擲和捕獲的形式,但是又不鼓勵你使用這個形式。後面我們統一將返回值形式的稱為「錯誤」,將丟擲捕獲形式的稱
《快學 Go 語言》第 11 課 —— 千軍萬馬跑協程
協程和通道是 Go 語言作為併發程式語言最為重要的特色之一,初學者可以完全將協程理解為執行緒,但是用起來比執行緒更加簡單,佔用的資源也更少。通常在一個程序裡啟動上萬個執行緒就已經不堪重負,但是 Go 語言允許你啟動百萬協程也可以輕鬆應付。如果把協程比喻成小島,那通道就是島嶼之間的交流橋樑,資料搭乘通道從一個協
《快學 Go 語言》第 12 課 —— 通道
不同的並行協程之間交流的方式有兩種,一種是通過共享變數,另一種是通過佇列。Go 語言鼓勵使用佇列的形式來交流,它單獨為協程之間的佇列資料交流定製了特殊的語法 —— 通道。 通道是協程的輸入和輸出。作為協程的輸出,通道是一個容器,它可以容納資料。作為協程的輸入,通道是一個生產者,它可以向協程提供資料。通道作為
《快學 Go 語言》第 13 課 —— 併發與安全
上一節我們提到併發程式設計不同的協程共享資料的方式除了通道之外還有就是共享變數。雖然 Go 語言官方推薦使用通道的方式來共享資料,但是通過變數來共享才是基礎,因為通道在底層也是通過共享變數的方式來實現的。通道的內部資料結構包含一個數組,對通道的讀寫就是對內部陣列的讀寫。 在併發環境下共享讀寫變數必須要使用鎖
《快學 Go 語言》第 14 課 —— 魔術變性指標
本節我們要學習一些 Go 語言的魔法功能,通過內建的 unsafe 包提供的功能,直接操縱指定記憶體地址的記憶體。有了 unsafe 包,我們就可以洞悉 Go 語言內建資料結構的內部細節。 unsafe.Pointer Pointer 代表著變數的記憶體地址,可以將任意變數的地址轉換成 Pointer 型
《快學 Go 語言》第 15 課 —— 反射
反射是 Go 語言學習的一個難點,但也是非常重要的一個知識點。反射是洞悉 Go 語言型別系統設計的法寶,Go 語言的 ORM 庫離不開它,Go 語言的 json 序列化庫離不開它,Go 語言的執行時更是離不開它。筆者在學習反射功能的時候也是費了好大一番功夫才敢說自己確實搞懂了。下面請讀者跟著我的步伐來一步一步
C語言第7課——字串
在 C 語言中,字串實際上是使用 null 字元 '\0' 終止的一維字元陣列。因此,一個以 null 結尾的字串,包含了組成字串的字元。 char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; char greetin
易學筆記-Go語言-第4章:基本結構和基本資料型別/4.4 變數/4.4.7 變數的作用域
變數的作用域 變數的作用域有幾種: 包間變數:也是在函式外宣告的變數,而且第一個字母是大寫,所有本包函式或者包外函式都可見 全域性變數:在函式外宣告的變數,所有函式都可見 區域性變數:在本函式內部都可見 塊變數:僅僅在某個塊中可見,
Go語言第十九課 反射
package reflect import ( "testing" "strconv" "fmt" "reflect" ) type student interface { getAge
Go語言第十八課 CGO
可藉助CGO實現Go語言對C的呼叫,下面展示幾種呼叫方式。 1、直接巢狀C程式碼 C程式碼內容如下: #include <stdio.h> #include <stdlib.h> #include <string.h> char*
易學筆記-Go語言-第4章:基本結構和基本資料型別/4.5 基本型別/4.5.7 隨機數
易學筆記 十年IT經驗個人學習筆記分享: 開發語言:C/C++/JAVA/PYTHON/GO/JSP WEB架構:Servlets/springMVC/springBoot/springClound 容器架構:Docker容器/Docker叢集/Docker與微服務整合/
跟阿銘學linux 第四課 Linux磁盤管理
linux4.1 df 命令1)<df> 查看磁盤使用情況 <df -h> 按合適的單位顯示 /dev/shm 內存 -速度快 tmpfs 臨時的 重啟後會消失 <df -i> 查看inode使用情況 <df -m>