学习Golang教程--符文类型解释与实例

171 阅读5分钟

Rune是Go编程语言中的一种数据类型。符文是代表int32值的字符字面,每个int值都被映射到Unicode代码点en.wikipedia.org/wiki/Code_p…

它代表世界上任何语言的任何字母的任何字符。

语言中的每个字符都有不同的含义。对于英语来说,该字符来自于字母 "B"、"b"、"&",对于中文来说,它是 "我"。

像其他编程语言一样,Go没有字符数据类型。字节和符文用来表示字符字面。字节表示ASCII码。

rune代表以UTF-8格式编码的Unicode字符。

ASCII字符

它包含128个字符,其中包含从0到127的整数值。它可以存储在8位类型中,即byte

Unicode字符

它是ASCII字符集的超集,包含从0到2的整数21个字符。并非所有的整数都映射为Unicode字符,但有些是保留的。

以下是符文类型的要点

  • 它是int32的别名,意味着它可以容纳从o到2的32次方的数值 -1
  • 代表Unicode代码点
  • 它是一个用单引号括起来的字符字面。
  • 一组符文代表字符串,可以投给[]符文
  • 符文代表字符字面。
  • 符文是go语言中的一个关键词

创建符文类型的变量

你可以像其他数据类型一样创建一个变量

var runeVariable rune // filled with default zero value -  U+0000  

如果变量在声明时没有分配任何值,编译器会默认为零值,即U+0000。

var runeVariable rune = 'Z'  

在一个单一的语句中,变量被声明并分配了字符字面的值。请注意,字符字面意义总是包含在单引号中或没有符文关键字,你可以声明一个变量并分配一个字面意义,编译器将推断出符文类型。因此,对于一个字符,默认的类型是符文。

var charVariable = 'C' // compiler infer its type as rune for character literals  

像其他的变量赋值一样,你可以通过省略var关键字和rune关键字来使用速记赋值运算符():=

runeVariable := 'Z'  

编译器从右边的值中推断出类型。

使用符文字头值创建符文类型

符文字元用于表示Unicode字符或单个字符 Unicode字符总是以\U开头,后面是4位十六进制数值,可以用双引号或Unicode代码点括起来的单个字符表示,一些符文字元的例子是

var v1='B' is same as   '\u0042'  
var v2 = '\u2665' same as '♥'  
var letter = '\n' is same as '\u000A'  

Unicode代码点 这些将被映射到包含整数的字符上。这些数字被称为代码点。每个Unicode都有代码点的格式。它总是以U+开头,后面是代码点的十六进制值。

var charVariable = 'C' // Type inferred as `rune` (Default type for character values)  
var myvariable rune = '♥'  

符文使用实例

检查rune变量类型

rune是int32的别名,用于表示Unicode字符。 reflect.TypeOf函数检查rune变量类型,并返回int32。

  
  
package main  
  
import (  
 "fmt"  
 "reflect"  
)  
  
func main() {  
 variable := 'A'  
 fmt.Printf("%d \n", variable)  
 fmt.Println(reflect.TypeOf(variable))  
}  

上述程序的输出是

65  
int32  

在一个字符串上遍历符文

字符串包含字符或符文的片断。我们可以使用for循环的范围形式来迭代符文

func main() {  
  
str1 := "kiran"  
 for i, rune := range str1 {  
  fmt.Printf("%d: %c:%U\n", i, rune, rune)  
 }  
}  

当上述代码被编译和执行时,输出结果如下

0: k:U+006B  
1: i:U+0069  
2: r:U+0072  
3: a:U+0061  
4: n:U+006E  

检查Unicode码位和一个字符或字符串的数字

字符串是以一组字符的形式表示的,即符文数组。范围形式的for循环迭代每个符文值,并打印字符、整数值和Unicode字面意义 以下是一个获取字符或字符串Unicode的程序

func main() {  
  
 // input is string  
 str := "my♥"  
 for _, r := range str {  
  fmt.Printf("%c - %d - %U\n", r, r, r) // character - integer - unicode  
 }  
 // input is character ie rune  
 char := '♥'  
 fmt.Printf("%c - %d - %U\n", char, char, char)  
  
}  

上述程序的输出是

  
m - 109 - U+006D  
y - 121 - U+0079  
 - 9829 - U+2665  
 - 9829 - U+2665  

将字符串转换为符文数组或切片 当字符串被转换为符文数组时,将返回一个新的数组,其中每个元素都包含Unicode代码点。如果字符串中的任何字符包含一个无效的UTF-8值,它将返回0xFFFD 下面是一个将字符串转换为符文数组/切片类型的代码程序及示例

package main  
  
import (  
 "fmt"  
)  
  
func main() {  
  
  strVariable := "my♥"  
 runeArray := []rune(strVariable)  
 fmt.Printf("%v\n", runeArray) // Ascii code array  
 fmt.Printf("%U\n", runeArray) // unicode code point array  
  
}  

上述程序的输出是

[109 121 9829]  
[U+006D U+0079 U+2665]  

当你将符文数组转换为字符串时,数组中的所有Unicode代码点都会被转换并附加到一个以UTF-8格式编码的新字符串中,如果任何Unicode超出了有效的Unicode范围,它将返回\uFFFD,而符号则返回。

package main  
  
import (  
 "fmt"  
)  
func main() {  
 runeArray := []rune{'\u006D', '\u0079', '\u2665',-1}  
 str := string(runeArray)  
 fmt.Println(str) // my♥�  
  
}  

输出是

my♥�  

如何获取符文和字节中的字符串的长度

下面的程序可以获得以字节为单位的字符串长度和以符文为单位的字符串长度,为了获得符文的长度,使用了unicode/utf8。

package main  
  
import (  
 "fmt"  
 "unicode/utf8"  
)  
func main() {  
 str := "This is test string"  
 fmt.Println(len(str))                    // return the length in bytes  
 fmt.Println(utf8.RuneCountInString(str)) // return the length in runes  
  
}  

输出是

19  
19