為什麼 go 中字串不能用下標訪問
在大多數程式語言中,字串是可以直接通過下標訪問的,但是在使用 go 語言的時候,直接使用下標訪問有時候會出現一些亂碼。
陣列
在解決這個問題之前,要先了解一個東西--陣列:陣列是用於儲存多個相同型別資料的集合。並且陣列在申請記憶體的時候,是一次申請一塊連續的記憶體。比如我們建立一個陣列,裡面存了這幾個元素。
由於記憶體是連續的,元素的型別也是相同的,所以每個元素佔用的記憶體空間也是固定的,比如 java 中 char 型別佔用兩個位元組。陣列的記憶體空間是平等劃分的,這樣就可以解釋為什麼可以靠下標訪問了。
在可以用下標訪問的語言中,字串都是按照字元編碼的。也就是說,你將字串 “abcd” 賦給變數 a,本質上是建立了一個字元陣列用來存放字串。但是在 go 語言裡不一樣,go 語言的字元型是按照位元組編碼的,什麼意思呢? 26 個英文字母,每個英文字母佔一個位元組,在 go 語言的 string 裡面就佔用一個位元組。中文日文韓文就不一樣了, go 語言內建只支援 utf8 編碼,在 utf8 裡面,有一部分漢字佔用 3 個位元組,一部分漢字佔用 4 個位元組。比如 "巧" 這個字,列印一下它的長度,發現這個 string 佔用 3 個位元組,加上 "a" 之後佔用 4 個位元組,應該能理解按位元組編碼的意思了。
編碼
為什麼要 go 要選擇按照位元組來編碼呢,這其實是為了節省空間。想象一下,在UTF-8編碼中,中文有些要三個位元組,有一些要佔用四個位元組,而英文字母只需要佔用一個位元組。一箇中文算一個字元,一個英文字母也算一個字元,但是佔用的記憶體相差很大,假設有一個超長字串,裡面有英文字元遠多於中文字元,如果按字元來儲存,每個字元要分配四個位元組。因為低於四個位元組,有可能有些中文就不能正常儲存了,在這種情況下,每儲存一個英文字母,就要浪費三個位元組的記憶體空間。
底層實現和其它語言就不一樣,不同型別的字元佔用的記憶體空間都不同,當然也就沒有辦法按照下標訪問了,不信可以試試。
a[0] 是 97,等於字母 a 的 ascii 碼,a1 是 229,顯然不會是漢字 "巧" 的 utf8,事實它是 utf8 編碼的第一位元組的值。
打完收工,到這裡弄清楚了 go 中 string 不能按照下標訪問的原理了
公眾號:沒有夢想的阿巧 後臺回覆 "群聊",一起學習,一起進步
相關文章
- 為什麼子目錄下安裝zblog只能訪問後臺
- 為什麼網站訪問速度很慢網站
- 為什麼在pyhton中不能用函式重新賦值函式賦值
- 為什麼類只能用public修飾?
- html標籤種類很多,為什麼不都用div?HTML
- go 突破訪問限制,訪問其他包中的私有變數Go變數
- 為什麼 Go 語言能在中國這麼火?Go
- [20220328]查詢游標為什麼不共享指令碼.txt指令碼
- 為什麼不建議在for迴圈中使用"+"進行字串拼接字串
- 為什麼訪問寶塔皮膚總是提示404?
- 為什麼.bashrc中的alias別名不能用於指令碼中和Makefile指令碼
- 為什麼陣列下標是從0開始?陣列
- 什麼是智慧指標?為什麼要用智慧指標?指標
- [20220420]完善查詢游標為什麼不共享指令碼.txt指令碼
- GreatSQL 中為什麼 Update 不會被鎖等待SQL
- prometheus-go-sdk不活躍指標清理問題PrometheusGo指標
- 為什麼國內網站訪問慢【香港伺服器】?內網網站伺服器
- 4.我為什麼喜歡用Dart中的字串?Dart字串
- 為什麼89C51的串列埠中斷只能用T1串列埠
- Vector用陣列下標訪問的條件陣列
- 為什麼電話機器人回答不上問題?機器人
- 如何在 Go 中將 int 型別轉為字串Go型別字串
- 在css中為什麼說不建議使用@import?CSSImport
- Spring中為什麼不建議使用欄位注入Spring
- Python中判斷是否為數字字串的方法是什麼?Python字串
- Java中Switch支援String字串?為什麼不支援long型別?Java字串型別
- win10印表機為什麼拒絕訪問 win10印表機拒絕訪問的方法Win10
- Go高階特性 12 | 指標詳解:在什麼情況下應該使用指標?Go指標
- 為什麼idea建議使用“+”拼接字串Idea字串
- python為什麼要字串格式化Python字串格式化
- 遠端訪問技術指什麼
- 遠端訪問技術是什麼
- 我為什麼從php轉go?PHPGo
- Dubbo為什麼要用Go重寫?Go
- Go 小白的十萬個為什麼Go
- 為什麼阿里巴巴不建議在for迴圈中使用"+"進行字串拼接阿里字串
- 為什麼阿里巴巴不建議在for迴圈中使用”+”進行字串拼接阿里字串
- 跨域訪問是什麼!怎麼解決?跨域