2020年11月14日 星期六

[ 文章收集 ] 淺析 rune 數據類型

 Source From Here

Preface
在學習 golang 基礎的時候,發現有個叫rune的的數據類型,當時不理解這個類型的意義。查詢,官方的解釋如下:
  1. // rune is an alias for int32 and is equivalent to int32 in all ways. It is  
  2. // used, by convention, to distinguish character values from integer values.  
Learn by Example
這樣可能還是對rune的作用與意義比較懵逼,我們通過一個簡單的範例來看下rune的作用。先來看下下面這塊代碼執行結果是什麼?
  1. package main  
  2.   
  3. import "fmt"  
  4.   
  5. func main() {  
  6.   
  7.     var str = "hello 你好"  
  8.     fmt.Println("len(str):", len(str))  
  9.   
  10. }  
我們猜測結果應該是:8:5個字符1個空格2個漢字。那麼正確答案是多少呢?
# go run test.go
len(str): 12

咦...結果居然是12,這是為什麼呢!?
golang 中 string 底層是通過 byte 數組 實現的。中文字符在 unicode 下佔 2 個字節,在 utf-8 編碼下佔 3 個字節,而 golang 默認編碼正好是 utf-8。

那麼?如果我們預期想得到一個字符串的長度,而不是字符串底層占得字節長度,該怎麼辦呢???
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "unicode/utf8"  
  6. )  
  7.   
  8. func main() {  
  9.   
  10.     var str = "hello 你好"  
  11.   
  12.     //golang中string底层是通过byte数组实现的,座椅直接求len 实际是在按字节长度计算  所以一个汉字占3个字节算了3个长度  
  13.     fmt.Println("len(str):", len(str))  
  14.       
  15.     //以下两种都可以得到str的字符串长度  
  16.       
  17.     //golang中的unicode/utf8包提供了用utf-8获取长度的方法  
  18.     fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))  
  19.   
  20.     //通过rune类型处理unicode字符  
  21.     fmt.Println("rune:", len([]rune(str)))  
  22. }  
運行結果:
# go run test.go
len(str): 12
RuneCountInString: 8
rune: 8

golang 中還有一個 byte 數據類型與 rune 相似 (Golang data types),它們都是用來表示字符類型的變量類型。它們的不同在於:
* byte 等同於 int8,常用來處理 ascii 字符
* rune 等同於 int32, 常用來處理 unicode 或 utf-8 字符


Supplement
The Golang blog - Strings, bytes, runes and characters in Go

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...