используя метод интерфейса в Голанге из другого файла - PullRequest
0 голосов
/ 03 октября 2018

У меня 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
    }

Теперь я добавляю для него структуру

type source struct{
    path string
}

И интерфейс, который readFile равен implementing

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

И теперь мне нужно вызвать эту функциюиз другого файла, но я получаю ошибку при этом

Файл B

type source struct {
    path string
}


a := source{}

yamlFile, err := readFile(a)

что мне здесь не хватает?

1 Ответ

0 голосов
/ 03 октября 2018

Импортируйте пакет, содержащий структуру source в File A, а затем используйте эту структуру для инициализации переменной, после чего передайте переменную в функцию readFile.

Файл B

import A
a := A.Source{}

Поскольку структура source в файле A отличается от структуры source в файле B. И source структура файла A реализует интерфейс, поэтому вам необходимо импортировать исходную структуруи затем передайте его в функцию.

Следует заметить, что для экспорта любой структуры или функции вы должны начинать имя структуры или функции с заглавной буквы.

Файл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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...