使用全局范围初始化struct,其中type依赖于boolean

问题描述 投票:1回答:2

我最近开始使用Golang并偶然发现了一个问题:

我有两个结构,humanalien,它们都是基于creature结构。我想根据if语句中isAlien boolean的值初始化其中一个。

使用human := human{}表示法或if块中的外来等价物进行初始化,不能从if语句外部访问实例。

另一方面,在if语句之前声明变量的类型和名称并在if语句中初始化变量的常用解决方案不起作用,因为有两种不同的类型:

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语句之前声明这两种类型但是这个解决方案对我来说似乎并不优雅。

我有什么明显的解决方案吗?

go struct types scope
2个回答
1
投票

如您所述,此声明清楚地表明了问题:

var h human //use human or alien here?

如果您计划在创建对象后使用该h变量,那么h的类型必须是可以接受humanalien作为值的类型。

在Go中这样做的方法是使用ìnterfacealien都可以实现的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

会做的伎俩。


0
投票

所以,我打算走出困境,说你可能正在以错误的方式思考这个问题。

我看到你的例子时遇到的第一个问题是:这个函数的返回类型是什么?换句话说,你需要什么签名h?如果alien有一个嵌入式结构creature(它似乎是你试图遵循的继承模式),并且在声明humanh之后从函数返回creature,那么消耗你的函数的任何东西都只会知道它正在处理与creature,所以没有必要首先声明它是humanalien

我怀疑你真正想要做的是远离混凝土结构,而不是使用接口。在那个世界中,你有一个creature界面,humanalien都会满足creature界面。你不一定知道你在下游处理哪一个,但是你能够可靠地调用creature方法,并且可以调用适当的humanalien实现。

© www.soinside.com 2019 - 2024. All rights reserved.