QCM : Initiation au développement Go — 60 questions

Questions et réponses du QCM

1. Quelle activité décrit le mieux le développement informatique pour un client ?

Analyser des données, produire des rapports et archiver les résultats
Dessiner une interface, rédiger une notice et vendre le produit
Configurer un réseau, installer des logiciels et former les utilisateurs
Concevoir, coder, tester et intégrer une solution informatique

Concevoir, coder, tester et intégrer une solution informatique

Explication

Le développement informatique regroupe la conception, le codage, les tests et l’intégration d’une solution destinée au client. La configuration d’un réseau et la formation des utilisateurs peuvent accompagner un projet, mais ne définissent pas l’ensemble du développement.

2. Pour quelle raison une application informatique doit-elle être optimisée selon plusieurs critères ?

Pour équilibrer le temps d’exécution, la précision et la consommation de ressources
Pour rendre le programme indépendant du matériel et du système utilisés
Pour remplacer les tests par une vérification rapide du code source
Pour privilégier l’apparence visuelle au détriment du fonctionnement interne

Pour équilibrer le temps d’exécution, la précision et la consommation de ressources

Explication

L’optimisation vise à satisfaire des critères comme le temps d’exécution, la précision et la consommation de ressources. Se concentrer sur l’apparence visuelle ne répond pas directement à ces exigences de performance et de qualité.

3. Que transforme la compilation d’un programme écrit en C ?

Un fichier assembleur en fichier objet avant toute traduction du code
Un code source lisible par l’humain en un fichier binaire exécutable
Un fichier binaire en instructions lisibles et modifiables par l’humain
Un programme exécutable en bibliothèque précompilée réutilisable

Un code source lisible par l’humain en un fichier binaire exécutable

Explication

La compilation transforme le code source lisible par l’humain en un fichier binaire exécutable par une machine. La traduction en assembleur et la production d’un fichier objet correspondent à des étapes intermédiaires de la chaîne de production.

4. Dans quelle séquence un programme C devient-il un fichier exécutable ?

Prétraitement, compilation en assembleur, assemblage en objet, édition de liens
Compilation en objet, prétraitement, édition de liens, assemblage en assembleur
Prétraitement, édition de liens, compilation en assembleur, assemblage en objet
Assemblage en objet, compilation en assembleur, prétraitement, édition de liens

Prétraitement, compilation en assembleur, assemblage en objet, édition de liens

Explication

La chaîne suit l’ordre du prétraitement, de la compilation en assembleur, de l’assemblage en fichier objet, puis de l’édition de liens en exécutable. Le fichier objet constitue une étape intermédiaire et n’est pas encore directement exécutable.

5. Quelle distinction décrit correctement la syntaxe et la sémantique en langage C ?

La syntaxe décrit le sens du code, tandis que la sémantique impose ses délimiteurs
La syntaxe décrit la forme du code, tandis que la sémantique décrit son sens
La syntaxe mesure les performances, tandis que la sémantique contrôle les ressources
La syntaxe traduit le programme, tandis que la sémantique génère le fichier objet

La syntaxe décrit la forme du code, tandis que la sémantique décrit son sens

Explication

La syntaxe concerne la forme du langage, notamment les accolades et les points-virgules, alors que la sémantique concerne le sens des constructions. Les performances et la génération de fichiers relèvent d’autres aspects du développement et de la compilation.

6. Lequel de ces noms peut être utilisé comme identificateur en C ?

valeur-prix
while
2total
total_2

total_2

Explication

Un identificateur C peut contenir des lettres, des chiffres et des soulignements, à condition de ne pas commencer par un chiffre et de ne pas être un mot-clé. « while » est un mot-clé, tandis que « 2total » commence par un chiffre et « valeur-prix » contient un trait d’union.

7. Quelle affirmation décrit correctement les principaux types numériques et construits du langage C ?

char représente un caractère, tandis que float et double représentent des nombres flottants
enum, struct et union sont des types flottants adaptés aux calculs décimaux
int, float et double sont des types construits destinés à regrouper plusieurs champs
char représente un nombre flottant, tandis que float et double représentent des caractères

char représente un caractère, tandis que float et double représentent des nombres flottants

Explication

Le langage C propose notamment char pour les caractères, int pour les entiers, float et double pour les nombres flottants, ainsi qu'enum, struct et union comme types construits. Les types enum, struct et union ne sont donc pas des types flottants.

8. Comment une chaîne de caractères est-elle représentée en mémoire en langage C ?

Par une suite de caractères suivie d’un pointeur vers sa capacité
Par un tableau d’entiers dont le dernier élément vaut zéro numérique
Par un tableau de caractères terminé par le caractère \0
Par une structure contenant sa longueur et son premier caractère

