为了账号安全,请及时绑定邮箱和手机立即绑定

如何在go中使用带有范围的自定义int类型?

如何在go中使用带有范围的自定义int类型?

Go
慕尼黑8549860 2021-05-05 22:38:42
我有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!!!!!!

本质上,由于(几乎)所有类型都是唯一的,因此即使没有相同的基本表示形式和基本操作的两种类型,也必须进行强制转换。[...]

通过强制您明确告知编译器何时要进行转换,从而使语言具有类型安全性。


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信