-2

假设我有以下接口和两个实现它的结构:

type Tmp interface {
    MyTmp() string
}

type MyStructA struct {
    ArrayOfItems   []int
}

func (a MyStructA) MyTmp() string {
    return "Hello World"
}

type MyStructB struct {
    ArrayOfItems   []int
}

func (a MyStructB) MyTmp() string {
    return "Hello World B"
}

正如您注意到的那样,两者都MyStructA实现MyStructBTmp,并且两者都有一个名为 ArrayOfItems 的属性。使用接口签名,我如何迭代两者都具有的属性?类似于:

func (c ADifferentStruct) iterate(myTmp Tmp) {

   for _, number := range myTmp.ArrayOfItems {
      fmt.Println(number)
   }
}

注意:我不想在接口中添加另一个方法(即 getter/setter)来处理或定义ArrayOfItems

这可能吗?

4

1 回答 1

0

您需要一种方法来返回这些项目...

看到这个: https: //play.golang.org/p/rnH0riWKqRY


package main

import "fmt"

type Tmp interface {
    MyTmp() string
    Items() []int
}

type MyStructA struct {
    ArrayOfItems []int
}

func (a MyStructA) MyTmp() string {
    return "Hello World"
}

func (a MyStructA) Items() []int {
    return a.ArrayOfItems
}

type MyStructB struct {
    ArrayOfItems []int
}

func (a MyStructB) MyTmp() string {
    return "Hello World B"
}

func (a MyStructB) Items() []int {
    return a.ArrayOfItems
}

func iterate(tmp Tmp) {
    for _, val := range tmp.Items() {
        fmt.Println(val)
    }
}

func main() {
    a := MyStructA{[]int{1, 2, 3}}
    b := MyStructA{[]int{-1, -2, -3}}
    iterate(a)
    iterate(b)

}


于 2020-08-12T14:38:25.223 回答