【问题标题】:Can I declare the list of interfaces inline within the slice?我可以在切片内声明接口列表吗?
【发布时间】:2018-06-26 19:14:16
【问题描述】:
package main

import (
    "fmt"
)

func main() {
    var a A
    var b B

    for _, v := range []WhatAreYou{a, b} {
        fmt.Println(v.Question())
    }
}

type WhatAreYou interface {
    Question() string
}

type A struct {
    string
}

type B struct {
    int
}

func (a A) Question() string {
    return "I'm an A"
}

func (b B) Question() string {
    return "I'm a B"
}

上面的代码按预期工作,并按预期调用每个接口上的函数。 Go Play

在我的实际代码中,我打算让许多不同的类型实现一个接口。我怎样才能摆脱 var a A var b B 等并简单地在切片中声明它们?即我尝试了以下和其他变体但失败了

for _, v := range []WhatAreYou{a A, b B} {

【问题讨论】:

  • 谢谢。现在我已经被展示出来了,这似乎很明显。感谢您提供的链接正是我试图谷歌但没有想到短语复合文字
  • 为什么这些不赞成 - 我看到一个带有工作代码示例的简洁问题。只是做一个初学者级别的问题并不违反规则,对吧?
  • @shful:我也想知道,但我得到了答案,我要学习 golang,所以我顺其自然。想知道我可以做些什么来改进,但我不会因为几票反对而失眠。

标签: go range slice


【解决方案1】:

[]WhatAreYou{A{}, B{}}

这是正确的,感谢 mkopriva。 Composite Literals

现在我对我在这里所做的事情有了更好的理解,我想我明白为什么这个问题也被否决了。这个问题真的没有意义。我对界面的想法非常着迷,我没有想到其他任何东西。 var a A 正在声明一个恰好实现接口的结构。如果您初始化结构,这将更加明显,例如var a = A{"hello"} 或内联 A{"hello"}, B{2}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2011-12-10
    • 1970-01-01
    • 2019-01-29
    • 2013-11-22
    • 2015-08-24
    • 2019-03-09
    • 2021-04-23
    相关资源
    最近更新 更多