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. Bir nil map, esasen bellekte hiçbir şeyi işaret etmeyen, başlatılmamış bir map'tir. Bu kavramı anlamak çok önemlidir çünkü nil bir map'e anahtar eklemeye çalışmak, programınızın paniklemesine (panic) ve çökmesine neden olacaktır.
Bir nil map'in nasıl oluştuğu ve nasıl göründüğü aşağıdadır:
var myMap map[string]int
// myMap bu noktada nil'dirBir map değişkenini başlatmadan bildirdiğinizde, Go onu otomatik olarak nil değerine ayarlar. Bir nil map'ten güvenle okuma yapabilseniz de (sıfır değerini döndürecektir), ona yazmaya çalışmak bir paniğe (panic) neden olacaktır:
// Bu güvenlidir - 0 döndürür
value := myMap["key"]
// Bu panik (panic) yaratacaktır!
myMap["key"] = 42Bu sorunu önlemek için, bir map'e anahtar eklemeye çalışmadan önce her zaman nil olup olmadığını kontrol etmelisiniz. Kontrol oldukça basittir:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Artık bu güvenliBu basit kontrol, potansiyel olarak başlatılmamış map'lerle çalışırken programınızın çökmemesini sağlayarak kodunuzu daha sağlam ve güvenilir hale getirir.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayYazma işlemlerini denemeden önce nil map'leri kontrol ederek panik hatalarını önleyen güvenli bir map başlatma sistemi oluşturun. Bu zorluk, programınızı çökertebilecek işlemleri gerçekleştirmeden önce map durumunu doğrulamanın kritik önemini göstermektedir.
İki girdi alacaksınız:
- İşlem sayısını temsil eden bir dize (örneğin,
"5") - Şu formatta işlemler içeren bir dize:
"operation1:key1:value1,operation2:key2:value2"; burada işlemler"check","init"veya"add"şeklindedir (örneğin,"check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")
Göreviniz şunları yapmaktır:
scoresvegradesadında,map[string]inttüründe iki map değişkenini başlatmadan oluşturun (bunlar nil olacaktır)- Girdi dizesindeki her işlemi sırayla işleyin:
"check"işlemleri 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"işlemleri için:- Belirtilen map'i
make(map[string]int)kullanarak başlatın "Initialized map [map_name]"yazdırın
- Belirtilen map'i
"add"işlemleri için:- Önce map'in nil olup olmadığını kontrol edin
- Eğer map nil ise,
"Cannot add to nil map [map_name]"yazdırın - Eğer map nil değilse, anahtar-değer çiftini ekleyin ve
"Added [key]:[value] to [map_name]"yazdırın
- Girdi dizesini ayırarak işlemleri ayrıştırın:
- Bireysel işlemleri elde etmek için virgüllere göre ayırın
- Her işlem için, işlem türünü ve parametreleri elde etmek için iki nokta üst üste işaretine göre ayırın
- Ekleme işlemleri için değer dizesini bir tam sayıya dönüştürün
- Tüm işlemleri işledikten sonra, her iki map'in son durumunu görüntüleyin:
- Her bir map için, eğer nil ise:
"Final state - [map_name]: nil" - Her bir map için, eğer başlatılmışsa:
"Final state - [map_name]: [count] entries"; burada count, anahtar-değer çiftlerinin sayısıdır
- Her bir map için, eğer nil ise:
Ekleme işlemleri için değer dizelerini tam sayılara dönüştürmek üzere strconv paketini kullanın. Bu zorluk, yazma işlemlerinden önce nil map'leri kontrol etmenin çalışma zamanı paniklerini nasıl önlediğini ve kodunuzu nasıl sağlam ve güvenilir hale getirdiğini gösterir.
Kopya kağıdı
Bir nil map, bellekte hiçbir yeri işaret etmeyen, başlatılmamış bir map'tir. Bir nil map'e anahtar eklemeye çalışmak, programınızın paniklemesine (panic) ve çökmesine neden olur.
Bir map'i başlatmadan deklare etmek, bir nil map oluşturur:
var myMap map[string]int
// myMap bu noktada nil'dirBir nil map'ten okuma yapmak güvenlidir (sıfır değer döndürür), ancak ona yazmaya çalışmak panik oluşturur:
// Bu güvenlidir - 0 döndürür
value := myMap["key"]
// Bu panik oluşturacaktır!
myMap["key"] = 42Anahtar eklemeden önce her zaman bir map'in nil olup olmadığını kontrol edin:
if myMap == nil {
myMap = make(map[string]int)
}
myMap["key"] = 42 // Artık bu güvenliKendin 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 tanımla (nil olacaklar)
var scores map[string]int
var grades map[string]int
// İşlemleri virgüle göre ayır
operations := strings.Split(operationsStr, ",")
// TODO: Kodunuzu aşağıya yazın
// Her işlemi sırayla işle
// "check", "init" ve "add" işlemlerini ele al
// Ekleme (add) işlemleri için, değer dizesini tam sayıya dönüştürmek üzere strconv.Atoi() kullanın
// Her iki map'in son durumunu yazdır
// Map'lerin nil mi yoksa başlatılmış mı olduğunu kontrol edin ve buna göre yazdırın
}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ışlar