为了账号安全,请及时绑定邮箱和手机立即绑定

使用不同级别的接口

使用不同级别的接口

Go
慕雪6442864 2022-05-23 15:00:41
我正在尝试使用 Go 中的接口来组织我的代码。我有 2 个数据源:FTP 和 API。在每个来源中,我都有几个结构,这些结构使逻辑因情况而异。在这个问题中,我将省略 API 并坚持使用 FTP。我的问题来自于无法说:FTPAcq 也是 Acquisition如果FetchMeters(),当我这样做时,ftp.Decrypt(nil)我希望 ftp 与FTPAcq这是我的代码:package mainimport (    "github.com/dutchcoders/goftp"    log "github.com/sirupsen/logrus"    "os")type Acquisition interface {    FetchMeters() ([]Meter, error)    Name() string}type FTPAcq interface {    Unzip(file string) string    Decrypt(file string) string}//type APIAcq interface {//  FetchMeter(meterID string) (Meter, error)//}func main() {    var acqs []Acquisition    ftp, err := NewFTPDriver(os.Getenv("FTP_USER"), os.Getenv("FTP_PASSWD"), os.Getenv("FTP_ADDR"), os.Getenv("FTP_PORT"))    if err != nil {        panic(err)    }    ftp1 := NewFTPDriverSGE(*ftp)    ftp2 := NewFTPDriverTA(*ftp)    acqs = append(acqs, ftp1, ftp2)    for _, acq := range acqs {        tmpMeters, err := acq.FetchMeters()        if err != nil {            log.Warn(acq.Name(), " got error :", err)        }        log.Info(tmpMeters)    }}type Meter struct {    ID          string    OperationID string    Unit        string}//FtpSGE is a implementation of acquisition Interface (see driver.go)type FTP struct {    Username string    Password string    Url      string    Port     string    client   *goftp.FTP}type FTPSGE struct {    FTP}type FTPTA struct {    FTP}func (f FTPSGE) Unzip(path string) []string {    return nil}func (f FTPTA) Unzip(path string) []string {    return nil}func (f FTPSGE) Decrypt(path string) []string {    return nil}func (f FTPTA) Decrypt(path string) []string {    return nil}func (ftp FTP) FetchMeters() ([]Meter, error) {    log.Info(ftp.Name(), " is running")    files := ftp.Download(nil)    files = ftp.Decrypt("") // I have several implementation of Decrypt    files = ftp.Unzip("")   // I have several implementation of Unzip    log.Info(files)    return nil, nil}就我而言,我得到:ftp.Decrypt undefined (type FTP has no field or method Decrypt)我应该怎么做?
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

FTP不执行。_ FTPAcq它只实现Acquisition. 它甚至没有Decrypt()作为方法,接口与否。


FTPSGE并FTPTA实现FTPAcq,但它们与.的类型不同FTP。


我不知道您要完成什么,但也许可以尝试嵌入 and FTP。这为这两种类型提供了嵌入类型的字段和方法,并且仍然允许您在这些类型上定义其他方法(在您的情况下为方法)。FTPSGEFTPTAFTPAcq


例如


type FTPSGE {

    FTP

}

// OR

type FTPSGE {

    *FTP

}

然后您将其创建为:x := FTPSGE{ftp1}. 请记住,这将创建inside的副本。如果是类型(不是指针),则复制整个结构。如果是类型(一个指针,这似乎是您正在使用的),则指针被复制并仍然指向与.ftp1xftp1FTPftp1*FTPx.FTPftp1


这意味着FTPSGE将同时实现Acquisition和FTPAcq。


您必须小心是否在值或指针上实现了接口:func (a A) Something()vs func (a *A) Somthing()。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信