使用不同级别的接口

我正在尝试使用 Go 中的接口来组织我的代码。


我有 2 个数据源:FTP 和 API。在每个来源中,我都有几个结构,这些结构使逻辑因情况而异。


在这个问题中,我将省略 API 并坚持使用 FTP。


我的问题来自于无法说:FTPAcq 也是 Acquisition


如果FetchMeters(),当我这样做时,ftp.Decrypt(nil)我希望 ftp 与FTPAcq


这是我的代码:


package main


import (

    "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)

我应该怎么做?


慕雪6442864
浏览 85回答 1
1回答

肥皂起泡泡

FTP不执行。_ FTPAcq它只实现Acquisition. 它甚至没有Decrypt()作为方法,接口与否。FTPSGE并FTPTA实现FTPAcq,但它们与.的类型不同FTP。我不知道您要完成什么,但也许可以尝试嵌入 and FTP。这为这两种类型提供了嵌入类型的字段和方法,并且仍然允许您在这些类型上定义其他方法(在您的情况下为方法)。FTPSGEFTPTAFTPAcq例如type FTPSGE {    FTP}// ORtype FTPSGE {    *FTP}然后您将其创建为:x := FTPSGE{ftp1}. 请记住,这将创建inside的副本。如果是类型(不是指针),则复制整个结构。如果是类型(一个指针,这似乎是您正在使用的),则指针被复制并仍然指向与.ftp1xftp1FTPftp1*FTPx.FTPftp1这意味着FTPSGE将同时实现Acquisition和FTPAcq。您必须小心是否在值或指针上实现了接口:func (a A) Something()vs func (a *A) Somthing()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go