Maison développement back-end Golang Comment emballer des packages dans Golang

Comment emballer des packages dans Golang

May 14, 2023 pm 08:00 PM

Golang est un langage de développement populaire, efficace, concis et facile à apprendre. De plus en plus de développeurs commencent à utiliser Golang pour créer des applications. Dans Golang, le package est un concept important qui offre aux développeurs un moyen d'organiser et de gérer le code. Dans cet article, nous verrons comment encapsuler et organiser les packages Golang pour une meilleure gestion du code et une meilleure maintenabilité des applications.

Comprendre les packages Golang

Dans Golang, chaque fichier source appartient à un package. Chaque package a un nom unique et le nom doit être le même que le nom du répertoire. Vous pouvez définir des variables, des fonctions, des structures, des interfaces, etc. dans des packages. Les packages sont un moyen d'encapsuler et de réutiliser du code dans des unités logiques pouvant être réutilisées dans différentes applications.

Comment encapsuler un package

L'encapsulation est le processus de confinement du code dans une unité indépendante afin qu'un autre code ne puisse pas accéder directement aux données ou aux fonctions de cette unité. Dans Golang, certaines techniques peuvent être utilisées pour encapsuler des packages afin de les rendre plus faciles à utiliser et à maintenir.

  1. Déclarer les données comme privées

Dans Golang, vous pouvez utiliser des lettres majuscules pour spécifier des données publiques accessibles depuis l'extérieur du package. De même, vous pouvez utiliser des lettres minuscules pour spécifier des données privées, accessibles uniquement dans le package. Par conséquent, vous pouvez déclarer les données comme privées, limitant ainsi l'accès aux données et exposant uniquement l'interface publique.

Par exemple, supposons qu'il existe une structure appelée « personne », qui a deux attributs : le nom et l'âge. Nous pouvons définir la structure comme suit :

type Person struct {
    name string
    age int
}
Copier après la connexion

Dans cet exemple, les propriétés name et age sont déclarées comme propriétés privées, elles ne sont donc accessibles qu'à l'intérieur de la structure. . Si vous souhaitez créer une interface publique pour définir ou obtenir ces valeurs, vous pouvez ajouter des méthodes comme celle-ci : nameage属性都被声明为私有属性,因此它们只能在结构体内部访问。 如果要创建公共接口以设置或获取这些值,可以添加如下的方法:

func (p *Person) SetName(name string) {
    p.name = name
}

func (p *Person) GetName() string {
    return p.name
}

func (p *Person) SetAge(age int) {
    p.age = age
}

func (p *Person) GetAge() int {
    return p.age
}
Copier après la connexion

这些方法允许外部使用代码设置或获取值,同时限制了对私有属性的直接访问。

  1. 使用接口来隐藏实现细节

接口提供了另一种封装代码的技术。 它定义了一组方法,这些方法应该由实现该接口的任何类型实现。 这使得可以为不同的类型提供相同的接口,并且可以通过接口调用这些类型的方法,而无需了解实现细节。

例如,我们可以定义一个名为“Logger”的接口,该接口有两个方法:一个用于记录日志消息,另一个用于记录日志错误。 这个接口定义如下:

type Logger interface {
    Log(msg string)
    LogError(err error)
}
Copier après la connexion

现在,我们可以编写一个名为“FileLogger”的结构体,该结构体实现了“Logger”接口中的方法,

type FileLogger struct {
    filename string
    file *os.File
}

func (l *FileLogger) Log(msg string) {
    // write to log file
}

func (l *FileLogger) LogError(err error) {
    // write error to log file
}
Copier après la connexion

虽然“FileLogger”结构可能具有各种私有属性和方法,但对外部代码来说,这些都是不可见的。 外部代码只能看到“Logger”接口,并且可以将“FileLogger”实例分配给该接口。 这种方式可以隐藏实现细节,并使接口更容易使用和维护。

  1. 使用单例模式限制实例化

单例模式是一种创建单个实例的模式,使得只有一个实例可以对外部代码可见。 这可以用于创建只需要一个实例的应用程序组件(例如日志记录器或全局配置对象)。

在Golang中,可以使用包级变量来实现单例。 您可以在包内声明一个变量,然后在包启动时将其初始化,并在包外部访问它。 但是,由于包级变量在全局范围内可见,它们可能被意外修改,从而破坏单例的保证。

因此,在Golang中,可以使用init函数来进行初始化操作,并使用私有变量来保存实例。 这将强制使用公共接口访问单例,并且可以防止意外修改实例。 例如,以下是一个简单的示例“logger”包,使用单例模式和封装来创建日志记录器:

package logger

type ILogger interface {
    Log(msg string)
    LogError(err error)
}

type logger struct{
    // private fields
}

var instance *logger

func init() {
    instance = &logger{ /* init private fields */ }
}

func GetInstance() ILogger {
    return instance
}

func (l *logger) Log(msg string) {
    // log message implementation
}

func (l *logger) LogError(err error) {
    // log error implementation
}
Copier après la connexion

在这个包中,我们首先定义了一个私有日志记录器。 然后,在init函数中,我们初始化该实例并赋值给instancerrreee

