Görev Tamamlama
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 23 / 68.
Görev
KolayGörev yönetim sisteminizin bu bölümünde, görevleri tamamlandı olarak işaretleme özelliğini uygulayacaksınız. Bu zorluk, orijinal görev verilerini değiştirmek için işaretçi alıcılarını (pointer receivers) kullanmaya odaklanarak, işaretçilerin struct alanlarını kalıcı olarak güncellemenize nasıl olanak tanıdığını gösterir.
Önemli Not: Görev adları boşluk içerebileceğinden (örneğin "Buy groceries"), tüm girdi satırlarını okumak için bufio.Scanner kullanmanız gerekecektir. fmt.Scanf fonksiyonu ilk boşlukta okumayı durdurur, bu da boşluk içeren görev adlarını bozar. Tam satırları okumak için bufio.NewScanner(os.Stdin) kullanın ve scanner.Scan() ardından scanner.Text() fonksiyonlarını çağırın.
Üç 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"true"veya"false"şeklindedir (örneğin,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Tamamlanacak görevin dizinini (index) temsil eden bir dize (örneğin, üçüncü görev için 0 tabanlı dizin kullanarak
"2")
Göreviniz şunları yapmaktır:
- Önceki zorluklardaki
Name(string) veCompleted(bool) alanlarına sahip aynıTaskstruct'ını tanımlayın - Parametre olarak bir
Taskstruct dilimi (slice) işaretçisi ve bir dizin (int) alancompleteTaskadında bir fonksiyon oluşturun completeTaskfonksiyonu içinde, verilen dizindeki görevinCompletedalanınıtrueolarak değiştirin- Girdi satırlarını düzgün okumak için
bufio.Scannerkullanın:- Bir tarayıcı oluşturun:
scanner := bufio.NewScanner(os.Stdin) - Her girdi satırı için:
scanner.Scan()ve ardındanscanner.Text()çağırın - Bu, boşluk içeren görev adlarının doğru okunmasını sağlar
- Bir tarayıcı oluşturun:
- 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, ad ve durumu ayırmak üzere iki noktaya göre bölün
- Durum dizesini bir boolean'a 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
- Diliminize bir işaretçi ve dizin ile
completeTaskfonksiyonunuzu çağırın - Görevi tamamladıktan sonra, tüm görevleri önceki zorlukla 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]' marked as completed!" - 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, işaretçi alıcılarının orijinal veri yapısını değiştirmenize nasıl olanak tanıdığını ve görev listenizde fonksiyon döndükten sonra da kalıcı olan değişiklikler yapmanızı nasıl sağladığını gösterir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func viewAllTasks(tasks []Task) {
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
}
func main() {
var numTasksStr string
fmt.Scanln(&numTasksStr)
numTasks, _ := strconv.Atoi(numTasksStr)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
taskData := scanner.Text()
var tasks []Task
taskEntries := strings.Split(taskData, ",")
for _, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
completed, _ := strconv.ParseBool(parts[1])
task := Task{
Name: name,
Completed: completed,
}
tasks = append(tasks, task)
}
}
viewAllTasks(tasks)
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := numTasks - completedCount
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, 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