这个例子说明了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"))
3条答案
按热度按时间au9on6nz1#
为什么"int"可以转换为"string"?
因为语言规范1是这么说的:
将有符号或无符号整数值转换为字符串类型将生成包含整数的UTF-8表示形式的字符串。
1:转换,"与字符串类型之间的转换"部分
jchrr9hc2#
int
到string
转换的含义是创建一个包含一个unicode字符的字符串:返回由该整数的数字标识的字符。请看这个例子:
On playground
输出:
这是因为Unicode字符1234(或更标准表示法中的U +04D2)为:
西里尔文大写字母A随以横隔
你还会注意到,在Go语言的操场上,你会看到go vet的一个红色输出,这是一个用来查找Go语言程序中常见问题的工具,输出警告:
./程序开始:8:14:从int到string的转换会产生一个rune字符串,而不是一个数字串(你是说fmt.sprint(x)吗?)
这是因为这种转换相当奇怪,而且不常用,所以go vet基本上默认将其视为潜在错误。
w1e3prcc3#
fmt.Println()
和fmt.Sprintf()
处理参数的方式不同。你可以给
fmt.Println()
输入任何东西,它会打印出来(%v
),比如:fmt.Sprintf()
将工作,但如果您尝试类似以下内容,则会给予关于conversion from int to string yields a string of one rune, not a string of digits (did you mean fmt.Sprint(x)?)
的警告:因为
string()
以“Go”方式处理整数。因此,要正确地打印
rune
(就像大多数其他语言中的chr()
函数一样),应该先将int
强制转换为rune
,如下所示: