猿问

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

我有


type DocId int


func 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类型不匹配)”。


慕尼黑8549860
浏览 170回答 2
2回答

守着星空守着你

只有未类型化的常量可以自动转换为正确的类型。您可以找到一些示例,其中不需要为该类型的常量使用强制转换,例如此线程。从规格:如果一个操作数是未类型化的常量,而另一个操作数不是,则该常量将转换为另一种操作数的类型但是在这里,range将迭代值显式分配给相应的迭代变量(i int, T a[i]),使i和int。(来自规范“ For statement ”)对于其他所有情况,都需要显式强制转换。规范的“转换”部分没有提到“自动”类型转换(与自动接口转换相反,这种转换一直发生:)interface{}。该线程添加type A inttype B int...var a A = 5var b B = a    // Compiler ERROR!!!!!!本质上,由于(几乎)所有类型都是唯一的,因此即使没有相同的基本表示形式和基本操作的两种类型,也必须进行强制转换。[...]通过强制您明确告知编译器何时要进行转换,从而使语言具有类型安全性。
随时随地看视频慕课网APP

相关分类

Go
我要回答