我正在尝试使用 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()。
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报
0/150
提交
取消