Le langage Go
Les fondamentaux du langage
Frédéric G. Marand
Dunod
Table des listingsXI
Avant-proposXV
1 Introduction : pourquoi Go ?1
1.1 La programmation « in the large »1
1.1.1 L'équation des coûts logiciels2
1.1.2 Impact sur la conception du language5
1.2 Nouvelles architectures12
1.3 En pratique14
1.3.1 Simplicité14
1.3.2 Rapidité15
2 Syntaxe19
2.1 Alphabet19
2.1.1 Jeu de caractères19
2.1.2 Encodage20
2.1.3 Classes de caractères21
2.2 L'héritage syntaxique de C21
2.3 Identificateurs23
2.3.1 Forme et identificateurs réservés23
2.3.2 Visibilité25
2.3.3 Comparaison26
2.4 Opérateurs26
2.4.1 Opérateurs et types de données26
2.4.2 Règles de priorité28
2.4.3 Opérateurs multiplicatifs30
2.4.4 Opérateurs additifs31
2.4.5 Dépassement de capacité31
2.4.6 Opérateurs de comparaison32
2.4.7 Opérateurs logiques34
2.4.8 Opérateurs d'adresse35
2.4.9 Opérateur réception36
2.5 Ponctuation37
2.5.1 Opérateurs, instructions et ponctuation37
2.5.2 Ponctuation générale38
2.5.3 Espaces et autre formatages38
2.6 Mots-clefs40
2.6.1 Mots-clefs des définitions de données40
2.6.2 Mots-clefs des structures de contrôle41
2.6.3 Mots-clefs des paquets42
2.6.4 Mots-clefs secrets42
3 Types élémentaires43
3.1 Types simples43
3.1.1 Liste des types simples43
3.1.2 Entiers et caractères44
3.1.3 Nombres flottants réels et complexes47
3.1.4 Chaînes de caractères51
3.2 Types pointeurs56
3.2.1 Définition56
3.2.2 Déclaration de types pointeurs57
3.2.3 Littéraux pointeurs57
3.2.4 Manipulation des pointeurs59
3.3 Types fonctions63
3.3.1 Définition63
3.3.2 Déclaration de types fonctions63
3.3.3 Déclaration de fonctions65
3.3.4 Littéraux fonction65
3.3.5 Code des fonctions66
3.3.6 Manipulation des fonctions70
3.3.7 Chaînage de retours multiples71
3.4 Méthodes d'un type73
3.4.1 Définition73
3.4.2 Déclaration de méthodes74
3.4.3 Jeu de méthodes d'un type74
3.4.4 Méthodes et champs fonctions76
3.4.5 Utilité des méthodes sur les types non-structure77
3.4.6 Récepteur pointeur ou récepteur valeur80
3.4.7 Invocation dynamique82
3.5 Types interfaces85
3.5.1 Définition85
3.5.2 Déclaration de types interface86
3.5.3 Valeurs de types interfaces89
3.5.4 Le type interface { }91
3.5.5 Manipulation des interfaces92
3.5.6 Organisation des interfaces98
3.6 Compatibilité de types100
3.6.1 Identité de types100
3.6.2 Affectabilité102
3.6.3 Représentabilité des constantes105
4 Types composites109
4.1 Tableaux (array)109
4.1.1 Définition109
4.1.2 Déclaration de types tableaux110
4.1.3 Littéraux tableaux111
4.1.4 Manipulation des tableaux112
4.2 Tranches (slice)114
4.2.1 Définition114
4.2.2 Déclaration de types tranche115
4.2.3 Littéraux tranches116
4.2.4 Manipulation des tranches116
4.2.5 Les tranches comme paramètres120
4.3 Cartes (map)122
4.3.1 Définition122
4.3.2 Déclaration de types cartes122
4.3.3 Littéraux cartes122
4.3.4 Manipulation des cartes123
4.3.5 Les cartes comme paramètres125
4.4 Structures (struct)126
4.4.1 Définition126
4.4.2 Déclaration de types structure127
4.4.3 Champs intégrés et promotion129
4.4.4 Étiquettes de champs131
4.4.5 Littéraux structures132
4.4.6 Manipulation des structures134
4.5 Types canaux (chan)137
4.5.1 Définition137
4.5.2 Déclaration de types canaux138
4.5.3 Valeurs de types canaux139
4.5.4 Manipulation des canaux139
4.5.5 Extensions145
5 Données147
5.1 Variables147
5.1.1 Variables et types147
5.1.2 Déclaration des variables148
5.1.3 Utilisation des variables150
5.1.4 Quasi-variables : paramètres et retours150
5.1.5 Variables anonymes151
5.2 Constantes152
5.2.1 Constantes Go et autres langages152
5.2.2 Valeurs constantes152
5.2.3 Constantes et types154
5.2.4 Précision des valeurs constantes155
5.2.5 Déclaration des constantes156
5.3 Valeurs et types159
5.4 Valeurs vierges162
5.4.1 Définition162
5.4.2 Valeurs vierges des types de données163
5.4.3 Rendre la valeur vierge utile164
5.5 « nil »165
5.5.1 Définition165
5.5.2 nil pour les types interfaces166
5.5.3 nil comme récepteur166
5.5.4 Une erreur à un milliard de dollars ?170
5.6 Fin de vie170
5.6.1 Destructeurs170
5.6.2 Finaliseurs171
5.7 Réflexion et méta-programmation174
5.7.1 Définition174
5.7.2 Lecture d'étiquettes de structure174
5.7.3 Fonctions génériques177
5.7.4 API de réflexion178
5.7.5 Conclusion181
6 Expressions183
6.1 Opérateurs et opérandes183
6.2 Littéraux184
6.2.1 Règles générales184
6.2.2 Littéraux tableaux, tranches, et cartes184
6.2.3 Littéraux structures186
6.3 Qualification des identificateurs187
6.4 Expressions primaires188
6.5 Sélection189
6.6 Expressions de méthodes193
6.7 Valeurs de méthodes194
6.8 Indexation196
6.9 Tranchage (découpage)198
6.9.1 Définition198
6.9.2 Notation199
6.9.3 Contraintes et résultats200
6.9.4 Implantation mémoire201
6.10 Assertions de types204
6.10.1 Définition204
6.10.2 Notation205
6.10.3 Résultats205
6.11 Appels de fonctions/méthodes206
6.11.1 Définition et notation206
6.11.2 Arguments et résultats208
6.11.3 Chaînage d'appels209
6.12 Conversions211
6.12.1 Définition211
6.12.2 Notation212
6.12.3 Possibilités et limites214
6.12.4 Conversions numériques216
6.12.5 Conversions de chaînes217
6.12.6 Conversions d'interfaces218
6.13 Règles communes221
6.13.1 Expressions constantes221
6.13.2 Ordre d'évaluation222
7 Instructions225
7.1 Organisation de l'exécution225
7.1.1 Instructions terminales225
7.1.2 Instructions simples227
7.2 Instructions simples228
7.2.1 L'instruction vide228
7.2.2 Expressions228
7.2.3 Émission sur un canal230
7.2.4 Incrémentation / décrémentation230
7.2.5 Affectation231
7.2.6 Déclaration courte de variable234
7.3 Instructions générales237
7.3.1 Déclaration237
7.3.2 Instruction étiquetée240
7.3.3 Bloc241
7.3.4 Si - alors - sinon : if - else241
7.3.5 Commutateur d'expression switch v244
7.3.6 Commutateur de type switch v. (type)248
7.3.7 Sélecteur de communication select251
7.3.8 for, la boucle à tout faire257
7.3.9 break, l'interrupteur263
7.3.10 continue, le raccourci263
7.3.11 Déroutement goto265
7.4 Instructions liées aux fonctions268
7.4.1 Retour de fonction avec return268
7.4.2 Exécution concurrente avec go270
7.4.3 Code terminal avec defer272
8 Builtins ; fonctions intégrées et erreurs275
8.1 Affichage : print et println276
8.2 Convertisseurs complexes277
8.3 Allocation : make et new278
8.4 Taille et capacité : len, cap280
8.5 Manipulation des tranches : append, copy282
8.6 Destruction d'éléments de carte : delete282
8.7 Fermeture de canaux par close282
8.8 Traitement des erreurs avec l'interface error283
8.8.1 Définition283
8.8.2 Le modèle Go de gestion des erreurs283
8.8.3 Création d'erreurs spécifiques285
8.8.4 Emballage et déballage d'erreurs286
8.8.5 L'expérimentation check / handle / try288
8.9 Situations de panique : panic et recover289
8.9.1 Définition289
8.9.2 Paniques d'exécution290
8.9.3 Utilisation appropriée292
9 Organisation du code en paquets295
9.1 Programmes et paquets295
9.2 La clause package297
9.2.1 Définition297
9.2.2 Clause paquets et compilation par fichier297
9.3 Répertoire d'un paquet298
9.4 Fichiers d'un paquet298
9.4.1 Répartition du code dans les fichiers298
9.4.2 Conventions de nommage299
9.5 Programmes exécutables et greffons : le paquet main300
9.6 Organisation des paquets303
9.6.1 Hiérarchisation des paquets303
9.6.2 Organisation des paquets d'un projet304
9.6.3 Réduction de la surface d'API avec les paquets internal304
9.7 Déclaration d'importation import305
9.8 Initialisation308
9.9 Chemins d'importation310
9.9.1 Notion de workspace et GOPATH310
9.9.2 Bibliothèque standard et GOROOT312
9.9.3 Paquets distants avec go get312
9.9.4 Organisation des paquets en mode GOPATH317
9.10 Modules VGO319
9.10.1 Inconvénients du mécanisme des espaces de travail320
9.10.2 Solutions antérieures aux modules320
9.10.3 Des objectifs du projet Go aux modules VGO322
9.10.4 Fonctionnement324
9.10.5 Utilisation au quotidien329
10 Programmation concurrente337
10.1 Concurrence et parallélisme337
10.2 Coroutines338
10.2.1 Définition338
10.2.2 Utilisation339
10.2.3 API340
10.2.4 Bonnes pratiques344
10.3 Contextes345
10.3.1 Définition345
10.3.2 Utilisation346
10.3.3 Exemple : annulation de handler HTTP348
10.4 Primitives de synchronisation : le paquet sync351
10.4.1 Groupe des tâches : sync. WaitGroup352
10.4.2 Exécution unique : Once354
10.4.3 Exclusion mutuelle : Mutex / RWMutex355
10.4.4 Allocations réutilisées : Pool357
10.4.5 Tableaux associatifs : Map358
10.4.6 Moniteurs : Cond359
10.5 Bas niveau : le paquet sync/atomic361
10.6 Mécanismes spécialisés : le paquet golang.org/x/sync362
10.6.1 Sémaphores ; le paquet semaphore362
10.6.2 Regroupement d'erreurs et annulation : le paquet errgroup363
10.6.3 Dédoublonnage d'exécution : le paquet singleflight364
10.6.4 Cartes concurrentes : le paquet syncmap365
10.7 Situations de compétition : le race detector366
Index367