Generics 如何使结构字段成为泛型类型

Generics 如何使结构字段成为泛型类型,generics,go,struct,Generics,Go,Struct,我正在导入两个(以及更多)在功能上相关但彼此不同的外部库。我希望能够做到以下几点: 创建每个对象的新对象 将每个字段指定给嵌套结构的一个字段 能够使用嵌套结构的字段访问库方法 大致如下: import ( "github.com/bittrex_api_wrapper" "github.com/kraken_api_wrapper" ) type Exchange struct { bittrex *data kraken *data }

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

  • 创建每个对象的新对象
  • 将每个字段指定给嵌套结构的一个字段
  • 能够使用嵌套结构的字段访问库方法
大致如下:

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()
    }
}
在我寻找答案的过程中,似乎reflect包或接口可能是我的解决方案(或两者的某种组合),但我不是一名开发人员,也不是新手,所以reflect有点让我不知所措

非常感谢您的帮助

使用界面:

type balancer interface {
  Balance() int64
}

type data struct {
    cntr      int
    api       balancer
}
请注意,与许多其他声称拥有接口的OO语言不同, 在Go中,这个概念是“向后的”:您可以定义任何接口,然后 确保Go运行时确保分配给该自定义接口的变量的值1)满足该接口,2)允许直接调用该接口上的接口方法。 也就是说,来自任何外部代码的任何数据结构都可以 可能支持任意数量的接口,但不知道这一点

你可以从一开始

请注意,指定的方法仅在两个“包装器”包都存在时有效 您可以定义它们各自的数据类型,以使它们 相同的
Balance()
函数,这意味着它们必须具有相同的返回类型(或两者都没有)。

使用界面:

type balancer interface {
  Balance() int64
}

type data struct {
    cntr      int
    api       balancer
}
请注意,与许多其他声称拥有接口的OO语言不同, 在Go中,这个概念是“向后的”:您可以定义任何接口,然后 确保Go运行时确保分配给该自定义接口的变量的值1)满足该接口,2)允许直接调用该接口上的接口方法。 也就是说,来自任何外部代码的任何数据结构都可以 可能支持任意数量的接口,但不知道这一点

你可以从一开始

请注意,指定的方法仅在两个“包装器”包都存在时有效 您可以定义它们各自的数据类型,以使它们
相同的
Balance()
函数,这意味着它们必须具有相同的返回类型(或者两者都没有)。

很难从发布的源代码中确切地看出您希望如何工作-是否需要在每个
Exchange
对象上都提供这两个API?但是,我可以说,我98%确定您不需要对此进行反射。很难从发布的源代码中确切地看出您希望它如何工作-是否需要在每个
Exchange
对象上都提供这两个API?然而,我可以说,我98%确信你不需要对此进行反思。