Par un tableau de caractères terminé par le caractère \0

Explication

Une chaîne C est un tableau de caractères dont la fin est signalée en mémoire par le caractère \0. Une structure avec une longueur explicite correspond à d’autres représentations possibles, mais ne définit pas la chaîne C classique.

9. En C, quelle valeur est interprétée comme fausse dans une condition ?

La valeur 0
Toute valeur positive
Toute valeur différente de 0
La valeur -1

La valeur 0

Explication

En C, la valeur 0 est interprétée comme fausse, tandis que toute valeur différente de 0 est interprétée comme vraie. La valeur -1 constitue donc un exemple de valeur vraie, et non une valeur fausse particulière.

10. Quel comportement décrit correctement l’instruction if en C lorsqu’elle est associée à else ?

Elle exécute une branche si une condition est vraie et l’autre si elle est fausse.
Elle initialise une variable avant l’exécution d’une boucle.
Elle sélectionne un cas correspondant parmi plusieurs constantes entières.
Elle répète une instruction jusqu’à ce qu’une condition devienne vraie.

Elle exécute une branche si une condition est vraie et l’autre si elle est fausse.

Explication

L’instruction if évalue une expression et choisit une première branche si elle est vraie, ou la branche else si elle est fausse. La sélection entre plusieurs constantes correspond plutôt à l’instruction switch.

11. Dans un switch en C, que se passe-t-il lorsqu’aucune constante ne correspond à la valeur de l’expression ?

Le programme revient directement au début de la fonction.
La première branche est exécutée automatiquement.
La branche default est exécutée si elle est présente.
La condition est réévaluée jusqu’à trouver une correspondance.

La branche default est exécutée si elle est présente.

Explication

L’instruction switch exécute la liste associée à la constante correspondante ou la branche default lorsqu’aucune correspondance n’existe. Elle ne réévalue pas automatiquement l’expression pour rechercher un autre cas.

12. Quelle différence distingue une boucle while d’une boucle do while en C ?

while initialise une variable, tandis que do while modifie son type.
while peut ne rien exécuter, tandis que do while exécute au moins une fois.
while exécute au moins une fois, tandis que do while peut ne rien exécuter.
while choisit une constante, tandis que do while évalue une expression.

while peut ne rien exécuter, tandis que do while exécute au moins une fois.

Explication

La condition d’une boucle while est testée avant le corps, ce qui permet zéro exécution si elle est fausse au départ. Dans une boucle do while, le corps est exécuté avant le test final, donc il s’exécute au moins une fois.

13. Quel élément d’un programme Go minimal contient le code exécuté au lancement ?

L’importation de la bibliothèque fmt
La fonction func main()
L’appel à fmt.Println("Hello World !")
La déclaration package main

La fonction func main()

Explication

La fonction func main() contient le code exécuté au lancement d’un programme Go. La déclaration package main identifie le paquet principal, tandis que fmt et fmt.Println servent respectivement à fournir et utiliser l’affichage.

14. Par quelle ligne les fichiers de code Go présentés doivent-ils commencer ?

import fmt
fmt.Println()
package main
func main()

package main

Explication

Les fichiers de code Go présentés commencent par la déclaration package main. Cette ligne identifie le paquet principal et ne doit pas être confondue avec func main(), qui définit la fonction exécutée au lancement.

15. Quelle procédure permet d’exécuter un programme Go nommé hello.go ?

Ouvrir un terminal dans son répertoire puis utiliser go run hello.go.
Importer fmt dans le fichier puis lancer une boucle dans le terminal.
Compiler le programme dans un autre répertoire puis modifier son extension.
Écrire le fichier dans un éditeur puis fermer le terminal immédiatement.

Ouvrir un terminal dans son répertoire puis utiliser go run hello.go.

Explication

Pour exécuter hello.go, il faut se placer dans son répertoire depuis un terminal et lancer la commande go run hello.go. Écrire le code ou importer une bibliothèque prépare le programme, mais ne déclenche pas son exécution.

16. Dans un programme Go standard, où se trouve le code exécuté au lancement ?

Dans le nom du fichier contenant le programme
Dans la bibliothèque importée par le programme
Dans la déclaration du type de chaque variable
Dans la fonction main du paquet main

Dans la fonction main du paquet main

Explication

Un programme Go standard utilise le paquet main et place le code exécuté au lancement dans la fonction main. Une bibliothèque importée fournit des fonctions, mais elle ne remplace pas la fonction principale du programme.

17. Quel est le rôle d’une variable dans un programme ?

Identifier le paquet principal qui contient le programme.
Conserver une valeur afin de la réutiliser ou de la modifier.
Afficher automatiquement une information dans la console.
Déclencher la compilation du fichier depuis le terminal.

