【问题标题】:Initialize struct with global scope where type depends on boolean使用全局范围初始化结构,其中类型取决于布尔值
【发布时间】:2018-11-05 20:35:20
【问题描述】:

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

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

使用 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


    【解决方案1】:

    正如你所指出的,这个问题清楚地表达了这个问题:

    var h human //use human or alien here?
    

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

    在 Go 中执行此操作的方法是使用 ìnterfacealienhuman 都可以实现。

    所以你应该声明一个像这样的接口:

    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
    

    会成功的。

    【讨论】:

    • 好的,非常感谢。我想我只需要了解更多关于接口和结构的知识......
    • @phmrz 这是一个带有一些类型断言和类型切换的示例。诚然,type CreatureType 在这里有点多余,但可以(并且应该)用在不需要具体类型但只需要知道它是什么的地方。 play.golang.org/p/xhKU8GYX2SX
    【解决方案2】:

    所以,我要冒昧地说你可能想错了。

    看到你的例子,我想到的第一个问题是:这个函数的返回类型是什么?换句话说,您需要 h 是什么签名?如果alien 有一个嵌入式结构creature(这似乎是您要遵循的继承模式),并且在将h 声明为creature 之后,您从函数中返回human,任何东西使用你的函数只会知道它正在处理creature,因此首先将其声明为humanalien 是没有意义的。

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

    【讨论】:

    • @phmrz 如果答案很好,请随意给我投赞成票:D
    • 哈哈悲剧。那好吧!狩猎愉快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2015-07-30
    • 2016-11-25
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多