我有type DocId intfunc foo(documents []String) { for i := range documents { id := DocId(i) ... }}如何摆脱显式转换行?DocIds的意思是类型索引单个文档。我想要的更像是:func foo(documents []String) { for id := range documents { ... // id gets used as the DocId that it damn well *IS* }}当我尝试将范围中的id用作DocId时,即使DocId是一个int,这也给我“无效的操作:...(int和DocId类型不匹配)”。
2 回答
守着星空守着你
TA贡献1799条经验 获得超8个赞
只有未类型化的常量可以自动转换为正确的类型。
您可以找到一些示例,其中不需要为该类型的常量使用强制转换,例如此线程。从规格:
如果一个操作数是未类型化的常量,而另一个操作数不是,则该常量将转换为另一种操作数的类型
但是在这里,range将迭代值显式分配给相应的迭代变量(i int, T a[i]),使i和int。(来自规范“ For statement ”)
对于其他所有情况,都需要显式强制转换。规范
的“转换”部分没有提到“自动”类型转换(与自动接口转换相反,这种转换一直发生:)interface{}。
该线程添加
type A int
type B int
...
var a A = 5
var b B = a // Compiler ERROR!!!!!!
本质上,由于(几乎)所有类型都是唯一的,因此即使没有相同的基本表示形式和基本操作的两种类型,也必须进行强制转换。[...]
通过强制您明确告知编译器何时要进行转换,从而使语言具有类型安全性。
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消