Conserver une valeur afin de la réutiliser ou de la modifier.

Explication

Une variable est un emplacement qui conserve une valeur pour permettre sa réutilisation ou sa modification ultérieure. Elle ne définit pas le paquet principal et ne provoque pas automatiquement l’affichage ou la compilation.

18. Comment une variable se déclare-t-elle en Go, et que devient son type après cette déclaration ?

Avec import, un nom et un type déduit après chaque lecture.
Avec var, un nom et un type fixé définitivement après la déclaration.
Avec package, un nom et un type choisi par le terminal.
Avec func, un nom et un type modifié à chaque affectation.

Avec var, un nom et un type fixé définitivement après la déclaration.

Explication

En Go, la déclaration d’une variable utilise var, suivie du nom et du type, lequel reste fixé après la déclaration. Une affectation ultérieure peut modifier la valeur, mais pas le type de la variable.

19. Quelle propriété définit un tableau en Go ?

Une variable contenant des valeurs de types différents, repérées par des chaînes
Une variable contenant des valeurs du même type, repérées par des entiers
Une constante contenant une seule valeur, repérée par une expression
Une fonction contenant des instructions, repérées par des noms

Une variable contenant des valeurs du même type, repérées par des entiers

Explication

Un tableau regroupe plusieurs valeurs de même type et chaque case est repérée par un index entier. Une fonction contient du code, tandis qu’une constante ne représente pas une collection de cases indexées.

20. Quelle déclaration initialise correctement un tableau d’entiers en Go ?

[]bool1,2,3[]bool{1, 2, 3}
[]string1,2,3[]string{1, 2, 3}
int[]1,2,3int[]{1, 2, 3}
[]int1,2,3[]int{1, 2, 3}

$$[]int{1, 2, 3}$$

Explication

La notation []int1,2,3[]int{1, 2, 3} désigne une collection de valeurs de type entier. Le type []string[]string concerne les chaînes, tandis que les autres formes proposées ne correspondent pas à la déclaration attendue.

21. Pour un tableau non vide t, quelle expression donne son dernier index ?

len(t)+1len(t)+1
00
len(t)len(t)
len(t)−1len(t)-1

$$len(t)-1$$

Explication

Comme les index commencent à zéro, un tableau de longueur len(t)len(t) possède pour dernier index len(t)−1len(t)-1. L’expression len(t)len(t) désigne une position située après la dernière case.

22. Si le tableau t contient plusieurs valeurs, quel index permet d’accéder à sa première case ?

len(t)len(t)
len(t)−1len(t)-1
00
11

$$0$$

Explication

La première case d’un tableau porte l’index 00 et s’écrit donc t[0]t[0]. L’expression len(t)−1len(t)-1 correspond au dernier index lorsque le tableau n’est pas vide, tandis que len(t)len(t) dépasse la dernière case.

23. Quelle structure Go permet de répéter un bloc de code selon une condition ?

La sélection switch
La branche else
La boucle for
La conditionnelle if

La boucle for

Explication

La boucle for exécute un bloc plusieurs fois en fonction d’une condition. Une structure if choisit une branche, alors qu'else et switch servent à organiser des choix plutôt qu’à répéter automatiquement un bloc.

24. Dans quelle séquence les opérations d’une boucle for complète sont-elles réalisées à chaque itération ?

Mise à jour, exécution du code, test de la condition, initialisation
Exécution du code, initialisation, mise à jour, test de la condition
Initialisation, test de la condition, exécution du code, mise à jour
Test de la condition, mise à jour, initialisation, exécution du code

Initialisation, test de la condition, exécution du code, mise à jour

Explication

Une boucle for complète initialise la variable, vérifie la condition, exécute le bloc puis applique la mise à jour. La mise à jour intervient donc après le code de l’itération, et non avant son exécution.

25. Que devient une variable déclarée dans l’initialisation d’une boucle for après cette boucle ?

Elle reste accessible dans toute la fonction qui contient la boucle
Elle est transférée dans le tableau parcouru par la boucle
Elle devient automatiquement une constante après la boucle
Elle n’est plus accessible après la fin de la boucle

Elle n’est plus accessible après la fin de la boucle

Explication

Une variable déclarée dans l’initialisation d’un for appartient à la portée de cette boucle et n’est plus accessible lorsqu’elle se termine. Elle ne devient ni une constante ni une variable globale de la fonction.

26. Quel est le rôle principal d’une conditionnelle if en Go ?

Choisir une branche selon qu’une condition est vraie ou fausse
Parcourir automatiquement toutes les valeurs d’une variable
Déclarer un tableau dont les cases sont indexées
Répéter un bloc jusqu’à ce qu’une condition devienne fausse

Choisir une branche selon qu’une condition est vraie ou fausse

Explication

