【问题标题】:golang how does the rune() function workgolang的rune()函数是如何工作的
【发布时间】:2016-12-31 10:09:48
【问题描述】:

我在网上发现了一个在 golang 中使用 rune() 函数的函数,但我很难查找它是什么。我正在阅读本教程并且对文档缺乏经验,因此很难找到我要查找的内容。

具体来说,我想看看为什么会失败......

fmt.Println(rune("foo"))

这不是

fmt.Println([]rune("foo"))

【问题讨论】:

标签: go


【解决方案1】:

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

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

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

所以您的示例打印了一段符文,其值为 102、111 和 111

【讨论】:

  • 您能否编辑您的帖子以包含您找到该信息的链接?
【解决方案2】:

正如@Michael 的first-rate comment 中所述,fmt.Println([]rune("foo")) 是将字符串转换为符文片段[]符文。当您从字符串转换为 []rune 时,该字符串中的每个 utf-8 字符都会变成一个 Rune。见https://stackoverflow.com/a/51611567/12817546。同样,在反向转换中,当从 []rune 转换为 string 时,每个 rune 都成为字符串中的一个 utf-8 char。见https://stackoverflow.com/a/51611567/12817546。 []rune 也可以设置为 byte、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。引用已编辑。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 2022-01-26
  • 2021-03-30
  • 2020-07-18
  • 2015-11-08
  • 2017-05-21
相关资源
最近更新 更多