Struct Map'leri
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 26 / 68.
Değer olarak struct'ları sakladığınızda Map'ler inanılmaz derecede güçlü hale gelir. Bu yöntem, kolay arama ve erişim için anlamlı anahtarlar kullanarak karmaşık, yapılandırılmış verileri düzenlemenize olanak tanır.
Struct'ları map değerleri olarak kullandığınızda, esasen her bir anahtarın eksiksiz bir veri kaydına işaret ettiği bir koleksiyon oluşturmuş olursunuz. İşte böyle bir map'i nasıl tanımlayacağınız ve başlatacağınız:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Struct verilerine, tıpkı diğer map işlemlerinde olduğu gibi map üzerinden erişebilir ve bu verilerle çalışabilirsiniz. Bir öğrencinin bilgilerini almak için anahtar olarak öğrencinin adını kullanmanız yeterlidir:
alice := students["Alice"]
fmt.Println(alice.ID) // şunu yazdırır: 101
fmt.Println(alice.Grade) // şunu yazdırır: ABu desen; kullanıcı profilleri, ürün katalogları veya yapılandırma ayarları gibi hem yapılandırılmış veriye hem de hızlı anahtar tabanlı erişime ihtiyaç duyduğunuz ilişkili veri koleksiyonlarını depolamak için Go uygulamalarında son derece yaygındır.
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
KolayDeğer olarak struct'ları kullanan map'ler aracılığıyla bir öğrenci not yönetim sistemi oluşturun. Bu meydan okuma, verimli arama ve erişim için anlamlı anahtarlar kullanarak karmaşık öğrenci verilerinin nasıl organize edileceğini gösterir.
İki girdi alacaksınız:
- Öğrenci sayısını temsil eden bir dize (örneğin,
"4") - Şu formatta öğrenci verilerini içeren bir dize:
"name1:id1:grade1,name2:id2:grade2,name3:id3:grade3"(örneğin,"Alice:101:A,Bob:102:B,Charlie:103:C,Diana:104:A")
Göreviniz şunları yapmaktır:
- Aşağıdaki alanlara sahip bir
Studentstruct'ı tanımlayın:ID(int) - öğrencinin kimlik numarasıGrade(string) - öğrencinin harf notu
- Anahtarların öğrenci isimleri (string) ve değerlerin
Studentstruct'ları olduğu bir map oluşturun - İkinci girdiden öğrenci verilerini ayrıştırın:
- Bireysel öğrenci girişlerini elde etmek için girdiyi virgüllere göre bölün
- Her giriş için isim, ID ve notu ayırmak üzere iki nokta üst üste işaretine göre bölün
- ID dizesini bir tam sayıya (integer) dönüştürün
- Bir
Studentstruct'ı oluşturun ve ismi anahtar olarak kullanarak map'e ekleyin
- Tüm öğrencileri isimlerine göre alfabetik sırayla şu formatta görüntüleyin:
"[name]: ID [id], Grade [grade]" - Not istatistiklerini hesaplayın ve görüntüleyin:
- Her nottan (A, B, C, D, F) kaç öğrencinin olduğunu sayın
- Mevcut olan her not için sayıyı şu formatta görüntüleyin:
"Grade [grade]: [count] students" - Notları alfabetik sırayla (A, B, C, D, F) görüntüleyin
- En yüksek ID'ye sahip öğrenciyi şu formatta bulun ve görüntüleyin:
"Highest ID: [name] ([id])" - Toplam öğrenci sayısını görüntüleyin:
"Total students: [count]"
ID dizesini tam sayıya dönüştürmek için strconv paketini ve öğrenci isimlerini alfabetik olarak sıralamak için sort paketini kullanın. Bu meydan okuma, struct değerlerine sahip map'lerin, anlamlı tanımlayıcılar kullanarak karmaşık veri koleksiyonlarını organize etmek ve bunlara erişmek için nasıl verimli bir yol sağladığını gösterir.
Kopya kağıdı
Map'ler, her bir anahtarın tam bir veri kaydını işaret ettiği koleksiyonlar oluşturarak struct'ları değer olarak saklayabilir:
type Student struct {
ID int
Grade string
}
students := map[string]Student{
"Alice": {ID: 101, Grade: "A"},
"Bob": {ID: 102, Grade: "B"},
}Anahtarı kullanarak map üzerinden struct verilerine erişin:
alice := students["Alice"]
fmt.Println(alice.ID) // yazdırır: 101
fmt.Println(alice.Grade) // yazdırır: ABu desen; kullanıcı profilleri, ürün katalogları veya hem yapılandırılmış veriye hem de hızlı anahtar tabanlı erişime ihtiyaç duyduğunuz yapılandırma ayarları gibi ilişkili veri koleksiyonlarını saklamak için yaygın olarak kullanılır.
Kendin dene
package main
import (
"fmt"
)
func main() {
// Girdiyi oku
var numStudentsStr string
var studentData string
fmt.Scanln(&numStudentsStr)
fmt.Scanln(&studentData)
// TODO: Burada Student yapısını (struct) tanımlayın
// TODO: Öğrencileri saklamak için bir map oluşturun (anahtar olarak isim, değer olarak Student yapısı)
// TODO: Öğrenci verilerini ayrıştırın ve map'i doldurun
// TODO: Tüm öğrencileri isme göre alfabetik sırayla görüntüleyin
// TODO: Not istatistiklerini hesaplayın ve görüntüleyin
// TODO: En yüksek ID'ye sahip öğrenciyi bulun ve görüntüleyin
// TODO: Toplam öğrenci sayısını görüntüleyin
}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