Nil Map Kontrolü
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 28 / 68.
Go'da bir map, nil adı verilen özel bir duruma sahip olabilir. nil map, esasen bellekte hiçbir şeyi göstermeyen başlatılmamış bir map'tir. Bu kavramı anlamak çok önemlidir; çünkü nil bir map'e anahtar eklemeye çalışmak programınızın paniğe kapılmasına ve çökmesine neden olur.
Bir nil map'in nasıl oluştuğu ve neye benzediği aşağıda açıklanmıştır:
var myMap map[string]int
// myMap bu noktada nilBir map değişkenini başlatmadan bildirdiğinizde Go, onu otomatik olarak nil olarak ayarlar. nil bir map'ten güvenle okuyabilirsiniz (sıfır değerini döndürür), ancak ona yazmaya çalışmak panic'e neden olur:
// Bu güvenli - 0 döndürür
value := myMap["key"]
// Bu panik yapacak!
myMap["key"] = 42Bu sorunu önlemek için, map'e anahtar eklemeye çalışmadan önce map'in nil olup olmadığını her zaman check etmelisin. check basittir:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Artık bu güvenliBu basit kontrol, potansiyel olarak başlatılmamış eşlemelerle çalışırken programınızın çökmesini önleyerek kodunuzu daha sağlam ve güvenilir hâle getirir.
Görev
KolayYazma işlemlerini gerçekleştirmeye çalışmadan önce nil map'leri kontrol ederek panic hatalarını önleyen güvenli bir map initialization sistemi oluşturun. Bu challenge, programınızı çökertebilecek işlemleri gerçekleştirmeden önce map durumunu doğrulamanın kritik önemini gösterir.
İki girdi alacaksınız:
- İşlem sayısını temsil eden bir string (ör.
"5") - Virgüllerle ayrılmış işlemleri içeren bir string. Her işlem, üzerinde çalıştığı map'i belirtir:
"check:[map_name]""init:[map_name]""add:[map_name]:[key]:[value]"
"check:scores,init:scores,add:scores:Alice:95,add:scores:Bob:87,check:grades"
Göreviniz:
map[string]inttüründe,scoresvegradesadlarına sahip iki map değişkeni oluşturun ve bunları initialization yapmadan bırakın (nil olacaklardır)- Girdi string'indeki her operation'ı sequentially işleyin:
"check"operations için:- Belirtilen map'in nil olup olmadığını kontrol edin
- Map nil ise
"Map [map_name] is nil"yazdırın - Map nil değilse
"Map [map_name] is initialized"yazdırın
"init"operations için:- Belirtilen map'i
make(map[string]int)kullanarak initialize edin "Initialized map [map_name]"yazdırın
- Belirtilen map'i
"add"operations için:- Önce map'in nil olup olmadığını kontrol edin
- Map nil ise
"Cannot add to nil map [map_name]"yazdırın - Map nil değilse key-value çiftini ekleyin ve
"Added [key]:[value] to [map_name]"yazdırın
- Girdi string'ini bölerek operations'ı ayrıştırın:
- Tek tek operations'ları elde etmek için virgüllerden bölün
- Her operation için operation türünü ve parametreleri elde etmek üzere iki nokta üst üste işaretlerinden bölün
"add"operations için value string'ini integer'a convert edin
- Tüm operations işlendikten sonra her iki map'in final durumunu görüntüleyin:
- Her map için nil ise:
"Final state - [map_name]: nil" - Her map için initialized ise: count'un key-value çiftlerinin sayısı olduğu
"Final state - [map_name]: [count] entries" - Operations bunları hangi sırada kullanmış olursa olsun, önce
scoressonragradesyazdırın
- Her map için nil ise:
strconv package'ını, "add" operations için value string'lerini integer'lara convert etmek üzere kullanın. Bu challenge, write operations öncesinde nil map'leri kontrol etmenin runtime panic'lerini nasıl önlediğini ve kodunuzu sağlam ve güvenilir hâle getirdiğini gösterir.
Kendin dene
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Girdiyi oku
var numOpsStr string
var operationsStr string
fmt.Scanln(&numOpsStr)
fmt.Scanln(&operationsStr)
// Map'leri başlatmadan bildir (nil olacaklar)
var scores map[string]int
var grades map[string]int
// İşlemleri virgülle ayır
operations := strings.Split(operationsStr, ",")
// TODO: Kodunu aşağıya yaz
// Her işlemi sırayla işle
// "check", "init" ve "add" işlemlerini ele al
// add işlemleri için, değer string'ini tamsayıya dönüştürmek için strconv.Atoi() kullan
// Her iki map'in son durumunu yazdır
// Map'lerin nil veya başlatılmış olup olmadığını kontrol et ve buna göre yazdır
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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