Ces méthodes permettent une utilisation externe du code pour définir ou obtenir la valeur, tout en restreignant l'accès direct aux propriétés privées.

    Utilisez des interfaces pour masquer les détails d'implémentation

    🎜Les interfaces fournissent une autre technique pour encapsuler le code. Il définit un ensemble de méthodes qui doivent être implémentées par tout type implémentant l'interface. Cela permet de fournir la même interface pour différents types, et les méthodes de ces types peuvent être appelées via l'interface sans connaître les détails d'implémentation. 🎜🎜Par exemple, nous pouvons définir une interface appelée "Logger" qui comporte deux méthodes : une pour enregistrer les messages et une autre pour enregistrer les erreurs. Cette interface est définie comme suit : 🎜rrreee🎜Maintenant, nous pouvons écrire une structure appelée "FileLogger" qui implémente les méthodes de l'interface "Logger", 🎜rrreee🎜Bien que la structure "FileLogger" puisse avoir diverses propriétés et méthodes privées, mais ceux-ci sont invisibles pour le code externe. Le code externe ne voit que l'interface "Logger" et peut lui attribuer des instances "FileLogger". Cette approche masque les détails d'implémentation et rend l'interface plus facile à utiliser et à maintenir. 🎜
      🎜Utilisez le modèle singleton pour limiter l'instanciation🎜🎜🎜Le modèle singleton est un modèle qui crée une seule instance afin qu'une seule instance soit visible par le code externe. Cela peut être utilisé pour créer des composants d'application qui ne nécessitent qu'une seule instance (comme un enregistreur ou un objet de configuration globale). 🎜🎜Dans Golang, vous pouvez utiliser des variables au niveau du package pour implémenter des singletons. Vous pouvez déclarer une variable à l’intérieur d’un package, puis l’initialiser au démarrage du package et y accéder en dehors du package. Cependant, étant donné que les variables au niveau du package sont visibles dans la portée globale, elles peuvent être accidentellement modifiées, brisant ainsi les garanties du singleton. 🎜🎜Par conséquent, dans Golang, vous pouvez utiliser la fonction init pour effectuer des opérations d'initialisation et utiliser des variables privées pour enregistrer les instances. Cela force une interface publique à accéder au singleton et empêche toute modification accidentelle de l'instance. Par exemple, voici un exemple simple de package "logger" qui utilise le modèle singleton et l'encapsulation pour créer un enregistreur : 🎜rrreee🎜Dans ce package, nous définissons d'abord un enregistreur privé. Ensuite, dans la fonction init, nous initialisons l'instance et l'attribuons à la variable instance. Il existe également une fonction publique appelée « GetInstance » implémentée dans le package, qui renvoie une instance singleton. De cette façon, nous pouvons limiter l'instanciation des singletons et garantir que les données d'instance sont encapsulées et masquées. 🎜🎜Résumé🎜🎜Cet article explique comment encapsuler et organiser des packages dans Golang pour mieux gérer le code de votre application. Nous avons expliqué comment utiliser les données privées, les interfaces et le modèle singleton pour masquer les détails d'implémentation, et comment utiliser les interfaces publiques pour fournir un accès au monde extérieur. Grâce à ces techniques, vous pouvez améliorer la maintenabilité de votre application et rendre le code plus facile à comprendre et à maintenir. 🎜

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

Cet article explique les mécanismes d'importation des packages de Go: les importations nommées (par exemple, importation & quot; fmt & quot;) et les importations vierges (par exemple, importation _ & quot; fmt & quot;). Les importations nommées rendent le contenu du package accessible, tandis que les importations vierges ne font que l'exécuter t

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Cet article explique la fonction Newflash () de Beego pour le transfert de données inter-pages dans les applications Web. Il se concentre sur l'utilisation de NewFlash () pour afficher les messages temporaires (succès, erreur, avertissement) entre les contrôleurs, en tirant parti du mécanisme de session. Limiter

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Cet article détaille la conversion efficace de la requête MySQL Resulte en tranches de structure GO. Il met l'accent sur l'utilisation de la méthode de numérisation de la base de données / SQL pour des performances optimales, en évitant l'analyse manuelle. Meilleures pratiques pour la cartographie des champs struct à l'aide de balises DB et de robus

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Cet article montre la création de simulations et de talons dans GO pour les tests unitaires. Il met l'accent sur l'utilisation des interfaces, fournit des exemples d'implémentations simulées et discute des meilleures pratiques telles que la tenue de simulations concentrées et l'utilisation de bibliothèques d'assertion. L'articl

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Cet article explore les contraintes de type personnalisé de Go pour les génériques. Il détaille comment les interfaces définissent les exigences de type minimum pour les fonctions génériques, améliorant la sécurité du type et la réutilisabilité du code. L'article discute également des limitations et des meilleures pratiques

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Cet article détaille la rédaction de fichiers efficace dans GO, en comparant OS.WriteFile (adapté aux petits fichiers) avec OS.OpenFile et Buffered Writes (optimal pour les fichiers volumineux). Il met l'accent sur la gestion robuste des erreurs, l'utilisation de différer et la vérification des erreurs spécifiques.

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Cet article explore l'utilisation d'outils de traçage pour analyser le flux d'exécution des applications GO. Il traite des techniques d'instrumentation manuelles et automatiques, de comparaison d'outils comme Jaeger, Zipkin et OpenTelelemetry, et mettant en évidence une visualisation efficace des données

See all articles