Hé les gars !
Je n'ai pas blogué sur Dev depuis plus de 2 ans ! Cela fait un moment, alors excusez-moi si mes compétences en dactylographie se sont dégradées avec le temps.
J'apprends actuellement Go et j'ai reçu une liste de projets à réaliser et à partager. L'un d'eux se trouve être une simple application Golang cli-todo qui permet à quelqu'un d'ajouter des tâches à une liste de tâches et de réaliser un ensemble de tâches de base. fonctionnalité sur ces tâches.
Ceux-ci incluent :
1) Liste des tâches
2) Ajouter plus de tâches
3) Modifier ces tâches
4) Rendre les tâches terminées
Malheureusement, je n'ai pas de nom fantaisiste pour cela ? car elle est conçue pour être une application légère et facile à utiliser que quelqu'un peut terminer en une journée. Même si vous êtes débutant.
~ Code source du projet : https://github.com/SirTingling/cloudprojects/tree/main/go-cli-todo-app
Eh bien, comme d'habitude, la création de notre main.go. Une fois cela configuré, nous devrons définir la structure et les fonctionnalités de nos tâches. Je l'ai fait dans un todo.go séparé
type Todo struct { Title string Completed bool CreatedAt time.Time CompletedAt *time.Time }
avec une tranche pour contenir nos todos
type Todos []Todo
Ensuite, nous aurons besoin de la mise en œuvre des principales méthodes de fonctionnalité, qui incluent :
func (todos *Todos) add(title string) { todo := Todo{ Title: title, Completed: false, CompletedAt: nil, CreatedAt: time.Now(), } *todos = append(*todos, todo) }
Crée un objet Todo avec un titre, définit son statut Terminé sur faux et l'ajoute à la tranche Todos.
func (todos *Todos) delete(index int) error { t := *todos if err := t.validateIndex(index); err != nil { return err } *todos = append(t[:index], t[index+1:]...) return nil }
Valide l'index, puis utilise le découpage pour supprimer l'élément de la liste Todos.
func (todos *Todos) toggle(index int) error { if err := todos.validateIndex(index); err != nil { return err } t := *todos todo := &t[index] if !todo.Completed { completedTime := time.Now() todo.CompletedAt = &completedTime } else { todo.CompletedAt = nil } todo.Completed = !todo.Completed return nil }
Valide l'index, retourne le booléen Completed et met à jour l'horodatage CompletedAt en conséquence.
Le reste des méthodes suit une fonctionnalité très similaire, en cas de problème, n'hésitez pas à consulter le code source
Un problème courant avec de nombreuses applications de tâches basées sur cli est qu'elles ne sont pas aussi charmantes. Avec l'aide d'un package tiers appelé aquasecurity/table, la liste des tâches s'affichera proprement.
aquasécurité/table
Il peut être installé avec :
go get github.com/aquasecurity/table
Ensuite, j'ai créé une méthode pour afficher les tâches en utilisant des méthodes externes au package. En particulier SetRowLines, SetHeaders, New, AddRow & Render étaient les principaux utilisés dans mon cas.
func (todos *Todos) print() { table := table.New(os.Stdout) table.SetRowLines(false) table.SetHeaders("#", "Title", "Completed", "Created At", "Completed At") for index, t := range *todos { completed := "❌" completedAt := "" if t.Completed { completed = "✅" if t.CompletedAt != nil { completedAt = t.CompletedAt.Format(time.RFC1123) //time standard } } table.AddRow(strconv.Itoa(index), t.Title, completed, t.CreatedAt.Format(time.RFC1123), completedAt) } table.Render() }
La méthode print est un moyen pratique d'afficher la liste des tâches dans le terminal. Il crée un tableau avec des colonnes pour des éléments tels que le numéro de la tâche, le titre, si elle est terminée, quand elle a été créée et quand elle a été terminée.
Il passe en revue chaque tâche, vérifie si elle est terminée ou non et ajoute un ✅ si elle est terminée ou un ❌ si elle ne l'est pas. Si la tâche est terminée, elle affiche même la date et l'heure exactes à laquelle elle a été terminée.
Une fois que toutes les lignes sont prêtes, il imprime le tableau dans un format propre et lisible. Super pratique pour voir rapidement l'état de toutes les tâches d'un utilisateur en un coup d'œil !
J'ai donc pensé que la fonctionnalité consistant à enregistrer les tâches localement, disons dans un fichier, dans ce cas, todos.json, puis à lire à partir de là serait une bonne idée. Essentiellement, avoir un certain niveau de persistance de nos données concernant chacune des tâches.
On pourrait ajouter cette fonctionnalité à un fichier existant, mais je pense que c'est une bonne idée de séparer les soucis.
J'ai ajouté un storage.go, il peut s'appeler comme vous le souhaitez store.go, persist.go, etc.
J'ai choisi JSON mais les mêmes principes s'appliquent généralement à tout format de données dans lequel vous souhaitez également enregistrer les données.
type Todo struct { Title string Completed bool CreatedAt time.Time CompletedAt *time.Time }
Il existe une structure Storage qui assure le suivi du fichier avec lequel vous travaillez.
La fonction NewStorage permet de configurer les choses en lui donnant simplement le nom du fichier.
La méthode Save prend les données, les transforme en joli JSON et les écrit dans le fichier (todos.json). Si quelque chose ne va pas, il nous le signale avec une erreur.
La méthode Load fait le contraire : lit le fichier, décompresse le JSON et remplit le fichier fileData avec les données.
C'est un moyen simple et réutilisable de gérer l'enregistrement et le chargement de tout type de données sans avoir besoin d'une base de données ou de quelque chose de sophistiqué.
À partir de là, j'utilise NewStorage dans le main.go pour ajouter quelques tâches à ma liste et les enregistrer qui peuvent maintenant être consultées dans mon todos.json
type Todos []Todo
func (todos *Todos) add(title string) { todo := Todo{ Title: title, Completed: false, CompletedAt: nil, CreatedAt: time.Now(), } *todos = append(*todos, todo) }
Pour les commandes, je n'ai rien fait d'extraordinaire. J'ai défini les drapeaux que j'utiliserai comme structure
func (todos *Todos) delete(index int) error { t := *todos if err := t.validateIndex(index); err != nil { return err } *todos = append(t[:index], t[index+1:]...) return nil }
puis une fonction simple utilisant le package de drapeaux répertorie ces drapeaux, leur donne plus de détails et de descriptions, et les personnalise. J'ai également entendu de bonnes choses sur le package Cobra qui pourrait être très simple à utiliser ici, la prochaine fois je l'essaierai.
func (todos *Todos) toggle(index int) error { if err := todos.validateIndex(index); err != nil { return err } t := *todos todo := &t[index] if !todo.Completed { completedTime := time.Now() todo.CompletedAt = &completedTime } else { todo.CompletedAt = nil } todo.Completed = !todo.Completed return nil }
À partir de là, vous pouvez faire preuve de créativité sur la façon dont vous souhaitez exécuter ces indicateurs, dans mon cas, j'ai fait des déclarations de cas simples.
Ouais ! Cela a complété cette simple application Go cli to-do qui peut être réalisée dans un laps de temps relativement court, un grand merci à Coding with Patrik et The Builder qui ont tous deux un contenu incroyable pour aider à des projets comme ceux-ci et les rendre amusants !
Merci d'avoir lu et j'espère que ces mini-projets inspireront d'autres personnes à se lancer avec Go ou simplement à continuer à s'entraîner avec. J'en ai encore quelques-unes à faire et à partager, à la prochaine fois !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!