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

Remplacer une fonction d'un autre module dans Golang

王林
Libérer: 2024-02-14 18:15:10
avant
628 Les gens l'ont consulté

从 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")
}
Copier après la connexion

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

}
Copier après la connexion

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
}
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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

}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal