La fonction new()
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy. Leçon 22 sur 107.
Go fournit une fonction intégrée appelée new() qui alloue de la mémoire pour un type et renvoie un pointeur vers celui-ci. La mémoire allouée est initialisée avec la valeur zéro du type.
p := new(int) // alloue de la mémoire pour un int
fmt.Println(*p) // 0 (valeur zéro)
fmt.Println(p) // 0xc000018030 (adresse mémoire)La fonction new() prend un type comme argument et renvoie un pointeur vers une valeur zéro nouvellement allouée de ce type. Cela est particulièrement utile lorsque vous avez besoin d’un pointeur, mais que vous ne disposez pas d’une variable existante à référencer.
Avec les structures, new() crée un pointeur vers une structure dont tous les champs sont définis sur leurs valeurs nulles.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (chaîne vide)
fmt.Println(p.Age) // 0Tu te demandes peut-être quand utiliser new() plutôt que l’opérateur d’adresse &. Les deux approches ci-dessous sont équivalentes :
// Utilisation de new()
p1 := new(Person)
// Utilisation de l'opérateur d'adresse avec un littéral
p2 := &Person{}La syntaxe &Person{} est plus courante en pratique, car elle vous permet d’initialiser les champs en même temps. Utilisez new() lorsque vous souhaitez spécifiquement une instance ayant des valeurs nulles et préférez une sémantique d’allocation de mémoire explicite.
Défi
FacileConstruisons un gestionnaire de configuration qui montre comment new() alloue de la mémoire et initialise les structures avec leurs valeurs zéro. Tu verras en quoi cette approche diffère de l’utilisation de l’opérateur d’adresse avec un littéral de structure.
Tu organiseras ton code sur deux fichiers :
config.go: définis une structureServerConfigavec les champsHost(string),Port(int),MaxConnections(int) etDebugMode(bool). Crée deux fonctions :NewServerConfigqui utilisenew()pour allouer unServerConfiget renvoie directement le pointeur (avec toutes les valeurs zéro)ConfigureServerqui prend un pointeur*ServerConfigainsi qu’une chaîne représentant l’hôte et un entier représentant le port, puis définit ces champs dans la configuration via le pointeur
Displaysur*ServerConfigqui renvoie une chaîne formatée affichant toutes les valeurs de configuration.main.go: lis un hôte et un port depuis l’entrée. Commence par créer une configuration avecNewServerConfig()et affiche-la pour montrer les valeurs zéro. Utilise ensuiteConfigureServerpour définir l’hôte et le port, puis affiche à nouveau la configuration pour montrer les valeurs mises à jour.
Les entrées suivantes seront fournies :
- Ligne 1 : Nom d’hôte (chaîne)
- Ligne 2 : Numéro de port (entier)
Ta méthode Display doit renvoyer une chaîne dans ce format exact :
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]Affiche le résultat deux fois, une fois avant la configuration (en montrant les valeurs zéro), puis une fois après la configuration (en montrant l’hôte et le port mis à jour).
Par exemple, avec localhost et 8080, ta sortie devrait être :
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falseRemarque que le premier affichage montre toutes les valeurs zéro (chaîne vide, 0, 0, false), car new() initialise tout avec les valeurs zéro. Après l’appel à ConfigureServer, seuls l’hôte et le port changent, tandis que les autres champs conservent leurs valeurs zéro.
Essayez vous-même
package main
import (
"fmt"
)
func main() {
// Lire l'entrée
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: Créer une config en utilisant NewServerConfig() et l'afficher
// Cela montrera les valeurs zéro
// TODO: Utiliser ConfigureServer pour définir le host et le port
// TODO: Afficher la config à nouveau pour montrer les valeurs mises à jour
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et modules GoPackages et importsNoms exportés et non exportésIntroduction à la POO en GoStructs comme classesDéfinir des méthodes sur des structsRécepteurs pointeurs ou par valeurInitialisation des structsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL’interface comme contratInterface vide (any)Assertion de typeCommutation de typeComposition d’interfacesInterfaces Stringer et ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter et SetterDissimulation de l’information en GoRécapitulatif – Fiches d’étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesSolution de contournement pour les méthodes génériquesRécapitulatif - Collection générique2Plongée approfondie dans les types et les structs
Types de base et compositesDéfinitions de types personnalisésTags de structStructs anonymesStructs imbriquésValeurs zéro et valeurs par défautRécapitulatif - Carnet de contacts5La composition plutôt que l’héritage
Pourquoi Go n’a pas d’héritageBases de l’inclusion de structsPromotion des méthodesInclure plusieurs structsInclusion ou agrégationMasquage des méthodes inclusesRécapitulatif : hiérarchie des employés8Gestion des erreurs et POO
L’interface errorTypes d’erreurs personnalisésEnrobage des erreurs (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - Analyseur de fichiers11Bibliothèque standard et POO
io.Reader et io.Writersort.InterfaceInterface fmt.Stringerencoding/json avec des structsInterface http.HandlerRécapitulatif - Modèles d’API REST14Modèles de conception – Partie 2
Modèle CommandeModèle AdaptateurModèle DécorateurModèle Méthode modèleModèle ÉtatModèle CompositeMiddleware comme décorateur3Pointeurs et mémoire
Notions de base des pointeurs en GoPointeurs vers des structuresPassage par valeur ou par référenceLa fonction new()Garbage collection en GoRécapitulatif - Constructeur de listes chaînées6Polymorphisme en Go
Polymorphisme via les interfacesDuck typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif – Processeur de paiements9Concurrence et POO
Bases des GoroutinesCanaux et communicationCanaux tamponnés ou non tamponnésInstruction selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures thread-safeRécapitulatif - Pool de workersEntraînez-vous par vous-même : Compilateur Go en ligne