为什么 "int" 可以转换为 "string"?

Why is "int" convertible to "string"?

这个例子说明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"))

intstring转换的意思是创建一个带有一个unicode字符的字符串:由int的数字标识的字符。

看这个例子:

package main

import (
    "fmt"
)

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

On playground

输出:

Ӓ

这是因为 Unicode 字符 1234(或更标准表示中的 U+04D2)是:

CYRILLIC CAPITAL LETTER A WITH DIAERESIS


您还会注意到,在 Go 操场上,您会看到 go vet 的红色输出,这是一个用于查找 Go 程序中常见问题的工具。输出警告:

./prog.go:8:14: conversion from int to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)

这是因为这种转换比较奇怪,不常用,所以go vet基本上默认认为这是一个潜在的错误。

Why is “int” convertible to “string”?

因为语言规范1 是这样说的:

Converting a signed or unsigned integer value to a string type yields a string containing the UTF-8 representation of the integer.

1: Conversions, section "Conversions to and from a string type"