GoDasturchi
Record Validator

Record Validator

Yozuvni tekshiruvchi

Hozirgacha barcha yozuvlaringiz to'g'ri va to'liq edi — siz ularni o'zingiz, qo'lda yozgansiz. Lekin haqiqiy resolver yozuvlarni tashqi manbadan oladi: zona fayli, boshqa server, yoki tarmoq orqali kelgan javob. Ularga ishonib bo'lmaydi. Keshga solishdan oldin, har bir yozuvni tekshirish (validate) kerak.

Nima noto'g'ri bo'lishi mumkin? Nomi bo'sh bo'lishi mumkin. Turi hech qanday DNS tuiga mos kelmasligi mumkin ("PTR2" kabi xato yozilgan). Qiymati bo'sh bo'lishi mumkin. TTL manfiy yoki nolga teng bo'lishi mumkin — bu esa yozuvni bir zumda eskirgan qilib qo'yadi.

Errors Are Values darsida o'rgangan andazani eslang: muvaffaqiyatsizlikni bildirish uchun error qaytaring, muvaffaqiyat uchun nil. Bu yerda ham xuddi shu andaza ishlaydi — faqat endi tekshiruv bir nechta shartdan iborat, va ular tartib bilan, birinchi topilgan muammoda to'xtab, tekshiriladi.

Turni tekshirish uchun, ruxsat etilgan turlar ro'yxatini yozib, unda borligini tekshirasiz. Buni qo'lda || zanjiri bilan ham qilish mumkin, lekin Go 1.21+dagi slices paketi buni bitta chaqiruvga jamlaydi:

example.go
import "slices"

validTypes := []string{"A", "AAAA", "CNAME", "MX", "TXT"}
slices.Contains(validTypes, "A")   // true
slices.Contains(validTypes, "PTR") // false

slices.Contains(s, v) slice ichida vga teng element bor-yo'qligini tekshiradi va bool qaytaradi — bu Filter Like a Pro darsida ko'rgan slices.DeleteFuncning yaqin qarindoshi.

>_ Exercise

Topilgan birinchi muammoni tavsiflovchi xato, yoki yozuv to'g'ri bo'lsa nil qaytaradigan ValidateRecord(r DNSRecord) error funksiyasini yozing.

Qoidalarni shu tartibda tekshiring:

  • r.Name bo'sh bo'lsa — errors.New("name is required") qaytaring
  • r.Type "A", "AAAA", "CNAME", "MX", "TXT"dan biri bo'lmasa — fmt.Errorf("unsupported record type: %s", r.Type) qaytaring
  • r.Value bo'sh bo'lsa — errors.New("value is required") qaytaring
  • r.TTL 0 yoki undan kichik bo'lsa — errors.New("ttl must be positive") qaytaring
  • Yuqoridagilarning hech biri bo'lmasa — nil qaytaring

Misollar:

  • ValidateRecord(DNSRecord{Name: "example.com", Type: "A", Value: "93.184.216.34", TTL: 3600})nil
  • ValidateRecord(DNSRecord{Name: "", Type: "A", Value: "1.2.3.4", TTL: 60})"name is required"
  • ValidateRecord(DNSRecord{Name: "example.com", Type: "PTR", Value: "x", TTL: 60})"unsupported record type: PTR"

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Tashqaridan kelgan ma'lumotni ishonch bilan qabul qilmang — uni ishlatishdan oldin tekshiring. Bir nechta shartni tartib bilan tekshirib, birinchi topilgan muammoda error qaytaring; slices.Contains ruxsat etilgan qiymatlar ro'yxatiga tekshirishni bitta chaqiruvga jamlaydi.

NEXT UP

Cycle Detection

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Record Validator

Yozuvni tekshiruvchi

Hozirgacha barcha yozuvlaringiz to'g'ri va to'liq edi — siz ularni o'zingiz, qo'lda yozgansiz. Lekin haqiqiy resolver yozuvlarni tashqi manbadan oladi: zona fayli, boshqa server, yoki tarmoq orqali kelgan javob. Ularga ishonib bo'lmaydi. Keshga solishdan oldin, har bir yozuvni tekshirish (validate) kerak.

Nima noto'g'ri bo'lishi mumkin? Nomi bo'sh bo'lishi mumkin. Turi hech qanday DNS tuiga mos kelmasligi mumkin ("PTR2" kabi xato yozilgan). Qiymati bo'sh bo'lishi mumkin. TTL manfiy yoki nolga teng bo'lishi mumkin — bu esa yozuvni bir zumda eskirgan qilib qo'yadi.

Errors Are Values darsida o'rgangan andazani eslang: muvaffaqiyatsizlikni bildirish uchun error qaytaring, muvaffaqiyat uchun nil. Bu yerda ham xuddi shu andaza ishlaydi — faqat endi tekshiruv bir nechta shartdan iborat, va ular tartib bilan, birinchi topilgan muammoda to'xtab, tekshiriladi.

Turni tekshirish uchun, ruxsat etilgan turlar ro'yxatini yozib, unda borligini tekshirasiz. Buni qo'lda || zanjiri bilan ham qilish mumkin, lekin Go 1.21+dagi slices paketi buni bitta chaqiruvga jamlaydi:

example.go
import "slices"

validTypes := []string{"A", "AAAA", "CNAME", "MX", "TXT"}
slices.Contains(validTypes, "A")   // true
slices.Contains(validTypes, "PTR") // false

slices.Contains(s, v) slice ichida vga teng element bor-yo'qligini tekshiradi va bool qaytaradi — bu Filter Like a Pro darsida ko'rgan slices.DeleteFuncning yaqin qarindoshi.

>_ Exercise

Topilgan birinchi muammoni tavsiflovchi xato, yoki yozuv to'g'ri bo'lsa nil qaytaradigan ValidateRecord(r DNSRecord) error funksiyasini yozing.

Qoidalarni shu tartibda tekshiring:

  • r.Name bo'sh bo'lsa — errors.New("name is required") qaytaring
  • r.Type "A", "AAAA", "CNAME", "MX", "TXT"dan biri bo'lmasa — fmt.Errorf("unsupported record type: %s", r.Type) qaytaring
  • r.Value bo'sh bo'lsa — errors.New("value is required") qaytaring
  • r.TTL 0 yoki undan kichik bo'lsa — errors.New("ttl must be positive") qaytaring
  • Yuqoridagilarning hech biri bo'lmasa — nil qaytaring

Misollar:

  • ValidateRecord(DNSRecord{Name: "example.com", Type: "A", Value: "93.184.216.34", TTL: 3600})nil
  • ValidateRecord(DNSRecord{Name: "", Type: "A", Value: "1.2.3.4", TTL: 60})"name is required"
  • ValidateRecord(DNSRecord{Name: "example.com", Type: "PTR", Value: "x", TTL: 60})"unsupported record type: PTR"

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Tashqaridan kelgan ma'lumotni ishonch bilan qabul qilmang — uni ishlatishdan oldin tekshiring. Bir nechta shartni tartib bilan tekshirib, birinchi topilgan muammoda error qaytaring; slices.Contains ruxsat etilgan qiymatlar ro'yxatiga tekshirishni bitta chaqiruvga jamlaydi.

NEXT UP

Cycle Detection