我最近开始使用Golang并偶然发现了一个问题:
我有两个结构human
和alien
,它们都基于creature
结构。我想根据if语句中isAlien
布尔值的值初始化其中一个。
使用human := human{}
表示法或if块中的外来等价物进行初始化,不能从if语句外部访问实例。
另一方面,在if语句之前声明变量的类型和名称以及在if语句中初始化变量的常用解决方案并不起作用,因为有两种不同的类型: / p>
var h human //use human or alien here?
if isAlien {
h = alien{} //Error: incompatible types
} else {
h = human{}
}
//same when swapping human with alien at the declaration
我知道我可以在if语句之前声明这两种类型,但这种解决方案对我来说似乎并不优雅。
我有什么明显的解决方案吗?
答案 0 :(得分:1)
正如您所指出的,这个陈述清楚地表明了问题:
var h human //use human or alien here?
如果您计划在创建对象后使用该h
变量,那么h
的类型必须是可以接受human
或alien
的价值。
在Go中执行此操作的方法是使用ìnterface
和alien
都可以实现的human
。
所以你应该声明一个类似的界面:
type subject interface {
// you should list all functions that you plan to use on "h" afterwards
// both "human" and "alien" must implement those functions
}
然后:
var h subject
会做的伎俩。
答案 1 :(得分:0)
所以,我要走出去,说你可能会错误地思考这个问题。
我看到你的例子时遇到的第一个问题是:这个函数的返回类型是什么?换句话说,您需要 h
的签名是什么?如果alien
具有嵌入式结构creature
(这似乎是您尝试遵循的继承模式),并且在声明{{1}后从函数返回human
成为h
,任何消耗你的功能的东西只会知道它正在处理creature
,所以没有必要将它声明为creature
或者首先是human
。
我怀疑你真正想做的就是离开这里的具体结构,而不是使用接口。在那个世界中,您拥有alien
界面,creature
和human
都会满足alien
界面。您不一定知道您在下游处理哪一个,但您能够可靠地调用creature
方法,并且相应的creature
或human
实施将是调用。