Hai Kawan-kawan!
Saya tidak menulis blog di Dev selama lebih 2 tahun! Sudah agak lama jadi maafkan saya jika kemahiran menaip saya telah merosot dari semasa ke semasa.
Saya sedang belajar Go dan menerima senarai projek untuk disiapkan dan dikongsi, salah satu daripada ini adalah aplikasi cli-todo Golang mudah yang membolehkan seseorang menambah tugasan pada senarai tugasan dan mencapai satu set asas kefungsian pada tugasan ini.
Ini termasuk:
1) Penyenaraian Tugas
2) Menambah Lebih Banyak Tugas
3) Mengubahsuai Tugasan Ini
4) Membuat Tugasan Selesai
Malangnya, saya tidak mempunyai nama yang menarik untuknya ? kerana ia direka bentuk untuk menjadi apl yang ringan dan mudah digunakan yang boleh disiapkan oleh seseorang dalam sehari. Walaupun anda seorang pemula.
~ Kod Sumber Projek: https://github.com/SirTingling/cloudprojects/tree/main/go-cli-todo-app
Seperti biasa, penciptaan main.go kami. Setelah ini disediakan, kami perlu menentukan struktur dan kefungsian tugas kami. Saya melakukannya dalam todo.go yang berasingan
type Todo struct { Title string Completed bool CreatedAt time.Time CompletedAt *time.Time }
dengan sekeping untuk menampung tugas kami
type Todos []Todo
Kemudian kami memerlukan pelaksanaan kaedah kefungsian utama, yang termasuk:
func (todos *Todos) add(title string) { todo := Todo{ Title: title, Completed: false, CompletedAt: nil, CreatedAt: time.Now(), } *todos = append(*todos, todo) }
Mencipta objek Todo dengan tajuk, menetapkan status Selesai kepada palsu dan menambahkannya pada kepingan 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 }
Mengesahkan indeks, kemudian menggunakan penghirisan untuk mengalih keluar item daripada senarai 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 }
Mengesahkan indeks, membalikkan boolean Selesai dan mengemas kini cap waktu CompletedAt dengan sewajarnya.
Kaedah selebihnya mengikut fungsi yang hampir sama, jika ada masalah, sila semak kod sumber
Isu biasa dengan banyak apl tugasan yang berasaskan cli ialah ia tidak begitu menawan. Dengan bantuan pakej pihak ketiga yang dipanggil aquasecurity/jadual senarai tugasan akan dipaparkan dengan kemas.
keselamatan akua/meja
Ia boleh dipasang dengan:
go get github.com/aquasecurity/table
Kemudian saya membuat kaedah untuk memaparkan todos menggunakan kaedah dari luar pakej. Terutamanya SetRowLines, SetHeaders, New, AddRow & Render adalah yang paling banyak digunakan dalam kes saya.
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() }
Kaedah cetakan adalah cara yang kemas untuk menunjukkan senarai todos dalam terminal. Ia mencipta jadual dengan lajur untuk perkara seperti nombor tugasan, tajuk, sama ada ia telah selesai, apabila ia dibuat dan apabila ia telah selesai.
Ia melalui setiap item tugasan, menyemak sama ada ia selesai atau tidak, dan menambah ✅ jika ia telah selesai atau ❌ jika ia tidak. Sekiranya tugas itu selesai, ia juga menunjukkan tarikh dan masa yang tepat ia telah disiapkan.
Setelah semua baris sedia, ia mencetak jadual dalam format yang bersih dan boleh dibaca. Sangat berguna untuk melihat status semua tugas pengguna dengan pantas dengan pantas!
Jadi saya berpendapat bahawa fungsi menyimpan todos secara setempat untuk katakan fail, dalam kes ini, todos.json, dan kemudian membaca daripada sana adalah idea yang baik. Pada asasnya mempunyai beberapa tahap kegigihan data kami mengenai setiap dan semua tugasan.
Kami boleh menambahkan fungsi ini pada fail sedia ada, tetapi saya fikir adalah idea yang baik untuk memisahkan kebimbangan.
Saya menambahkan storage.go, ia boleh dipanggil apa sahaja yang anda mahu store.go, persist.go, dsb.
Saya memilih JSON tetapi prinsip yang sama biasanya digunakan pada mana-mana format data yang anda mahu simpan data juga.
type Todo struct { Title string Completed bool CreatedAt time.Time CompletedAt *time.Time }
Terdapat struct Storan yang menjejaki fail yang sedang digunakan.
Fungsi NewStorage membantu menyediakan perkara dengan hanya memberikannya nama fail.
Kaedah Simpan mengambil data, mengubahnya menjadi JSON yang cantik dan menulisnya pada fail (todos.json). Jika berlaku kesilapan, ia memberitahu kami dengan ralat.
Kaedah Muat melakukan sebaliknya—membaca fail, membongkar JSON dan mengisi data fail dengan data.
Ini cara yang mudah dan boleh diguna semula untuk mengendalikan menyimpan dan memuatkan apa-apa jenis data tanpa memerlukan pangkalan data atau apa-apa yang mewah.
Dari sini saya menggunakan NewStorage dalam main.go untuk menambahkan beberapa todos pada senarai saya dan menyimpannya yang kini boleh dilihat dalam todos.json saya
type Todos []Todo
func (todos *Todos) add(title string) { todo := Todo{ Title: title, Completed: false, CompletedAt: nil, CreatedAt: time.Now(), } *todos = append(*todos, todo) }
Untuk arahan, saya tidak membuat apa-apa yang mewah. Saya menentukan bendera yang saya akan gunakan sebagai struct
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 }
kemudian fungsi mudah menggunakan pakej bendera senaraikan bendera ini, berikan lebih banyak butiran & huraian dan sesuaikan mereka. Saya juga pernah mendengar perkara yang baik tentang pakej Cobra yang mungkin sangat mudah digunakan di sini, lain kali saya akan mencubanya.
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 }
Dari situ, anda boleh menjadi kreatif tentang cara anda ingin melaksanakan bendera ini, dalam kes saya, saya membuat pernyataan kes mudah.
Ya! Dengan melengkapkan aplikasi Go cli to-do yang mudah ini yang boleh dilakukan dalam tempoh masa yang agak singkat, jerit utama kepada Pengekodan dengan Patrik dan The Builder kedua-duanya mempunyai kandungan yang menakjubkan di luar sana untuk membantu projek seperti ini dan menjadikannya menyeronokkan!
Terima kasih kerana membaca dan saya berharap projek mini ini memberi inspirasi kepada orang lain untuk sama ada bermula dengan Go atau teruskan berlatih dengannya. Saya ada beberapa lagi untuk dilakukan dan dikongsi, jumpa lagi di lain kali!
Atas ialah kandungan terperinci Apl Simple Go CLI-Everything. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!