使用全局范围初始化struct,其中type依赖于boolean
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用全局范围初始化struct,其中type依赖于boolean相关的知识,希望对你有一定的参考价值。
我最近开始使用Golang并偶然发现了一个问题:
我有两个结构,human
和alien
,它们都是基于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语句之前声明这两种类型但是这个解决方案对我来说似乎并不优雅。
我有什么明显的解决方案吗?
如您所述,此声明清楚地表明了问题:
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
会做的伎俩。
所以,我打算走出困境,说你可能正在以错误的方式思考这个问题。
我看到你的例子时遇到的第一个问题是:这个函数的返回类型是什么?换句话说,你需要什么签名h
?如果alien
有一个嵌入式结构creature
(它似乎是你试图遵循的继承模式),并且在声明human
为h
之后从函数返回creature
,那么消耗你的函数的任何东西都只会知道它正在处理与creature
,所以没有必要首先声明它是human
或alien
。
我怀疑你真正想要做的是远离混凝土结构,而不是使用接口。在那个世界中,你有一个creature
界面,human
和alien
都会满足creature
界面。你不一定知道你在下游处理哪一个,但是你能够可靠地调用creature
方法,并且可以调用适当的human
或alien
实现。
以上是关于使用全局范围初始化struct,其中type依赖于boolean的主要内容,如果未能解决你的问题,请参考以下文章
Golang 基础:Go Module, for range, 切片, map, struct 等使用和实现