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:
import "slices"
validTypes := []string{"A", "AAAA", "CNAME", "MX", "TXT"}
slices.Contains(validTypes, "A") // true
slices.Contains(validTypes, "PTR") // falseslices.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.Namebo'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.Valuebo'sh bo'lsa —errors.New("value is required")qaytaring - •
r.TTL0yoki undan kichik bo'lsa —errors.New("ttl must be positive")qaytaring - •Yuqoridagilarning hech biri bo'lmasa —
nilqaytaring
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.
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
$ go run main.go
Kodingizni ishga tushiring