Maison  >  Article  >  développement back-end  >  modèle de classe d'implémentation Golang

modèle de classe d'implémentation Golang

WBOY
WBOYoriginal
2023-05-15 09:05:07592parcourir

Golang est un langage de programmation rapide, efficace et fiable adapté à la création d'applications Web et de services réseau. Ses fonctionnalités riches et sa syntaxe simple ont rendu Golang extrêmement populaire ces dernières années. Dans Golang, l'implémentation de modèles de classe est une technique de programmation courante. Cet article explique comment utiliser Golang pour implémenter des modèles de classe.

1. Introduction
Dans Golang, il n'y a pas de mécanisme d'héritage de classe traditionnel. Mais il existe certaines techniques qui nous permettent d’obtenir des fonctionnalités similaires à la programmation orientée objet. Une de ces astuces consiste à implémenter des modèles de classe. Un modèle de classe est un type de modèle qui définit un type général pouvant être utilisé sur différents types concrets. Semblable aux classes génériques de Java ou aux classes modèles de C++. Les modèles de classe dans Golang peuvent être implémentés à l'aide d'interfaces.

2. Définition de l'interface
Dans Golang, une interface est un ensemble de méthodes. Tout type qui implémente toutes les méthodes d’une interface peut être appelé type d’implémentation de l’interface. Par exemple, ce qui suit définit un type d'interface qui contient une méthode déclarée comme Do() :

type Doer interface {
    Do() error
}

Cette interface représente quelque chose qui peut « faire ». L'opération "do" est implémentée par la méthode Do().

3. Méthode d'implémentation
Ce qui suit explique comment utiliser Golang pour implémenter des modèles de classe avec un cas spécifique. Nous implémenterons une interface Logger, et tout type qui implémente cette interface peut être utilisé pour générer des journaux.

Tout d'abord, nous définissons l'interface Logger et la structure LogEvent :

type Logger interface {
    Log(event LogEvent)
}

type LogEvent struct {
    Level     string
    Message   string
    Timestamp time.Time
}

Cette interface définit une méthode Log(), qui peut recevoir une structure LogEvent et la générer. Cette structure représente un événement de journal contenant des informations telles que le niveau, le message et l'horodatage.

Ensuite, nous implémentons l'interface Logger pour différents niveaux de journalisation :

type ConsoleLogger struct {
    Level string
}

func (l ConsoleLogger) Log(event LogEvent) {
    if event.Level == l.Level {
        fmt.Println(event.Timestamp, event.Level, event.Message)
    }
}

type FileLogger struct {
    Level string
    File  *os.File
}

func (l FileLogger) Log(event LogEvent) {
    if event.Level == l.Level {
        l.File.Write([]byte(fmt.Sprintf("%s %s %s 
", event.Timestamp, event.Level, event.Message)))
    }
}

Le code ci-dessus implémente deux types de journaux : ConsoleLogger et FileLogger.

ConsoleLogger signifie afficher le journal sur la console ; FileLogger signifie afficher le journal dans le fichier. Cependant, le code d’implémentation des deux types présente des similitudes. Par conséquent, nous pouvons extraire ces codes dans un modèle de classe pour réaliser la réutilisation du code.

4. Implémentation du modèle de classe
Nous allons définir un modèle de classe pour résumer les points communs de Logger La définition du modèle est la suivante :

type AbstractLogger struct {
    Level string
}

func (l AbstractLogger) Log(event LogEvent) {
    if event.Level == l.Level {
        l.Process(event)
    }
}

func (l AbstractLogger) Process(event LogEvent) {
    panic("Not implemented")
}
#🎜. 🎜#Il définit une structure Abstract Logger, qui contient les méthodes très courantes Log() et Process(). La méthode Log() est une méthode courante que tout le monde doit implémenter, tandis que la méthode Process() nécessite des sous-classes pour implémenter des méthodes spécifiques.

Nous pouvons hériter de AbstractLogger puis remplacer la méthode Process() pour implémenter une méthode de sortie de journal spécifique :

type ConsoleLogger struct {
    AbstractLogger
}

func (l ConsoleLogger) Process(event LogEvent) {
    fmt.Println(event.Timestamp, event.Level, event.Message)
}

type FileLogger struct {
    AbstractLogger
    File *os.File
}

func (l FileLogger) Process(event LogEvent) {
    l.File.Write([]byte(fmt.Sprintf("%s %s %s 
", event.Timestamp, event.Level, event.Message)))
}

Enfin, nous pouvons créer une instance Logger et utiliser du code pour afficher Log :

func main() {
    file, _ := os.Create("app.log")
    defer file.Close()

    logger := ConsoleLogger{AbstractLogger{"info"}}
    logger.Log(LogEvent{"debug", "debug message", time.Now()}) // 该条日志不会被输出
    logger.Log(LogEvent{"info", "info message", time.Now()})   // 输出: 当前时间 info info message

    logger = FileLogger{AbstractLogger{"info"}, file}
    logger.Log(LogEvent{"info", "info message", time.Now()}) // 输出到文件中
}

Dans le code ci-dessus, nous créons une instance ConsoleLogger pour la sortie du journal et une instance FileLogger pour la sortie du fichier journal. Un seul journal est affiché sur la console car LogLevel est défini sur info et le LogLevel du premier journal est debug, ce qui ne répond pas aux conditions de sortie. Le même journal est écrit dans le fichier et finalement affiché dans le fichier app.log.

5. Résumé

Bien que Golang ne dispose pas du mécanisme d'héritage de classe en Java ou C++, nous pouvons utiliser des interfaces pour obtenir un héritage similaire. L'implémentation de modèles de classe dans Golang est une technique très utile, qui peut nous aider à réutiliser le code commun et à améliorer la maintenabilité du code. L'exemple de code ci-dessus montre comment utiliser Golang pour implémenter des modèles de classe et fournir des solutions de réutilisation de code pour les classes de journaux.

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