Une conditionnelle if sélectionne le code à exécuter en fonction de la valeur de vérité d’une condition. La répétition d’un bloc relève de for, tandis que la déclaration d’un tableau et le parcours de valeurs répondent à d’autres mécanismes.

27. Dans le code « if condition {code1} else {code2} », quand code2 est-il exécuté ?

Après chaque répétition du bloc code1
Lorsque la condition n’a pas encore été évaluée
Lorsque la condition est vraie
Lorsque la condition est fausse

Lorsque la condition est fausse

Explication

La branche else est choisie lorsque l’expression de la condition est fausse. Lorsque la condition est vraie, c’est le bloc associé à if qui est exécuté, sans passage automatique par else.

28. Comment un switch choisit-il le code à exécuter lorsque plusieurs case pourraient convenir ?

Il exécute le premier case correspondant dans l’ordre d’écriture
Il choisit le dernier case correspondant avant default
Il exécute default avant d’examiner les autres case
Il exécute tous les case correspondants dans l’ordre d’écriture

Il exécute le premier case correspondant dans l’ordre d’écriture

Explication

Un switch examine ses case dans l’ordre et exécute le code du premier case dont la condition est vérifiée. Les autres correspondances ne sont donc pas exécutées automatiquement, et default intervient lorsqu’aucun case ne convient.

29. Quelle description caractérise correctement une fonction en Go ?

Une variable nommée qui conserve une valeur pendant toute l’exécution
Un bloc nommé qui peut recevoir des arguments et retourner des valeurs
Un type structuré qui regroupe des champs de types potentiellement différents
Une instruction qui appelle automatiquement la fonction principale

Un bloc nommé qui peut recevoir des arguments et retourner des valeurs

Explication

Une fonction est un bloc de code nommé pouvant recevoir des arguments et retourner une ou plusieurs valeurs. La fonction principale constitue un cas particulier dans les exemples, mais elle ne définit pas la notion générale de fonction.

30. Quels éléments apparaissent dans la déclaration d’une fonction Go ?

Le mot-clé func, le nom, les arguments typés, les retours éventuels et le bloc
Le mot-clé return, les arguments concrets et l’adresse mémoire du résultat
Le mot-clé call, le nom, les valeurs fournies et le résultat calculé
Le nom du type structuré, ses champs, leurs valeurs et leurs méthodes

Le mot-clé func, le nom, les arguments typés, les retours éventuels et le bloc

Explication

Une déclaration Go utilise func, précise le nom, les types des arguments, le type de retour éventuel et le bloc entre accolades. Les valeurs concrètes sont fournies lors de l’appel et ne font donc pas partie de la déclaration.

31. Que permet de faire un type structuré défini avec struct ?

Déclarer plusieurs valeurs de retour ayant nécessairement le même type
Regrouper plusieurs champs pouvant avoir des types différents
Stocker une copie unique d’un argument transmis à une fonction
Associer plusieurs fonctions à une même adresse mémoire

Regrouper plusieurs champs pouvant avoir des types différents

Explication

Un type structuré regroupe plusieurs champs, et ces champs peuvent être de types différents. Il ne se définit pas comme une simple adresse mémoire ni comme une liste de valeurs de retour.

32. Qu’est-ce qu’un pointeur en Go ?

Un champ structuré qui combine plusieurs valeurs de types différents
Une fonction qui reçoit une copie d’une autre variable
Une méthode qui modifie automatiquement son type récepteur
Une variable qui stocke l’adresse mémoire d’une valeur

Une variable qui stocke l’adresse mémoire d’une valeur

Explication

Un pointeur contient l’adresse mémoire d’une valeur plutôt que cette valeur directement. Recevoir une copie d’un argument décrit le passage par valeur, qui est une notion distincte.

33. Lorsqu’une fonction Go reçoit un argument par valeur, que reçoit-elle ?

Le type de la variable, afin de reconstruire sa valeur après l’appel
Une copie de la valeur, sans modifier directement la variable d’appel
Une référence implicite, qui synchronise chaque modification avec l’appelant
L’adresse de la variable, afin de modifier directement son contenu

Une copie de la valeur, sans modifier directement la variable d’appel

Explication

Le passage par valeur transmet une copie de la valeur, de sorte que les modifications locales ne changent pas directement la variable utilisée lors de l’appel. L’accès direct à cette variable nécessite notamment de transmettre un pointeur.

34. Quelles expressions obtiennent l’adresse de n puis accèdent à la valeur pointée par a ?

&n obtient l’adresse et *a accède à la valeur située à cette adresse
*n accède à la valeur et &a obtient l’adresse de cette valeur
*n obtient l’adresse et &a accède à la valeur située à cette adresse
&n accède à la valeur et *a obtient l’adresse de cette valeur

