Maison >développement back-end >Golang >Remplacer une fonction d'un autre module dans Golang

Remplacer une fonction d'un autre module dans Golang

王林
王林avant
2024-02-14 18:15:10610parcourir

从 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 !

Contenu de la question

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

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer