Dlaczego nie mogę wywołać interfejs z zestawem metod z pakietu podstawowego

0

Pytanie

Jestem bardzo początkujący w golang i próbuję zrozumieć, jak właściwie działa hermetyzacja w go.

Mam następująca struktura

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

-- main.go

W models.go mam struktury dla żądań i odpowiedzi na wywołanie api,

a.go ma pustą strukturę, która jest prywatny i publiczny interfejs, który chcę otwierać za pomocą różnych metod

a_core.go po prostu ma jakąś logikę biznesową, która byłaby spowodowana w mojej implementacji interfejsu

Następnie mam main.go, gdzie tylko wzywam interfejsu publicznego.

kod w 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) {

}

W main.go nazywam interfejs swoim pierwszym stworzeniem wskaźnika MyData z wartościami

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

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

Przy tym dostaję następujący błąd,

zbyt mało argumentów w wywołaniu.nazwie myfunc.Create

nie można używać dane (zmienną typu *a.MyData) jako wartości.nazwie myfunc w argumencie dla.nazwie myfunc.Create: brak metody CreatecompilerInvalidIfaceAssign

Proszę, co robię nie tak?

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

Najlepsza odpowiedź

1

Oto przykład
Należy pamiętać, że nazwy litery są publicznie dostępne, w dolnym-prywatnych (zob. https://tour.golang.org/basics/3 )

./go-przykład/main.go

package main

import "go-example/animal"

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

./go-przykład/zwierzę/zwierzę.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

Staram się zacytować z innego pakietu. Zatem, dlaczego muszę zrobić package.interfacename.methodname i metody już realizowane w pustym strukturze myFunction
gbubemi smith

zaktualizował swoją odpowiedź
Michael D.

W innych językach

Ta strona jest w innych językach

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