Go語言計算字串長度——len()和RuneCountInString()

2020-07-16 10:04:20
Go 語言的內建函數 len(),可以用來獲取切片、字串、通道(channel)等的長度。下面的程式碼可以用 len() 來獲取字串的長度。
tip1 := "genji is a ninja"
fmt.Println(len(tip1))

tip2 := "忍者"
fmt.Println(len(tip2))
程式輸出如下:
16
6

len() 函數的返回值的型別為 int,表示字串的 ASCII 字元個數或位元組長度。
  • 輸出中第一行的 16 表示 tip1 的字元個數為 16。
  • 輸出中第二行的 6 表示 tip2 的字元格式,也就是“忍者”的字元個數是 6,然而根據習慣,“忍者”的字元個數應該是 2。

這裡的差異是由於 Go 語言的字串都以 UTF-8 格式儲存,每個中文占用 3 個位元組,因此使用 len() 獲得兩個中文文字對應的 6 個位元組。

如果希望按習慣上的字元個數來計算,就需要使用 Go 語言中 UTF-8 包提供的 RuneCountInString() 函數,統計 Uncode 字元數量。

下面的程式碼展示如何計算UTF-8的字元個數。
fmt.Println(utf8.RuneCountInString("忍者"))
fmt.Println(utf8.RuneCountInString("龍忍出鞘,fight!"))
程式輸出如下:
2
11

一般遊戲中在登入時都需要輸入名字,而名字一般有長度限制。考慮到國人習慣使用中文做名字,就需要檢測字串 UTF-8 格式的長度。

總結

  • ASCII 字串長度使用 len() 函數。
  • Unicode 字串長度使用 utf8.RuneCountInString() 函數。