&n obtient l’adresse et *a accède à la valeur située à cette adresse

Explication

L’opérateur & appliqué à n produit son adresse, tandis que * appliqué à a déréférence le pointeur et fournit la valeur située à cette adresse. Inverser ces opérateurs confond l’obtention d’une adresse avec l’accès à la valeur pointée.

35. Comment une fonction peut-elle modifier indirectement une variable reçue ?

En recevant une copie et en affectant une nouvelle valeur à l’argument local
En recevant un pointeur et en modifiant la valeur déréférencée avec *a = 5
En retournant une adresse sans modifier la valeur située à cette adresse
En déclarant un type structuré puis en ajoutant un champ à la variable d’appel

En recevant un pointeur et en modifiant la valeur déréférencée avec *a = 5

Explication

Une fonction peut modifier la variable d’origine en recevant un pointeur vers celle-ci et en affectant la valeur déréférencée, par exemple avec *a = 5. Modifier une copie locale ne change pas directement la variable passée à l’appel.

36. Quelle caractéristique distingue une méthode d’une fonction ordinaire en Go ?

Elle regroupe plusieurs champs dans une structure sans exécuter de code
Elle reçoit nécessairement un pointeur et modifie la variable d’origine
Elle est associée à un type et regroupe des fonctionnalités avec ce type
Elle retourne une valeur dès qu’elle est appelée sur une variable

Elle est associée à un type et regroupe des fonctionnalités avec ce type

Explication

Une méthode est une fonction particulière associée à un type, ce qui permet de rapprocher les fonctionnalités des données concernées. Elle ne reçoit pas nécessairement un pointeur et ne doit pas forcément retourner une valeur.

37. Dans quel cas une méthode Go peut-elle modifier directement la variable à laquelle elle s’applique ?

Lorsque son récepteur est une copie obtenue par passage de valeur
Lorsque son récepteur est un pointeur vers cette variable
Lorsque la méthode possède un nom différent de celui du type
Lorsque la variable contient plusieurs champs de types différents

Lorsque son récepteur est un pointeur vers cette variable

Explication

Un récepteur pointeur permet à la méthode d’accéder à la variable d’origine et de la modifier. Avec un récepteur valeur, la méthode travaille sur une copie, comme l’impose le passage des arguments par valeur.

38. Quelle distinction décrit correctement un array et un slice en Go ?

Un array possède une capacité variable, tandis qu’un slice a une longueur fixe intégrée à son type.
Un array et un slice ont le même type dès qu’ils contiennent des éléments du même type.
Un array est représenté par un pointeur, tandis qu’un slice ne contient que sa longueur.
Un array a une taille fixe intégrée à son type, tandis qu’un slice possède une taille, une capacité et un pointeur vers un array.

Un array a une taille fixe intégrée à son type, tandis qu’un slice possède une taille, une capacité et un pointeur vers un array.

Explication

La longueur d’un array fait partie de son type, alors qu’un slice combine une taille, une capacité et un pointeur vers un tableau sous-jacent. Ainsi, [4]int et [5]int sont des types distincts, contrairement aux slices d’entiers, qui ont le type []int.

39. Une fonction reçoit un array [3]int par valeur et modifie un de ses éléments : que devient l’array situé dans la fonction appelante ?

Il est remplacé par un slice contenant les nouvelles valeurs.
Il est modifié, car les arrays partagent leur tableau sous-jacent.
Il devient un array de taille différente après la modification.
Il reste inchangé, car la fonction modifie une copie de l’array.

Il reste inchangé, car la fonction modifie une copie de l’array.

Explication

Un array est une valeur normale passée par valeur, donc la fonction reçoit une copie indépendante. Cette règle diffère du comportement d’un slice découpé, qui peut partager le même tableau sous-jacent.

40. Quels éléments constituent la représentation interne d’un slice en Go ?

Un type, une adresse de fonction et une taille maximale.
Une taille, une capacité et un pointeur vers un array.
Une longueur, une valeur par défaut et un pointeur vers une fonction.
Une capacité, un indice final et un array toujours copié.

Une taille, une capacité et un pointeur vers un array.

Explication

Un slice contient un entier pour sa taille, un entier pour sa capacité et un pointeur vers un array. Il ne stocke donc pas directement une copie complète des éléments dans sa structure.

41. Si deux slices sont obtenus par découpage d’un même slice et que l’un d’eux est modifié dans une zone commune, quel effet peut-on observer ?

L’autre slice peut refléter la modification, car les deux partagent le même array sous-jacent.
L’autre slice reste indépendant, car chaque découpage crée une copie complète des éléments.
La modification change la capacité de l’autre slice sans modifier ses éléments.
La modification transforme automatiquement les deux slices en arrays de taille fixe.

