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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用全局范围初始化struct,其中type依赖于boolean相关的知识,希望对你有一定的参考价值。

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

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

答案

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

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

会做的伎俩。

另一答案

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

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

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

以上是关于使用全局范围初始化struct,其中type依赖于boolean的主要内容,如果未能解决你的问题,请参考以下文章

依赖于 JSON 数据的结构

Win32 中的全局(进程范围)属性

java中的作用域有哪些?

Golang 基础:Go Module, for range, 切片, map, struct 等使用和实现

Golang 基础:Go Module, for range, 切片, map, struct 等使用和实现

Golang 入门总结:Go Module, for range, 切片, map, struct 等使用和实现