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!
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") }
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)) }
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 }
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
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
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)) }
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!