来自不同文件的golang接口使用方法

时间:2018-10-03 07:10:29

标签: go struct interface

我已经method想要提供一些界面以使其更易于测试

这是功能

文件A

func readFile(s source) ([]byte, error) {
        p := fs.GetPath()
        file, err := ioutil.ReadFile(p + "/" + s.path + "/" + "rts.yaml")
        if err != nil {
            return yamlFile, fmt.Errorf("erro reading file : %s", err.Error())
        }
        return file, err
    }

现在我为其添加struct

type source struct{
    path string
}

readFileimplementing的界面

type fileReader interface {
    readFile(path string) ([]byte, error)
}

现在我需要从另一个文件调用此函数,但是我在执行此操作时出错

文件B

type source struct {
    path string
}


a := source{}

yamlFile, err := readFile(a)

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

将包含source结构的包导入File A中,然后在将变量传递给readFile函数之后,使用该结构初始化变量。

文件B

import A
a := A.Source{}

因为文件A中的source结构与文件B中的source结构不同。文件A的source结构正在实现接口,因此您需要导入源结构并然后将其传递给函数。

请注意,要使任何结构或函数可导出,都应以大写字母开头结构或功能名称。

文件A

// make struct exportable
type Source struct{
    path string
}

实现了与

不同的界面

文件B

type source struct{
    path string
}

未实现该接口。

已编辑

文件A

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

type Source struct {
    Path string
}

type fileReader interface {
    readOneFile() ([]byte, error)
}

func(s Source) readOneFile() ([]byte, error) {
    cwd, err := os.Getwd()
    file, err := ioutil.ReadFile(fmt.Sprintf("%s/file.txt", cwd))
    if err != nil {
        return nil, fmt.Errorf("erro reading file : %s", err.Error())
    }
    return file, err
}

文件B

package main

import (
    "fmt"
)

func main() {
    s := Source{}
    data, err := s.readOneFile()
    if err != nil {
        fmt.Errorf("Error in reading the file")
    }
    fmt.Println(string(data))
}