Record Lookup
Yozuvni qidirish
Haqiqiy resolver bitta emas, minglab yozuvlarni ushlab turadi. Ular oddiy []DNSRecord sifatida saqlanadi, va resolverning asosiy vazifasi — so'ralgan nomga mos yozuvni o'sha slice ichidan topib berish.
records := []DNSRecord{
{Name: "example.com", Type: "A", Value: "93.184.216.34", TTL: 3600},
{Name: "example.com", Type: "MX", Value: "mail.example.com", TTL: 7200},
{Name: "www.example.com", Type: "CNAME", Value: "example.com", TTL: 300},
}E'tibor bering: example.com uchun ikkita yozuv bor — biri A, biri MX. Shuning uchun qidiruv faqat nom bo'yicha emas, nom va tur bo'yicha bo'lishi kerak. Aks holda qaysi yozuvni qaytarish kerakligi noaniq bo'lib qoladi.
Bu — Pointers & Memory kursidagi Find or Nil andazasining o'zi: slice bo'ylab indeks orqali yuring, mos kelgan elementning manziliga &records[i] bilan pointer qaytaring, hech narsa topilmasa nil qaytaring.
func LookupRecord(records []DNSRecord, name, recordType string) *DNSRecord {
for i := range records {
if records[i].Name == name && records[i].Type == recordType {
return &records[i]
}
}
return nil
}*DNSRecord qaytarish, (DNSRecord, bool) emas, buni tanlashning sababi bor: keyingi darslarda kesh yozuvni topgach uni joyida yangilashi (masalan TTL'ni kamaytirish) kerak bo'ladi, va bu faqat haqiqiy elementga ishora qiluvchi pointer bilan mumkin.
>_ Exercise
Name va Type ikkalasi ham mos kelgan birinchi yozuvga pointer, yoki hech narsa topilmasa nil qaytaradigan LookupRecord(records []DNSRecord, name, recordType string) *DNSRecord funksiyasini yozing.
Misollar:
- •
LookupRecord(records, "example.com", "A")—Value: "93.184.216.34"bo'lgan yozuvga pointer qaytaradi - •
LookupRecord(records, "example.com", "MX")—Value: "mail.example.com"bo'lgan yozuvga pointer qaytaradi - •
LookupRecord(records, "example.com", "AAAA")— bunday yozuv yo'q,nilqaytaradi
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Bir nechta mezon bo'yicha qidirishda barcha shartlarni && bilan birlashtiring. Topilgan elementni keyinroq o'zgartirish kerak bo'lsa, (T, bool) o'rniga *T qaytaring.
NEXT UP
DNS Cache
$ go run main.go
Kodingizni ishga tushiring