为了账号安全,请及时绑定邮箱和手机立即绑定

golang的rune()函数是如何工作的

golang的rune()函数是如何工作的

Go
梦里花落0921 2022-03-03 15:13:12
我遇到了一个在线发布的函数,该rune()函数在 golang 中使用了该函数,但我很难查找它是什么。我正在阅读本教程并且对文档缺乏经验,因此很难找到我要查找的内容。具体来说,我想看看为什么这会失败......fmt.Println(rune("foo"))而这并不fmt.Println([]rune("foo"))
查看完整描述

2 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

rune是 Go 中的一种类型。它只是 的别名int32,但通常用于表示 Unicode 点。rune()不是函数,它是类型转换为rune. Go 中的转换总是具有type()可能使它们看起来像函数的语法。

代码的第一位失败,因为 Go 中没有定义字符串到数字类型的转换。然而,将字符串转换为 runes/int32s 切片在语言规范中是这样定义的:

将字符串类型的值转换为 runes 类型的切片会产生一个切片,其中包含字符串的各个 Unicode 代码点。[ golang.org ]

因此,您的示例打印出一片符文,其值为 102、111 和 111


查看完整回答
反对 回复 2022-03-03
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

fmt.Println([]rune("foo"))中所述,将字符串转换为符文 [] 符文切片。当您从字符串转换为 []rune 时,该字符串中的每个 utf-8 字符都会变成一个 Rune。请参阅https://stackoverflow.com/a/51611567/12817546。同样,在反向转换中,当从 []rune 转换为字符串时,每个 rune 都变成字符串中的一个 utf-8 char。请参阅https://stackoverflow.com/a/51611567/12817546。[]rune 也可以设置为字节、float64、int 或 bool。


package main


import (

    . "fmt"

)


func main() {

    r := []rune("foo")

    c := []interface{}{byte(r[0]), float64(r[0]), int(r[0]), r, string(r), r[0] != 0}

    checkType(c)

}


func checkType(s []interface{}) {

    for k, _ := range s {

        Printf("%T %v\n", s[k], s[k])

    }

}

byte(r[0])设置为“uint8 102”,float64(r[0])设置为“float64 102”,int(r[0])设置为“int 102”,r是符文“[]int32 [102 111 111]”,string(r)打印“string foo”,r[0] != 0并显示“bool true” .


规范原生支持 []rune 到字符串的转换。请参阅https://stackoverflow.com/a/46021588/12817546中的评论。在 Go 中,字符串是一个字节序列。但是,由于多个字节可以表示一个符文代码点,因此字符串值也可以包含符文。因此,它可以转换为 []rune ,反之亦然。请参阅https://stackoverflow.com/a/19325804/12817546。


注意,Go 中只有两个内置类型别名,byte(uint8 的别名)和 rune(int32 的别名)。请参阅https://Go101.org/article/type-system-overview.html。符文文字只是 32 位整数值。例如,符文文字“a”实际上是数字“97”。请参阅https://stackoverflow.com/a/19311218/12817546。行情已编辑。


查看完整回答
反对 回复 2022-03-03
  • 2 回答
  • 0 关注
  • 293 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信