Überschreiben einer Funktion aus einem anderen Modul in Golang

王林
Freigeben: 2024-02-14 18:15:10
nach vorne
579 Leute haben es durchsucht

从 Golang 中的另一个模块覆盖函数

php-Editor Xigua ist hier, um Ihnen ein interessantes Thema vorzustellen: das Überschreiben von Funktionen aus einem anderen Modul in Golang. In Golang ist der modulare Aufbau ein gängiges Programmiermuster, das die Wartung und Erweiterung des Codes erleichtert. Das Überschreiben von Funktionen ist eine leistungsstarke Funktion, die es uns ermöglicht, Funktionen in einem Modul in einem anderen Modul zu überschreiben, um ein individuelles Verhalten zu erreichen. In diesem Artikel wird die Verwendung der Override-Funktion sowie ihre Vorteile und Überlegungen ausführlich erläutert. Lassen Sie uns gemeinsam dieses interessante Thema erkunden!

Frageninhalt

Wie überschreibe ich eine Funktion, die in einem anderen Modul in Golang erstellt wurde?

Modul a

In einem Modul habe ich die Funktion newpersonapiservice, der vollständige Code lautet wie folgt:

package openapi

import (
    "context"
    "errors"
    "net/http"
)

// personapiservice is a service that implements the logic for the personapiservicer
// this service should implement the business logic for every endpoint for the personapi api.
// include any external packages or services that will be required by this service.
type personapiservice struct {
}

// newpersonapiservice creates a default api service
func newpersonapiservice() personapiservicer {
    return &personapiservice{}
}

// showperson - detail
func (s *personapiservice) showperson(ctx context.context) (implresponse, error) {
    // todo - update showperson with the required logic for this service method.
    // add api_person_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation.

    //todo: uncomment the next line to return response response(200, person{}) or use other options such as http.ok ...
    //return response(200, person{}), nil

    //todo: uncomment the next line to return response response(0, error{}) or use other options such as http.ok ...
    //return response(0, error{}), nil

    return response(http.statusnotimplemented, nil), errors.new("showperson method not implemented")
}
Nach dem Login kopieren

Modul b

In einem separaten Modul möchte ich diesen neuen Personapiservice überschreiben.

Ich kann diese Funktion in anderen Modulen aufrufen, indem ich Folgendes tue:

package main

import (
    "log"
    "net/http"

    openapi "build/code/spec/src"
)

func main() {

    log.printf("server started")

    personapiservice := openapi.newpersonapiservice()
    personapicontroller := openapi.newpersonapicontroller(personapiservice)

    router := openapi.newrouter(personapicontroller)

    log.fatal(http.listenandserve(":8080", router))

}
Nach dem Login kopieren

Wenn ich jedoch versuche, die Funktion zu überschreiben, erhalte ich einen Kompilierungsfehler. Der Openapi-Typ kann nicht aufgelöst werden. Folgendes versuche ich zu tun:

package main

import (
    "context"
    "log"
    "net/http"

    openapi "build/code/spec/src"
)

func main() {

    log.printf("server started")

    personapiservice := openapi.newpersonapiservice()
    personapicontroller := openapi.newpersonapicontroller(personapiservice)

    router := openapi.newrouter(personapicontroller)

    log.fatal(http.listenandserve(":8080", router))

}

func (s openapi.personapiservice) showperson(ctx context.context) (openapi.implresponse, error) {

    return openapi.response(200, openapi.person{}), nil
}
Nach dem Login kopieren

Das Folgende ist ein Bild des Kompilierungsfehlers

Weitere Informationen: Ich glaube, dass Modul b korrekt auf Modul a verweist.

Der Inhalt der go.mod-Datei von Modul a lautet wie folgt:

module build/code/spec

go 1.13

require github.com/go-chi/chi/v5 v5.0.3
Nach dem Login kopieren

Der Inhalt der go.mod-Datei von Modul b lautet wie folgt:

module bakkt.com/boilerplate

go 1.19

replace build/code/spec => ./../build/generated/

require build/code/spec v0.0.0-00010101000000-000000000000

require github.com/go-chi/chi/v5 v5.0.3 // indirect
Nach dem Login kopieren

Workaround

Die Lösung besteht darin, die Showperson-Methode in einem anderen Modul zu implementieren. Sie müssen einen neuen Typ erstellen, der die Personapiservicer-Schnittstelle implementiert und eine eigene Implementierung der Showperson-Methode bereitstellen.

Das Ausführen dieses Codes in Modul b funktioniert und ermöglicht mir, die Antwort des in Modul a definierten API-Aufrufs zu ändern.

package main

import (
    "context"
    "log"
    "net/http"

    openapi "build/code/spec/src"
)

type MyPersonApiService struct{}

func NewMyPersonApiService() openapi.PersonApiServicer {
    return &MyPersonApiService{}
}

func (s *MyPersonApiService) ShowPerson(ctx context.Context) (openapi.ImplResponse, error) {
    // TODO: Add your own implementation of the ShowPerson method here.

    // For example, you could retrieve a person's details and return them as follows:
    person := openapi.Person{Id: 23, Name: "Vark Thins", Age: 20}
    return openapi.Response(http.StatusOK, person), nil
}

func main() {

    log.Printf("Server started")

    PersonApiService := NewMyPersonApiService()
    PersonApiController := openapi.NewPersonApiController(PersonApiService)

    router := openapi.NewRouter(PersonApiController)

    log.Fatal(http.ListenAndServe(":8080", router))

}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonÜberschreiben einer Funktion aus einem anderen Modul in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage