Go语言 为什么“int”可以转换为“string”?

o3imoua4  于 2022-12-20  发布在  Go
关注(0)|答案(3)|浏览(263)

这个例子说明了int类型可以转换成string类型,但我的问题是为什么?

package main

import (
    "fmt"
    "reflect"
)

func main() {
    it := reflect.TypeOf(42)
    st := reflect.TypeOf("hello")

    fmt.Printf("%q is convertible to %q: %v\n",
        it, st, it.ConvertibleTo(st))
        // OUTPUT: "int" is convertible to "string": true

    fmt.Printf("%q is convertible to %q: %v\n",
        st, it, st.ConvertibleTo(it))
        // OUTPUT: "string" is convertible to "int": false
}

如果我说错了请纠正我,但这不也应该是false吗?

reflect.TypeOf(int(0)).ConvertibleTo(reflect.TypeOf("string"))
au9on6nz

au9on6nz1#

为什么"int"可以转换为"string"?
因为语言规范1是这么说的:
将有符号或无符号整数值转换为字符串类型将生成包含整数的UTF-8表示形式的字符串。
1:转换,"与字符串类型之间的转换"部分

jchrr9hc

jchrr9hc2#

intstring转换的含义是创建一个包含一个unicode字符的字符串:返回由该整数的数字标识的字符。
请看这个例子:

package main

import (
    "fmt"
)

func main() {
    fmt.Println(string(int(1234)))
}

On playground
输出:

Ӓ

这是因为Unicode字符1234(或更标准表示法中的U +04D2)为:
西里尔文大写字母A随以横隔
你还会注意到,在Go语言的操场上,你会看到go vet的一个红色输出,这是一个用来查找Go语言程序中常见问题的工具,输出警告:
./程序开始:8:14:从int到string的转换会产生一个rune字符串,而不是一个数字串(你是说fmt.sprint(x)吗?)
这是因为这种转换相当奇怪,而且不常用,所以go vet基本上默认将其视为潜在错误。

w1e3prcc

w1e3prcc3#

fmt.Println()fmt.Sprintf()处理参数的方式不同。
你可以给fmt.Println()输入任何东西,它会打印出来(%v),比如:

fmt.Println(string(97)) // a

fmt.Sprintf()将工作,但如果您尝试类似以下内容,则会给予关于conversion from int to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)的警告:

x := fmt.Sprintf("%s", string(97))

因为string()以“Go”方式处理整数。
因此,要正确地打印rune(就像大多数其他语言中的chr()函数一样),应该先将int强制转换为rune,如下所示:

x := fmt.Sprintf("%s", string(rune(97)))

相关问题