Maison > développement back-end > Golang > Application Simple Go CLI-Everything

Application Simple Go CLI-Everything

Patricia Arquette
Libérer: 2024-11-30 20:14:20
original
642 Les gens l'ont consulté

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.

Simple Go CLI-Todo App

~ Code source du projet : https://github.com/SirTingling/cloudprojects/tree/main/go-cli-todo-app

Commençons

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
}
Copier après la connexion
Copier après la connexion

avec une tranche pour contenir nos todos

type Todos []Todo
Copier après la connexion
Copier après la connexion

Ensuite, nous aurons besoin de la mise en œuvre des principales méthodes de fonctionnalité, qui incluent :

  • ajouter
func (todos *Todos) add(title string) {
    todo := Todo{
        Title:       title,
        Completed:   false,
        CompletedAt: nil,
        CreatedAt:   time.Now(),
    }

    *todos = append(*todos, todo)
}
Copier après la connexion
Copier après la connexion

Crée un objet Todo avec un titre, définit son statut Terminé sur faux et l'ajoute à la tranche Todos.

  • supprimer
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
}
Copier après la connexion
Copier après la connexion

Valide l'index, puis utilise le découpage pour supprimer l'élément de la liste Todos.

  • basculer
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
}
Copier après la connexion
Copier après la connexion

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

Exécuter l'application

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
Copier après la connexion

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()
}
Copier après la connexion

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 !

Et si vous enregistriez ces tâches ?

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
}
Copier après la connexion
Copier après la connexion
  • 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
Copier après la connexion
Copier après la connexion

func (todos *Todos) add(title string) {
    todo := Todo{
        Title:       title,
        Completed:   false,
        CompletedAt: nil,
        CreatedAt:   time.Now(),
    }

    *todos = append(*todos, todo)
}
Copier après la connexion
Copier après la connexion

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
}
Copier après la connexion
Copier après la connexion

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
}
Copier après la connexion
Copier après la connexion

À 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.

C'est ça?

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 !

Simple Go CLI-Todo App

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal