Manipulation avancée de données en Go
Structures
https://www.simplilearn.com/tutorials/golang-tutorial/golang-struct
https://devopssec.fr/article/structures-et-methodes-golang
Fichiers
https://devopssec.fr/article/structures-et-methodes-golang
https://www.golinuxcloud.com/golang-os/
https://gobyexample.com/reading-files
TP - Structures et Tableaux
Vous devez développer un programme Go pour gérer une liste de tâches. Chaque tâche est représentée par un nom et un statut (complet ou incomplet). Le programme doit permettre à l'utilisateur de :
Votre programme devrait afficher le message suivant : "Bienvenue dans le gestionnaire de tâches !"
Ensuite, il devrait afficher un menu avec les options suivantes :
Après chaque action effectuée par l'utilisateur, le menu devrait être réaffiché jusqu'à ce que l'utilisateur choisisse l'option "Quitter".
Solution
package main
import "fmt"
type Task struct {
Name string
Status string
}
func main() {
fmt.Println("Bienvenue dans le gestionnaire de tâches !")
tasks := make([]Task, 0)
for {
fmt.Println("\nMenu:")
fmt.Println("1. Ajouter une tâche")
fmt.Println("2. Marquer une tâche comme complète")
fmt.Println("3. Afficher la liste des tâches")
fmt.Println("4. Quitter")
var choice int
fmt.Print("Votre choix : ")
fmt.Scan(&choice)
switch choice {
case 1:
var name string
fmt.Print("Nom de la tâche à ajouter : ")
fmt.Scan(&name)
task := Task{
Name: name,
Status: "Incomplet",
}
tasks = append(tasks, task)
fmt.Println("Tâche ajoutée avec succès !")
case 2:
var name string
fmt.Print("Nom de la tâche à marquer comme complète : ")
fmt.Scan(&name)
for i := range tasks {
if tasks[i].Name == name {
tasks[i].Status = "Complet"
fmt.Println("Tâche marquée comme complète avec succès !")
break
}
}
case 3:
fmt.Println("Liste des tâches :")
for _, task := range tasks {
fmt.Printf("- %s : %s\n", task.Name, task.Status)
}
case 4:
fmt.Println("Au revoir !")
return
default:
fmt.Println("Choix invalide. Veuillez sélectionner une option valide.")
}
}
}
Explication du code :
TaskNameStatusmain()tasksfortaskstaskstasksTP - Fichiers
Vous devez développer un programme Go pour gérer une liste de contacts. Chaque contact est représenté par un nom et un numéro de téléphone. Le programme doit permettre à l'utilisateur de :
Votre programme devrait afficher le message suivant : "Bienvenue dans le gestionnaire de contacts !"
Ensuite, il devrait afficher un menu avec les options suivantes :
Après chaque action effectuée par l'utilisateur, le menu devrait être réaffiché jusqu'à ce que l'utilisateur choisisse l'option "Quitter".
Solution
Code solution expliqué :
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
type Contact struct {
Name string
Phone string
}
func main() {
fmt.Println("Bienvenue dans le gestionnaire de contacts !")
contacts := make(map[string]string)
loadContactsFromFile(contacts)
for {
fmt.Println("\nMenu:")
fmt.Println("1. Ajouter un contact")
fmt.Println("2. Rechercher un contact")
fmt.Println("3. Afficher la liste des contacts")
fmt.Println("4. Enregistrer les contacts dans un fichier")
fmt.Println("5. Charger les contacts à partir d'un fichier")
fmt.Println("6. Quitter")
var choice int
fmt.Print("Votre choix : ")
fmt.Scan(&choice)
switch choice {
case 1:
var name, phone string
fmt.Print("Nom du contact : ")
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
name = scanner.Text()
fmt.Print("Numéro de téléphone : ")
scanner.Scan()
phone = scanner.Text()
contacts[name] = phone
fmt.Println("Contact ajouté avec succès !")
case 2:
var name string
fmt.Print("Nom du contact à rechercher : ")
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
name = scanner.Text()
phone, found := contacts[name]
if found {
fmt.Printf("Numéro de téléphone de %s : %s\n", name, phone)
} else {
fmt.Println("Contact non trouvé.")
}
case 3:
fmt.Println("Liste des contacts :")
for name, phone := range contacts {
fmt.Printf("- %s : %s\n", name, phone)
}
case 4:
saveContactsToFile(contacts)
fmt.Println("Contacts enregistrés avec succès !")
case 5:
loadContactsFromFile(contacts)
fmt.Println("Contacts chargés avec succès !")
case 6:
fmt.Println("Au revoir !")
return
default:
fmt.Println("Choix invalide. Veuillez sélectionner une option valide.")
}
}
}
func loadContactsFromFile(contacts map[string]string) {
file, err := os.Open("contacts.txt")
if err != nil {
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
parts := strings.Split(line, ":")
if len(parts) == 2 {
name := strings.TrimSpace(parts[0])
phone := strings.TrimSpace(parts[1])
contacts[name] = phone
}
}
if err := scanner.Err(); err != nil {
fmt.Println("Erreur lors du chargement des contacts :", err)
}
}
func saveContactsToFile(contacts map[string]string) {
file, err := os.Create("contacts.txt")
if err != nil {
fmt.Println("Erreur lors de l'enregistrement des contacts :", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for name, phone := range contacts {
line := fmt.Sprintf("%s: %s\n", name, phone)
_, err := writer.WriteString(line)
if err != nil {
fmt.Println("Erreur lors de l'écriture dans le fichier :", err)
}
}
writer.Flush()
}
Explication du code :
ContactNamePhonemain()contactsloadContactsFromFile()contacts.txtsaveContactsToFile()contacts.txtforcontactscontactscontactscontacts.txtsaveContactsToFile()contacts.txtloadContactsFromFile()