0Pricing
Go Academy · Leçon

Packages internes et espaces de travail

internal/, directives replace et go work

Packages internes et espaces de travail est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Le répertoire internal/

Les paquets situés dans un répertoire internal/ ne peuvent être importés que par du code appartenant à l’arborescence de répertoires parente. Cela garantit l’encapsulation des paquets :

// Project structure:
// myapp/
//   main.go
//   internal/
//     auth/auth.go      <- can only be imported by myapp/
//     db/db.go          <- can only be imported by myapp/
//   api/
//     handlers.go       <- can import myapp/internal/auth

// External package CANNOT do:
// import "myapp/internal/auth"  <- compile error

Utiliser les paquets internal/

Le code situé dans le même module (au-dessus du répertoire internal/) peut importer librement les paquets internes :

// myapp/api/handlers.go
package api

import (
    "myapp/internal/auth"
    "myapp/internal/db"
)

func GetUser(id int) (*db.User, error) {
    if !auth.IsValid() {
        return nil, auth.ErrUnauthorized
    }
    return db.FindUser(id)
}

Pourquoi utiliser internal/ ?

Avantages de la convention internal/ :

  • Empêche les autres modules de dépendre des détails d’implémentation
  • Vous permet de remanier librement le code sans interrompre les appels externes
  • Indique clairement que cet élément ne fait pas partie de l’API publique
  • Les outils Go standards font respecter cette restriction au moment de la compilation

Espaces de travail Go — go work

Go 1.18 a introduit les espaces de travail pour travailler simultanément avec plusieurs modules locaux sans directives replace :

# Create a workspace in parent directory:
go work init ./myapp ./mylib

# Creates go.work:
# go 1.21
# use (
#     ./myapp
#     ./mylib
# )

# Now myapp can import mylib without replace directives

go work sync

Synchronisez les dépendances de l’espace de travail avec go work sync :

# go.work file:
go 1.21

use (
    ./api
    ./worker
    ./shared
)

# Sync all module dependencies:
go work sync

# Build across all workspace modules:
go build ./...

# Test across all workspace modules:
go test ./...

Espace de travail ou directive replace

Comparaison de deux approches pour le développement local avec plusieurs modules :

// BEFORE workspaces (cumbersome):
// go.mod in myapp:
// replace github.com/me/mylib => ../mylib
// Must remove before publishing!

// WITH workspaces (cleaner):
// go.work at root:
// use (./myapp ./mylib)
// go.mod files stay clean — go.work is gitignored

Cas d’utilisation des espaces de travail

Quand utiliser les espaces de travail Go :

  • Développer simultanément une bibliothèque et le programme qui l’utilise
  • Gérer un monodépôt contenant plusieurs modules qui se référencent mutuellement
  • Tester les modifications apportées à un module partagé avant sa publication
  • Travailler sur une version dérivée d’une dépendance en parallèle de votre application

go work add et go work use

Gérez les entrées de l’espace de travail avec les sous-commandes go work :

# Add a module to the workspace
go work use ./newservice

# Remove a module from workspace
go work use -r ./oldservice

# Edit go.work directly (opens $EDITOR):
go work edit

# go.work should usually be gitignored:
echo "go.work" >> .gitignore
echo "go.work.sum" >> .gitignore

internal/ et espace de travail ensemble

Les paquets internes et les espaces de travail s’intègrent naturellement dans les monodépôts :

// Monorepo structure:
// services/
//   go.work
//   auth-service/
//     internal/tokens/   <- private to auth-service
//   order-service/
//     internal/pricing/  <- private to order-service
//   shared/
//     models/            <- shared across services

// go.work:
// use (./auth-service ./order-service ./shared)

Bonnes pratiques pour organiser les paquets

Recommandations pour la structure d’un projet Go :

  • Structure de paquets plate pour les petits projets : évitez l’organisation prématurée
  • Utilisez internal/ pour les détails d’implémentation qui ne sont pas destinés à un usage externe
  • Placez les paquets principaux de l’interface en ligne de commande sous cmd/appname/
  • Utilisez les espaces de travail pour les dépôts à plusieurs modules, mais ajoutez go.work à la liste des fichiers ignorés par Git
  • Évitez l’imbrication excessive : au maximum 3 à 4 niveaux de paquets

Vérification rapide

Qui peut importer un paquet situé dans un répertoire internal/ ?

Récapitulatif : paquets internes et espaces de travail

Résumé :

  • internal/ limite les importations à l’arborescence de répertoires parente ; cette règle est appliquée par le compilateur
  • Utilisez internal/ pour masquer les détails d’implémentation aux utilisateurs externes
  • go work init crée un espace de travail pour le développement local avec plusieurs modules
  • Les espaces de travail remplacent les directives replace pour le développement local
  • Ajoutez go.work et go.work.sum à la liste des fichiers ignorés par Git

Questions Fréquemment Posées

La leçon « Packages internes et espaces de travail » est-elle gratuite ?

Oui — le texte complet de « Packages internes et espaces de travail » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Packages internes et espaces de travail » ?

internal/, directives replace et go work Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Packages internes et espaces de travail » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Packages : organiser le code Go
  2. Modules Go avec go mod
  3. Ajouter des dépendances externes
  4. Packages internes et espaces de travail
← Retour à Go Academy