Görev Silme
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 24 / 68.
Görev
KolayGörev yönetim sisteminizin bu bölümünde, listenizden görevleri kaldırma özelliğini uygulayacaksınız. Bu zorluk, belirli bir öğe olmadan bir dilimi (slice) yeniden oluşturmak için append fonksiyonunu kullanarak dilim manipülasyonuna odaklanır ve veri yapınızdan öğeleri kalıcı olarak nasıl kaldıracağınızı gösterir.
Üç girdi alacaksınız:
- Görev sayısını temsil eden bir dize (örneğin,
"4") - Şu formatta görev verilerini içeren bir dize:
"name1:status1,name2:status2,name3:status3"; burada durum (status)"true"veya"false"değeridir (örneğin,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true") - Kaldırılacak görevin dizinini (index) temsil eden bir dize (örneğin, ikinci görev için 0 tabanlı dizin kullanarak
"1")
Göreviniz şunları yapmaktır:
- Önceki zorluklardaki
Name(string) veCompleted(bool) alanlarına sahip aynıTaskyapısını (struct) tanımlayın - Parametre olarak bir
Taskyapısı dilimi ve bir dizin (int) alanremoveTaskadında bir fonksiyon oluşturun removeTaskfonksiyonu içinde, hedef dizinden önceki ve sonraki öğeleri birleştirmek içinappendkullanarak, verilen dizindeki görevin kaldırıldığı yeni bir dilim döndürün- Görev diliminizi oluşturmak için ikinci girdideki görev verilerini ayrıştırın:
- Bireysel görev girişlerini almak için girdiyi virgüllere göre bölün
- Her giriş için, isim ve durumu ayırmak üzere iki noktaya göre bölün
- Durum dizesini bir boolean değerine dönüştürün (
"true"değeritrue,"false"değerifalseolur)
- Görev dizinini elde etmek için üçüncü girdi dizesini bir tam sayıya dönüştürün
removeTaskfonksiyonunu çağırmadan önce kaldırılacak görevin adını saklayın- Diliminiz ve dizininizle
removeTaskfonksiyonunuzu çağırın ve dönen dilimi saklayın - Görevi kaldırdıktan sonra, kalan tüm görevleri önceki zorluklarla aynı formatı kullanarak görüntüleyin:
- Tamamlanan görevler için:
"[x] [task_name]" - Tamamlanmamış görevler için:
"[ ] [task_name]"
- Tamamlanan görevler için:
- Bir onay mesajı yazdırın:
"Task '[task_name]' removed successfully!" - Güncellenmiş özeti yazdırın:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Dizin dizesini bir tam sayıya dönüştürmek için strconv paketini kullanın. Bu zorluk, hedef bir öğeden önceki ve sonraki kısımları birleştirerek dilimleri yeniden oluşturmak için append fonksiyonunun nasıl kullanılacağını, koleksiyonunuzdaki öğeleri etkili bir şekilde kaldırırken kalan öğelerin sırasını nasıl koruyacağınızı gösterir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func completeTask(tasks *[]Task, index int) {
(*tasks)[index].Completed = true
}
func main() {
// Read input using bufio.Scanner to handle spaces properly
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
_ = scanner.Text() // Read but don't use the number of tasks
scanner.Scan()
taskDataStr := scanner.Text()
scanner.Scan()
indexStr := scanner.Text()
// Parse task data
taskEntries := strings.Split(taskDataStr, ",")
tasks := make([]Task, len(taskEntries))
for i, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
status := parts[1] == "true"
tasks[i] = Task{Name: name, Completed: status}
}
}
// Convert index string to integer
index, _ := strconv.Atoi(indexStr)
// Complete the task
taskName := tasks[index].Name
completeTask(&tasks, index)
// Display all tasks
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
// Print confirmation message
fmt.Printf("Task '%s' marked as completed!\n", taskName)
// Count completed and incomplete tasks
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := len(tasks) - completedCount
// Print summary
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), completedCount, incompleteCount)
}Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar