Maison >développement back-end >Golang >Remplacer une fonction d'un autre module dans Golang
l'éditeur php Xigua est là pour vous présenter un sujet intéressant : le remplacement des fonctions d'un autre module dans Golang. Dans Golang, la conception modulaire est un modèle de programmation courant, ce qui facilite la maintenance et l'extension du code. Le remplacement des fonctions est une fonctionnalité puissante qui nous permet de remplacer les fonctions d'un module dans un autre module pour obtenir un comportement personnalisé. Cet article explique en détail comment utiliser la fonction de remplacement, ainsi que ses avantages et considérations. Explorons ensemble ce sujet intéressant !
Comment remplacer une fonction créée dans un autre module dans golang ?
module a
Dans un module, j'ai la fonction newpersonapiservice, le code complet est le suivant :
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") }
module b
Dans un module séparé, je souhaite remplacer ce nouveau service personapi.
Je peux appeler cette fonction dans d'autres modules en faisant :
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)) }
Cependant, si j'essaie de remplacer la fonction, j'obtiens une erreur de compilation, le type d'openapi ne peut pas être résolu, voici ce que j'essaie de faire :
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 }
Ce qui suit est une image de l'erreur de compilation
Autres informations : Je crois que le module b fait correctement référence au module a.
Le contenu du fichier go.mod du module a est le suivant :
module build/code/spec go 1.13 require github.com/go-chi/chi/v5 v5.0.3
Le contenu du fichier go.mod du module b est le suivant :
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
La solution consiste à implémenter la méthode showperson dans un autre module, vous devez créer un nouveau type qui implémente l'interface personapiservicer et fournir sa propre implémentation de la méthode showperson.
Exécuter ce code dans le module b fonctionne et me permet de changer la réponse de l'appel api défini dans le module a.
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)) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!