Record Lookup

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.

example.go
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.

example.go
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, nil qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

example.go
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, nil qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

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