注意:我正在将这个问题编辑为一个具体示例,说明我为什么要这样做,这就是为什么某些答案在上下文中可能不再有意义的原因。我正在编写一些代码来传递来自输入的数据。数据采用标签的形式,这些标签具有它们包含的数据类型的标识符,然后是数据。不幸的是,我无法控制输入,并且事先不知道其中会有什么标签,一个可能是一个整数,另一个可能是一个字符串,还有一个可能是一个整数数组。当我需要像处理相同类型的所有标签时出现问题,例如,如果我有一片标签,一个接受或返回标签的函数。到目前为止,我所看到的解决方案是用一个空接口定义切片/函数,这将允许我这样做,但这有点不受欢迎,因为它不会告诉其他使用该包的人关于预期的类型并且也有点违背了首先使用类型化语言的观点。然而,接口似乎是这里的解决方案,我希望有一个Tag接口可以传递,这确实需要我在它们上面定义方法,但实际上它们不需要任何方法。我目前的解决方案是这样的type Tag interface{ implementTag()}type TagInt intfunc (tag TagInt) implementTag() {}type TagString stringfunc (tag TagInt) implementTag() {}虽然这确实有效并解决了我的问题,但必须为此定义虚拟方法感觉非常错误。所以我的问题总结如下:有没有什么方法可以定义某物是 a 而Tag不必定义虚拟方法?
3 回答
神不在的星期二
TA贡献1963条经验 获得超6个赞
在您的场景中,我会做的是接受参数中带有空接口的任何类型,然后在内部使用类型断言来确认它是您想要的类型。
if t1, ok := interfaceInput.(t1); !ok{
// handle it being the wrong type here
return
}
此外,如果您想要数据类型与其方法(即对象)之间的紧密耦合,那么将它作为对象的方法有什么问题呢?
UYOU
TA贡献1878条经验 获得超4个赞
您可以使用[]interface{}
for “任何类型的切片”,但是您可以使用类型断言和/或类型开关来发现该切片成员的实际运行时类型。
在Go 之旅中了解有关空接口的更多信息
现在想要制作一个可以同时容纳 t1 和 t2 但没有其他东西的切片。
这是一个非常不寻常的要求,您在 Go 中不太可能需要它。但是您也可以通过以下方式进行自己的受歧视联合:
type item struct {
typeSelector int
t1Value t1
t2Value t2
}
然后使用[]item,typeSelector在运行时检查以查看填充了哪个值。
或者,您甚至可以使用*t1and*t2和 havenil表示“此字段中没有值”。
- 3 回答
- 0 关注
- 133 浏览
添加回答
举报
0/150
提交
取消