我偶然发现了一个在网上发布的函数,它使用了rune()函数,但是我很难找到它是什么。我正在阅读教程,对文档缺乏经验,所以很难找到我要找的东西。
具体来说,我想知道为什么这个失败..。
fmt.Println(rune("foo"))但这并不是
fmt.Println([]rune("foo"))发布于 2016-08-24 10:45:42
rune是Go中的一个类型。它只是int32的别名,但通常用于表示Unicode点。rune()不是一个函数,它是将类型转换为rune的语法。Go中的转换始终具有语法type(),这可能使它们看起来像函数。
第一段代码会失败,因为在Go中没有定义字符串到数值类型的转换。然而,字符串到runes/int32s切片的转换在语言规范中是这样定义的:
将字符串类型的值转换为runes类型的片段将产生一个包含字符串的单个Unicode代码点的切片。[golang.org]
因此,您的示例输出一段文字,其值为102、111和111。
发布于 2020-07-05 09:36:44
正如@Michael's 一流评论 fmt.Println([]rune("foo"))中所述,将字符串转换为runes []符文的片段。当您将字符串转换为[]符文时,该字符串中的每个utf-8字符都会变成一个符文。见https://stackoverflow.com/a/51611567/12817546。类似地,在反向转换中,当从[]rune转换为string时,每个rune都成为字符串中的utf-8字符。见https://stackoverflow.com/a/51611567/12817546。[]符文也可以设置为字节、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“,string(r)打印”string foo“,r[0] != 0并显示”bool true“。
[]规范本机支持符文到字符串的转换。请参阅https://stackoverflow.com/a/46021588/12817546中的评论。在Go中,字符串是一个字节序列。但是,由于多个字节可以表示一个符文代码点,一个字符串值也可以包含runes。因此,它可以转换为[]符文,反之亦然。见https://stackoverflow.com/a/19325804/12817546。
注意,Go中只有两个内置类型别名,即字节(uint8别名)和rune (int32别名)。见https://Go101.org/article/type-system-overview.html。符文只是32位的整数值.例如,符文文字'a‘实际上是数字"97“。见https://stackoverflow.com/a/19311218/12817546。经编辑的引号。
https://stackoverflow.com/questions/39120506
复制相似问题