L’autre slice peut refléter la modification, car les deux partagent le même array sous-jacent.

Explication

Un slice obtenu par découpage conserve un partage avec le même array sous-jacent que le slice de départ. Une écriture dans une zone commune peut donc être visible depuis l’autre slice, contrairement à une copie indépendante.

42. Que fait l’expression make([]int, 5) en Go ?

Elle crée un slice de cinq entiers initialisés à leur valeur par défaut.
Elle ajoute cinq entiers à un slice existant en augmentant sa capacité.
Elle réserve cinq éléments sans les inclure dans la taille du slice.
Elle crée un array de cinq entiers dont la taille peut ensuite varier.

Elle crée un slice de cinq entiers initialisés à leur valeur par défaut.

Explication

make reçoit le type du slice et sa taille, puis crée ici un slice de cinq entiers. Les éléments sont initialisés à leur valeur par défaut, tandis qu’append sert à ajouter des éléments après la création.

43. Dans un slice, que mesure la capacité par rapport à la taille ?

La capacité indique la taille du type, tandis que la taille indique l’adresse du tableau sous-jacent.
La capacité indique le nombre d’éléments potentiels stockables, tandis que la taille indique le nombre d’éléments présents.
La capacité indique les éléments présents, tandis que la taille indique l’espace potentiellement disponible.
La capacité indique le nombre de slices imbriqués, tandis que la taille indique leur profondeur.

La capacité indique le nombre d’éléments potentiels stockables, tandis que la taille indique le nombre d’éléments présents.

Explication

La taille correspond aux éléments actuellement présents dans le slice, alors que la capacité mesure le nombre d’éléments que son espace sous-jacent peut potentiellement accueillir. Confondre ces deux notions conduit notamment à mal interpréter append.

44. Que se passe-t-il lorsqu’un appel à append dépasse la capacité disponible d’un slice ?

Le slice est copié dans un espace plus grand avant que le nouvel élément soit ajouté.
Le programme refuse l’ajout, car la capacité d’un slice ne peut pas changer.
Le slice est converti en array avant que l’ajout soit effectué.
Le nouvel élément remplace le premier élément afin de conserver la même capacité.

Le slice est copié dans un espace plus grand avant que le nouvel élément soit ajouté.

Explication

Lorsque la capacité est insuffisante, append alloue un espace plus grand, y copie le slice, puis ajoute le nouvel élément. Si la capacité suffit, l’ajout peut se faire dans l’array sous-jacent existant.

45. Dans quel ordre les slices doivent-ils être fournis à copy pour copier les données correctement ?

Le slice destination d’abord, puis le slice source, afin de produire une copie indépendante.
Le slice source deux fois, afin de réserver l’espace nécessaire à la destination.
Le slice source d’abord, puis le slice destination, afin de partager le même tableau.
Le slice destination deux fois, afin de demander une duplication automatique.

Le slice destination d’abord, puis le slice source, afin de produire une copie indépendante.

Explication

copy reçoit d’abord la destination et ensuite la source, puis écrit les données copiées dans la destination. Cette copie rend les modifications ultérieures de la destination indépendantes de la source.

46. Quelle différence pratique existe entre go run et go build ?

go run produit un exécutable permanent, tandis que go build compile et exécute immédiatement.
go run compile puis exécute implicitement, tandis que go build produit un exécutable lancé séparément.
go run crée un package, tandis que go build affiche les éléments de os.Args.
go run analyse les arguments, tandis que go build les convertit en entiers.

go run compile puis exécute implicitement, tandis que go build produit un exécutable lancé séparément.

Explication

go run combine implicitement la compilation et l’exécution du programme. À l’inverse, go build produit un fichier exécutable qui devra être lancé séparément.

47. Que contient os.Args[0] dans un programme Go lancé depuis la ligne de commande ?

Le nombre total d’arguments passés au programme.
La valeur convertie en entier du premier argument fourni.
Le premier argument fourni par l’utilisateur, avant le nom du programme.
Le nom du programme exécuté, avant les arguments fournis par l’utilisateur.

Le nom du programme exécuté, avant les arguments fournis par l’utilisateur.

Explication

Le tableau os.Args place le nom du programme en première position, à l’indice 0. Les arguments fournis sur la ligne de commande commencent donc à os.Args[1], et non à os.Args[0].

48. Quel type possède un argument de ligne de commande récupéré directement dans os.Args ?

Un booléen, lorsque sa valeur est true ou false.
Un type automatiquement déduit selon l’argument fourni.
Un entier, lorsque son contenu est composé de chiffres décimaux.
Une chaîne de caractères, même si sa représentation contient un nombre.

Une chaîne de caractères, même si sa représentation contient un nombre.

Explication

