登录
首页 >  Golang >  Go问答

有没有办法在 Go 中返回实现结构而不是接口?

来源:stackoverflow

时间:2024-03-17 11:36:29 109浏览 收藏

在 Go 中扩展系统时,有时需要返回实现结构而不是接口。但是,Go 中存在一个错误,指出无法返回 []card 类型的切片,而只能返回 []cardinterface。本文将提供一种解决方法,通过重新切片并类型断言,可以返回实现结构的切片,从而实现 OOP 结构的扩展能力。

问题内容

我想构建一个可以针对系统的不同应用进行扩展的系统。

在域包中,我有一个接口如下:

package main

type cardinterface interface {
 getname()string
}

type deckinterface interface {
 getcards()[]cardinterface
}

在应用程序包中我有以下实现:

package implementation
//Implementing CardInterface
type Card struct {
  Name string
}

func (c Card) GetName() string {
  return c.Name
}


type Deck struct {
  Cards []Card
}


func (d Deck) GetCards() []CardInterface {
  return d.Cards[]
}

但它给出了一个错误,指出 can not return an instance of []card 而不是 []cardinterface

有没有办法在 go 中实现这种 oop 结构?如果不是我怎样才能实现这种扩展能力?


解决方案


如果您想保留 deck 类型定义(如果没有,请查看 Shadowchaser's answer),您可以尝试如下操作:

func (d deck) getcards() []cardinterface {
  var res []cardinterface
  for _ , card := range d.cards {
    res = append(res, card)
  }
  return res
}

您需要重新切片 deck,因为虽然 cardcardinterface,但 []card 不是 []cardinterface

您需要像这样更改您的 deck:

>
type deck struct {
    cards []cardinterface
}

这里您也不需要 []

func (d Deck) GetCards() []CardInterface {
    return d.Cards
}

您当然需要类型断言来访问 cards 数组中的 card,下面是它如何工作的示例 https://play.golang.org/p/PPofF2u-H3S

以上就是《有没有办法在 Go 中返回实现结构而不是接口?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>