De ce nu pot numi o interfață cu o colecție de metode de pachetul principal

0

Problema

Sunt foarte nou la golang și am încercat să văd cât de încapsulare într-adevăr funcționează, în du-te.

Am urmatoarea structura

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

-- main.go

În modele.du-te am structs pentru cerere și răspunsuri pentru un apel api,

o.du-te gol struct, care este privată și o interfață publică, ceea ce vreau să expun cu diverse metode

a_core.merge doar ca are ceva logica de afaceri care ar fi numit în interfața de implementare

Apoi, am main.du-te unde am sunat interfața publică.

cod într-un.du-te

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

}

În principal.du-te, chem interfață prima mea crea MyData pointer cu valori

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

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

I a lua următoarea eroare când fac asta,

prea puține argumente în apel la un.MyFunc.Crea

nu poate folosi datele (variabile de tip *un.MyData) ca.MyFunc valoare în argument pentru un.MyFunc.Crea: lipsă metoda CreatecompilerInvalidIfaceAssign

Te rog cu ce am gresit?

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

Cel mai bun răspuns

1

Aici este un exemplu
Rețineți că numele cu majuscule sunt publice, cu litere mici private (a se vedea https://tour.golang.org/basics/3 )

./du-te-exemplu/main.du-te

package main

import "go-example/animal"

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

./du-te-exemplu/animal/animale.du-te

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

Am încercat să fac referire la acest din alt pachet. Prin urmare, de ce eu trebuie să fac un pachet.interfacename.code și metodele sunt deja puse în aplicare pe gol struct myFunction
gbubemi smith

actualizat răspunsul meu
Michael D.

În alte limbi

Această pagină este în alte limbi

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