Les éléments de os.Args sont des chaînes de caractères, y compris lorsqu’ils représentent des nombres. Une conversion explicite est donc nécessaire avant d’effectuer des opérations entières.

49. Que retourne strconv.Atoi lorsqu’on lui fournit une chaîne représentant un entier ?

Un entier unique, avec une exception déclenchée en cas d’échec.
Un slice de chiffres et la position du dernier caractère analysé.
L’entier converti et une erreur indiquant si la conversion a réussi.
Une chaîne nettoyée et un booléen indiquant si elle est non vide.

L’entier converti et une erreur indiquant si la conversion a réussi.

Explication

strconv.Atoi convertit la chaîne et retourne simultanément l’entier obtenu ainsi qu’une erreur. Cette erreur permet de détecter une chaîne qui ne peut pas être interprétée comme un entier.

50. Que faut-il faire après avoir utilisé un fichier créé avec os.Createos.Create ?

Appeler sa méthode CloseClose pour terminer son utilisation
Convertir son contenu en []byte[]byte avant de le conserver
Appeler sa méthode ScanScan pour libérer son contenu
Transmettre son chemin à fmt.Fprintlnfmt.Fprintln pour le supprimer

Appeler sa méthode $$Close$$ pour terminer son utilisation

Explication

os.Createos.Create retourne le fichier et une erreur, puis la méthode CloseClose doit être appelée après utilisation. La méthode ScanScan concerne la lecture avec un scanner et ne ferme pas le fichier.

51. Quelle opération réalise fmt.Fprintlnfmt.Fprintln lorsqu’un fichier lui est fourni en premier argument ?

Lire les lignes successives du fichier et fournir le texte courant
Créer le fichier, puis retourner sa taille et son chemin d’accès
Écrire une ligne dans ce fichier et retourner le nombre d’octets ainsi qu’une erreur
Lire tout le contenu du fichier et retourner un tableau d’octets ainsi qu’une erreur

Écrire une ligne dans ce fichier et retourner le nombre d’octets ainsi qu’une erreur

Explication

fmt.Fprintlnfmt.Fprintln écrit une ligne dans le fichier indiqué et retourne le nombre d’octets écrits ainsi qu’une erreur. La lecture intégrale relève de ioutil.ReadFileioutil.ReadFile, tandis que la lecture ligne par ligne relève notamment de bufio.Scannerbufio.Scanner.

52. Quel résultat fournit ioutil.ReadFileioutil.ReadFile lorsqu’on lui transmet le chemin d’un fichier ?

Le nombre d’octets écrits ainsi qu’une erreur d’écriture
Le contenu intégral sous forme de []byte[]byte ainsi qu’une erreur
La ligne courante sous forme de chaîne ainsi qu’un indicateur de fin
Les adresses des variables remplies par une lecture ligne par ligne

Le contenu intégral sous forme de $$[]byte$$ ainsi qu’une erreur

Explication

ioutil.ReadFileioutil.ReadFile lit l’intégralité du fichier identifié par son chemin et retourne son contenu sous forme de []byte[]byte ainsi qu’une erreur. La ligne courante est fournie par Scanner.TextScanner.Text, après un appel à ScanScan.

53. Quelle séquence permet de lire successivement les lignes avec un bufio.Scannerbufio.Scanner ?

Créer le scanner avec fmt.Fscanlnfmt.Fscanln, appeler CloseClose, puis obtenir la ligne avec ReadFileReadFile
Créer le scanner avec os.Createos.Create, appeler FprintlnFprintln, puis obtenir la ligne avec TextText
Créer le scanner avec bufio.NewScannerbufio.NewScanner, appeler ScanScan, puis obtenir la ligne avec TextText
Créer le scanner avec bufio.ReadFilebufio.ReadFile, appeler TextText, puis obtenir la ligne avec ScanScan

Créer le scanner avec $$bufio.NewScanner$$, appeler $$Scan$$, puis obtenir la ligne avec $$Text$$

Explication

Un scanner est créé avec bufio.NewScannerbufio.NewScanner, ScanScan lit les lignes successives et TextText fournit la ligne courante. FprintlnFprintln sert à écrire, tandis que os.Createos.Create sert à créer ou ouvrir un fichier.

54. Comment définir une interface en Go ?

Comme une liste nommée de signatures de méthodes qu’un type peut implanter
Comme une structure concrète contenant directement les valeurs de ses attributs
Comme une fonction nommée qui transforme plusieurs paramètres en résultat
Comme un fichier réservé aux méthodes privées d’un même paquet

Comme une liste nommée de signatures de méthodes qu’un type peut implanter

Explication

Une interface décrit une liste nommée de signatures de méthodes, et un type l’implante en possédant ces méthodes. Elle ne constitue pas une structure concrète contenant directement des attributs.

