Почему я не могу вызвать интерфейс с набором методов из основного пакета

0

Вопрос

Я действительно новичок в golang и пытаюсь понять, как на самом деле работает инкапсуляция в go.

У меня есть следующая структура

-- package a
    -a_core.go
    -a.go
    -models.go

-- main.go

В models.go у меня есть структуры для запросов и ответов на вызов api,

a.go имеет пустую структуру, которая является частной и общедоступным интерфейсом, который я хочу раскрыть с помощью различных методов

a_core.go просто имеет некоторую бизнес-логику, которая была бы вызвана в моей реализации интерфейса

Затем у меня есть main.go, где я просто вызываю общедоступный интерфейс.

код в a.go

package a

type myFunction struct{}

type MyFunc interface {
 Create(myData *MyData) (*MyData, error)
 Fetch(test string)
 Delete(test string)
}

//Concrete implementations that can be accessed publicly
func (a *myFunction) Create(data *MyData) (*MyData, error) {
  return nil, nil   
}

func (a *myFunction) Fetch(test string) {

}

func (a *myFunction) Delete(test string) {

}

В main.go я называю интерфейс своим первым созданием указателя MyData со значениями

data := &a.MyData{
 /////
}

result, err := a.MyFunc.Create(data)

При этом я получаю следующую ошибку,

слишком мало аргументов при вызове.myFunc.Create

невозможно использовать данные (переменную типа *a.MyData) в качестве значения.myFunc в аргументе для.myFunc.Create: отсутствует метод CreatecompilerInvalidIfaceAssign

Пожалуйста, что я делаю не так?

go interface struct visual-studio-code
2021-11-20 22:23:03
1

Лучший ответ

1

Вот пример
Обратите внимание, что имена в верхнем регистре являются общедоступными, в нижнем-частными (см. https://tour.golang.org/basics/3 )

./go-пример/main.go

package main

import "go-example/animal"

func main() {
    var a animal.Animal
    a = animal.Lion{Age: 10}
    a.Breathe()
    a.Walk()
}

./go-пример/животное/животное.go

package animal

import "fmt"

type Animal interface {
    Breathe()
    Walk()
}

type Lion struct {
    Age int
}

func (l Lion) Breathe() {
    fmt.Println("Lion breathes")
}

func (l Lion) Walk() {
    fmt.Println("Lion walk")
}
2021-11-20 23:23:09

Я пытаюсь сослаться на это из другого пакета. Следовательно, почему я должен сделать package.interfacename.methodname, и методы уже реализованы в пустой структуре myFunction
gbubemi smith

обновил свой ответ
Michael D.

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................