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önetimi sisteminizin bu bölümünde, görevleri tamamlandı olarak işaretleme özelliğini uygulayacaksınız. Bu görev, özgün görev verilerini değiştirmek için işaretçi alıcılarının kullanımına odaklanır ve işaretçilerin yapı alanlarını kalıcı olarak güncellemenize nasıl olanak sağladığını gösterir.
Önemli Not: Görev adları ("Buy groceries" gibi) boşluk içerebileceğinden, girdinin tüm satırlarını okumak için bufio.Scanner kullanmanız gerekir. fmt.Scanf ilk boşlukta okumayı durdurur; bu da boşluk içeren görev adlarını bozar. bufio.NewScanner(os.Stdin) kullanın ve tam satırları okumak için scanner.Scan() ile ardından scanner.Text() çağrısını yapın.
Üç girdi alacaksınız:
- Görev sayısını temsil eden bir dize (ör.
"4") - Şu biçimde görev verilerini içeren bir dize:
"name1:status1,name2:status2,name3:status3"; burada status ya"true"ya da"false"değeridir (ör."Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - Tamamlanacak görevin dizinini temsil eden bir dize (ör. 0 tabanlı dizinleme kullanıldığında üçüncü görev için
"2")
Göreviniz şunları yapmaktır:
- Önceki görevlerdeki aynı
TaskyapısınıName(string) veCompleted(bool) alanlarıyla tanımlayın - Parametre olarak bir
Taskyapıları dilimine işaretçi ve bir dizin (int) alancompleteTaskadlı bir işlev oluşturun completeTaskişlevinin içinde, verilen dizindeki görevinCompletedalanınıtrueolarak değiştirin- Girdi satırlarını düzgün şekilde okumak için
bufio.Scannerkullanın:- Bir tarayıcı oluşturun:
scanner := bufio.NewScanner(os.Stdin) - Her girdi satırı için: önce
scanner.Scan(), ardındanscanner.Text()çağrısını yapı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:
- Tek tek görev girdilerini elde etmek için girdiyi virgüllere göre ayırın
- Adı ve durumu ayırmak için her girdiyi iki noktaya göre ayırın
- Durum dizesini bir boolean değere dönüştürün (
"true"değeritrue,"false"değerifalseolur)
- Görev dizinini elde etmek için üçüncü girdi dizesini bir tamsayıya dönüştürün
completeTaskişlevinizi, diliminize bir işaretçi ve dizin ile çağırın- Görevi tamamladıktan sonra, önceki görevdekiyle aynı biçimi kullanarak tüm görevleri 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 tamsayıya dönüştürmek için strconv paketini kullanın. Bu görev, işaretçi alıcılarının özgün veri yapısını değiştirmenize nasıl olanak sağladığını ve işlev döndükten sonra da kalıcı olan görev listenizde kalıcı değişiklikler yapmayı 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ışlarKendi başına pratik yap: Online Go derleyicisi