String 字符串(int)、字符串(int32)和字符串([]int32)都有效,但字符串([]int)无效-什么';这里的理由是什么?
(我正在使用Go 1.14.6。) 以下语句都将输出charString 字符串(int)、字符串(int32)和字符串([]int32)都有效,但字符串([]int)无效-什么';这里的理由是什么?,string,go,slice,rune,String,Go,Slice,Rune,(我正在使用Go 1.14.6。) 以下语句都将输出chara Println(string(int(97) ) ) Println(string(int32(97) ) ) Println(string([]int32{97} ) ) 但是 将导致编译错误 cannot convert []int literal (type []int) to type string 我对这种行为感到困惑。如果它处理的string(int)与string(int32)相同,为什么它处理string([]i
a
Println(string(int(97) ) )
Println(string(int32(97) ) )
Println(string([]int32{97} ) )
但是
将导致编译错误
cannot convert []int literal (type []int) to type string
我对这种行为感到困惑。如果它处理的
string(int)
与string(int32)
相同,为什么它处理string([]int)
与string([]int32)
不同?rune
表示unicode码点的是int32
的别名。因此有效地string([]int32{})
与string([]rune{})
相同,后者将一段符文(类似string
的字符)转换为string
。这是有用的
int
既不是int32
也不是rune
,因此将[]int
转换为string
不符合逻辑,不明确,因此语言规范不允许这样做
将整数转换为字符串
会产生一个带有单个符文的字符串值
与字符串类型的转换
“\uFFFD”
Go vet
已经对这种转换发出警告
字符串(x)的新警告
vet工具现在警告有关string(x)
格式的转换,其中x
的整数类型不是rune
或byte
。Go的经验表明,这种形式的许多转换错误地假定string(x)
的计算结果是整数x的字符串表示形式。它实际上计算为一个字符串,包含x
值的UTF-8编码。例如,string(9786)
不会计算为字符串“9786”
;其计算结果为字符串“\xe2\x98\xba”
,或”☺"代码>
正确使用string(x)
的代码可以重写为string(rune(x))
。或者,在某些情况下,使用合适的字节片buf
调用utf8.EncodeRune(buf,x)
可能是正确的解决方案。其他代码最有可能使用strconv.Itoa
或fmt.Sprint
使用go test
时,默认情况下启用此新的vet检查
我们正在考虑在Go的未来版本中禁止转换。也就是说,该语言将更改为仅允许字符串(x)当x
的类型为rune
或byte
时,对于整数x
。这样的语言更改不会向后兼容。我们使用此vet检查作为更改语言的第一个尝试步骤
“如果它处理字符串(int)的方式与处理字符串(int32)的方式相同”-不,它不会。go-vet
在string(int)
上打印一条警告,感谢您提到go-vet
,这对我来说是新的(新手:)。感谢您的详细解释。我发现必须通过语言规范有点令人沮丧。如果行为更明显,会更容易。:)并感谢认识go 1.15。我几周前刚安装了1.14.6。每种语言都有一些奇怪之处,特别是在类型转换方面。go i的好处是有一个明确的规范定义语言行为。我建议您熟悉它。默认情况下,go-build
或go-run
(如gcc-Wall
)是否可以启用go-vet
?@pynexj不确定go-build
和go-run
,但默认情况下go-test
自动运行vet
。
cannot convert []int literal (type []int) to type string