55. Quel avantage offre une fonction dont un paramètre est une interface ?

Elle peut recevoir une valeur correspondant à un type concret déterminé
Elle peut remplacer automatiquement toutes les fonctions du programme
Elle peut appeler des méthodes absentes de la définition de l’interface
Elle peut recevoir tout type qui implante cette interface

Elle peut recevoir tout type qui implante cette interface

Explication

Un paramètre d’interface accepte tout type compatible qui implante les méthodes requises. Un paramètre de type concret est davantage restreint et n’accepte pas plusieurs types compatibles de cette manière.

56. Pourquoi CarreCarre et CercleCercle peuvent-ils être comparés par PlusGrandPerimetrePlusGrandPerimetre dans l’exemple FormeForme ?

Parce qu’ils sont déclarés comme deux variantes d’une même structure
Parce qu’ils implantent tous deux Perimetre()float64Perimetre() float64
Parce qu’ils utilisent tous deux la formule 4×Cote4 \times Cote
Parce qu’ils possèdent tous deux un champ nommé RayonRayon

Parce qu’ils implantent tous deux $$Perimetre() float64$$

Explication

L’interface FormeForme exige la méthode Perimetre()float64Perimetre() float64, que CarreCarre et CercleCercle fournissent. La présence d’un champ commun ou l’utilisation d’une même formule n’est pas nécessaire pour satisfaire cette interface.

57. Quelle distinction décrit correctement une interface Go par rapport à un type concret ?

L’interface crée les objets, tandis qu’un type concret vérifie les arguments reçus
L’interface stocke les attributs, tandis qu’un type concret ne définit que leurs signatures
L’interface contient les valeurs, tandis qu’un type concret expose leurs noms
L’interface décrit des signatures de méthodes, tandis qu’un type les fournit pour l’implanter

L’interface décrit des signatures de méthodes, tandis qu’un type les fournit pour l’implanter

Explication

Une interface est une liste nommée de signatures, alors qu’un type l’implante en fournissant les méthodes correspondantes. Elle ne joue donc pas le rôle d’une classe concrète qui stockerait directement les données.

58. Une fonction reçoit un paramètre de type interface implanté par CarreCarre et CercleCercle : quels arguments peut-elle accepter ?

Une valeur de type CarreCarre, car une interface désigne un type concret principal
Des valeurs dépourvues des méthodes requises, si leur nom correspond à l’interface
Des valeurs de type CarreCarre ou CercleCercle, puisqu’elles implantent l’interface
Une valeur de type CercleCercle, car une interface retient une seule implantation

Des valeurs de type $$Carre$$ ou $$Cercle$$, puisqu’elles implantent l’interface

Explication

Tout type qui implante l’interface peut être fourni à la fonction, ce qui permet ici d’utiliser CarreCarre ou CercleCercle. La simple correspondance de nom ne suffit pas : les méthodes requises doivent être présentes.

59. Qu’est-ce qu’une fonction anonyme en Go ?

Une fonction réservée aux méthodes d’une interface
Une fonction qui ne peut recevoir aucun paramètre
Une fonction qui possède deux valeurs de retour
Une fonction à laquelle aucun nom n’est donné

Une fonction à laquelle aucun nom n’est donné

Explication

Une fonction anonyme est définie sans lui attribuer de nom. Son caractère anonyme ne détermine ni le nombre de paramètres ni le nombre de valeurs retournées.

60. Que signifie la signature func(int,int)intfunc(int, int) int pour une variable de type fonction ?

La fonction reçoit un entier et retourne deux entiers
La fonction reçoit deux entiers et ne retourne aucune valeur
La fonction reçoit deux fonctions et retourne un entier
La fonction reçoit deux entiers et retourne un entier

La fonction reçoit deux entiers et retourne un entier

Explication

Cette signature indique deux paramètres de type entier et une valeur de retour de type entier. Elle ne décrit donc ni deux valeurs retournées ni l’absence de résultat.

Révisez avec les flashcards

Mémorisez les réponses avec 84 flashcards sur Initiation au développement Go.

Qu'est-ce que le développement informatique ?

Concevoir, coder, tester et intégrer une solution informatique pour un client.

Selon quels critères doit-on optimiser une application informatique ?

Le temps d’exécution, la précision et la consommation de ressources.

Quels savoirs de référence sont étudiés en développement informatique ?

Les algorithmes fondamentaux, structures de données, listes, tableaux, collections, piles, files, structures, encapsulation, modularité, qualité et fichiers.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Initiation au développement Go.

Voir la fiche →

Cours similaires

Crée tes propres QCM

Importe ton cours et l'IA génère des QCM avec corrections en 30 secondes.

Générateur de QCM