我有一个带有接口的函数,如下所示:
func method(data interface{})
..因为我需要处理具有共同字段/方法的不同结构。在此功能中,我在不同的地方使用data
数十次或数百次。一直添加switch a.(type) { case .. case ..
真的很不愉快。
有没有一种方法可以创建一个仅带有所需类型的switch
变量,然后在以后随处使用此变量?像这样:
var a .... // something here
switch data.(type) {
case *Struct1:
a = data.(*Struct1)
case *Struct2:
a = data.(*Struct2)
}
// Continue with 'a' only
a.Param = 15
fmt.Println(a.String())
答案 0 :(得分:4)
Go是一种静态类型的语言,a
的类型必须在编译时就知道。而且由于Go还不支持泛型,因此您无法做自己想做的事。
尝试提出其他解决方案,例如将a
要做的事情抽象到一个接口中,并让具体类型实现该接口。然后a
可以是此接口类型的变量,您可以调用它的方法。
如果可以实现,实际上甚至可以将data
类型的参数更改为此接口,并且不需要类型声明或类型切换。
或者,您可以使用反射来访问由其名称标识的公共字段(用于get或set),但是反射不提供编译时保证,并且通常效率较低。有关如何执行此操作的示例,请参见以下问题:Assert interface to its type
答案 1 :(得分:2)
您不能直接执行问题,go是静态类型的,因此您无法拥有一个可以容纳不同类型的变量,并且仍然像键入一样访问该变量。
如果仅在方法中的公共结构字段上工作,则最好将所有公共变量收集在其自己的结构中,如下面的commons
结构所示,并让您的{{1} }将该类型作为参数
method
答案 2 :(得分:0)
我无法弄清楚您的真正目标是什么,但是如果您要编写的“方法”能够处理相似结构中的公共字段,并且您无法使用 Type Embedding 修复原始结构,例如@上面没有说明,那么您可以尝试为方法内部使用建立另一个结构:
let input = String::from("12.0");
{
// This one is borrowed (same as Cow::Borrowed(&input))
let text = Cow::from(&input);
}
// This one is owned (same as Cow::Owned(input))
let text = Cow::from(input);
// Most of the usual String/&str trait implementations are also there for Cow
let num: f64 = text.parse().unwrap();
我认为这不是一个好方法,但有时...:-)