如何使struct字段成为泛型类型

问题描述 投票:0回答:1

我正在导入两个(以及更多的)外部库,这些库在功能上相互关联,但彼此不同。我希望能够做到以下几点:

  • 创建每个的新对象
  • 将每个分配给嵌套结构的字段
  • 能够使用嵌套结构的字段访问库方法

大概是这样的:

import (
    "github.com/bittrex_api_wrapper"
    "github.com/kraken_api_wrapper"
)

type Exchange struct {
    bittrex     *data
    kraken      *data
}

type data struct {
    cntr      int
    api       ????    
}

func Initialize() Exchange {
    e Exchange

    brex := bittrex_api_wrapper.New("APIKEY1", "SECRET1")
    krak := kraken_api_wrapper.New("APIKEY2", "SECRET2")

    brexData := data {
        cntr:    0,
        api:     brex,
    }
    krakData := data {
        cntr:    0,
        api:     krak,
    }
    e = Exchange {
        bittrex:    brexData,
        kraken:     krakData,
    }

    return e
}

func (e *Exchange) CheckBalance(exng string) float64 {
    switch exng {
        case "kraken":
            return e.kraken.api.Balance()
        case "bittrex":
            return e.bittrex.api.Balance()
    }
}

在我寻找答案时,似乎反射包或界面可能是我的解决方案(或两者的某种组合),但我不是开发人员而且是Go的新手,所以Reflect有点过头了。

任何帮助深表感谢!

generics go struct
1个回答
2
投票

使用界面:

type balancer interface {
  Balance() int64
}

type data struct {
    cntr      int
    api       balancer
}

请注意,与许多声称具有接口的其他OO语言不同,在Go中,此概念“向后”:您可以定义任何接口,然后使Go运行时确保您为该自定义接口的变量分配的值1 )满足该接口,2)允许直接调用其上的接口方法。也就是说,来自任何外部代码的任何数据结构都可能支持任意数量的接口,而不会意识到这一点。

你可以从this开始。

请注意,只有当您导入的两个“包装器”包以这样的方式定义它们各自的数据类型时,指示的方法才有效,即它们具有相同的Balance()函数,这意味着它们必须具有相同的返回类型(或者两者都没有)。

© www.soinside.com 2019 - 2024. All rights reserved.