Source From Here
Preface在學習 golang 基礎的時候,發現有個叫rune的的數據類型,當時不理解這個類型的意義。查詢,官方的解釋如下:
- // rune is an alias for int32 and is equivalent to int32 in all ways. It is
- // used, by convention, to distinguish character values from integer values.
這樣可能還是對rune的作用與意義比較懵逼,我們通過一個簡單的範例來看下rune的作用。先來看下下面這塊代碼執行結果是什麼?
- package main
- import "fmt"
- func main() {
- var str = "hello 你好"
- fmt.Println("len(str):", len(str))
- }
咦...結果居然是12,這是為什麼呢!?
那麼?如果我們預期想得到一個字符串的長度,而不是字符串底層占得字節長度,該怎麼辦呢???
- package main
- import (
- "fmt"
- "unicode/utf8"
- )
- func main() {
- var str = "hello 你好"
- //golang中string底层是通过byte数组实现的,座椅直接求len 实际是在按字节长度计算 所以一个汉字占3个字节算了3个长度
- fmt.Println("len(str):", len(str))
- //以下两种都可以得到str的字符串长度
- //golang中的unicode/utf8包提供了用utf-8获取长度的方法
- fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
- //通过rune类型处理unicode字符
- fmt.Println("rune:", len([]rune(str)))
- }
golang 中還有一個 byte 數據類型與 rune 相似 (Golang data types),它們都是用來表示字符類型的變量類型。它們的不同在於:
Supplement
* The Golang blog - Strings, bytes, runes and characters in Go
沒有留言:
張貼留言