Data Transformer

Data Transformer

Ma'lumot o'zgartiruvchisi

ParseYAML sizga map[string]string beradi — har bir qiymat, hatto son bo'lsa ham, xom matn holida. map[string]string{"price": "999.99"} bilan matematik amal bajarib bo'lmaydi. Pipeline'ning keyingi bosqichi — transformatsiya: xom qatorlarni to'g'ri turlarga ega, ishlatishga tayyor struct'larga aylantirish.

example.go
type Product struct {
	Name     string
	Price    float64
	Category string
}

Name va Category to'g'ridan-to'g'ri ko'chiriladi — ular allaqachon satr. Price esa Multiple Return Values darsida ko'rgan strconv.Atoining qarindoshini talab qiladi: kasr sonlar uchun strconv.ParseFloat.

example.go
price, err := strconv.ParseFloat(row["price"], 64)

Ikkinchi argument (64) natijaning bit kengligini bildiradi — deyarli har doim float64 kerak bo'ladi. Agar satr to'g'ri son bo'lmasa (masalan, kimdir "N/A" deb yozib qo'ygan bo'lsa), err nil bo'lmaydi, va siz buni Errors Are Values darsidagi andaza bilan boshqarasiz: xatoni tavsiflab, uni chaqiruvchiga yuqoriga uzatasiz.

example.go
if err != nil {
	return Product{}, fmt.Errorf("invalid price %q: %v", row["price"], err)
}

%q qiymatni qo'shtirnoqqa oladi ("N/A"), shuning uchun xato xabarida qiymat qayerda tugab, qolgan matn qayerdan boshlanganini aniq ko'rasiz. %v esa strconv.ParseFloatning o'z xatosini o'zgarishsiz ichiga qo'shadi — bu qo'shimcha kontekst, asl sababni yashirmaydi.

Butun to'plamni o'zgartirish uchun, har bir qator ustida sikl yuritasiz va birinchi xatoda to'xtaysiz — Zone Transfer darsida ko'rgan "birinchi muammoda qaytish" g'oyasi endi butun sikl darajasida qo'llaniladi.

>_ Exercise

Name string, Price float64, va Category string maydonlariga ega Product struct'ini aniqlang.

Bitta xom qatorni Productga aylantiradigan TransformRow(row map[string]string) (Product, error) funksiyasini yozing. price maydonini strconv.ParseFloat bilan o'giring; agar bu muvaffaqiyatsiz bo'lsa, fmt.Errorf("invalid price %q: %v", row["price"], err) qaytaring.

Butun slice ustida TransformRowni chaqiradigan TransformRows(rows []map[string]string) ([]Product, error) funksiyasini yozing. Birinchi xatoda darhol nil slice va o'sha xatoni qaytaring.

Misollar:

  • TransformRow(map[string]string{"name": "laptop", "price": "999.99", "category": "electronics"}) Product{Name: "laptop", Price: 999.99, Category: "electronics"}, nil qaytaradi
  • TransformRow(map[string]string{"name": "bad", "price": "N/A", "category": "x"}) bo'sh Product va "invalid price \"N/A\": ..." bilan boshlanadigan xato qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Xom map[string]stringni to'g'ri turlarga ega structga aylantirish — bu odatiy "transformatsiya" bosqichi. strconv.ParseFloat kabi konvertatsiyalar muvaffaqiyatsiz bo'lishi mumkin, shuning uchun xatoni yuqoriga, kontekst bilan birga (%q, %v) uzating.

NEXT UP

Aggregator: Grouping

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Data Transformer

Ma'lumot o'zgartiruvchisi

ParseYAML sizga map[string]string beradi — har bir qiymat, hatto son bo'lsa ham, xom matn holida. map[string]string{"price": "999.99"} bilan matematik amal bajarib bo'lmaydi. Pipeline'ning keyingi bosqichi — transformatsiya: xom qatorlarni to'g'ri turlarga ega, ishlatishga tayyor struct'larga aylantirish.

example.go
type Product struct {
	Name     string
	Price    float64
	Category string
}

Name va Category to'g'ridan-to'g'ri ko'chiriladi — ular allaqachon satr. Price esa Multiple Return Values darsida ko'rgan strconv.Atoining qarindoshini talab qiladi: kasr sonlar uchun strconv.ParseFloat.

example.go
price, err := strconv.ParseFloat(row["price"], 64)

Ikkinchi argument (64) natijaning bit kengligini bildiradi — deyarli har doim float64 kerak bo'ladi. Agar satr to'g'ri son bo'lmasa (masalan, kimdir "N/A" deb yozib qo'ygan bo'lsa), err nil bo'lmaydi, va siz buni Errors Are Values darsidagi andaza bilan boshqarasiz: xatoni tavsiflab, uni chaqiruvchiga yuqoriga uzatasiz.

example.go
if err != nil {
	return Product{}, fmt.Errorf("invalid price %q: %v", row["price"], err)
}

%q qiymatni qo'shtirnoqqa oladi ("N/A"), shuning uchun xato xabarida qiymat qayerda tugab, qolgan matn qayerdan boshlanganini aniq ko'rasiz. %v esa strconv.ParseFloatning o'z xatosini o'zgarishsiz ichiga qo'shadi — bu qo'shimcha kontekst, asl sababni yashirmaydi.

Butun to'plamni o'zgartirish uchun, har bir qator ustida sikl yuritasiz va birinchi xatoda to'xtaysiz — Zone Transfer darsida ko'rgan "birinchi muammoda qaytish" g'oyasi endi butun sikl darajasida qo'llaniladi.

>_ Exercise

Name string, Price float64, va Category string maydonlariga ega Product struct'ini aniqlang.

Bitta xom qatorni Productga aylantiradigan TransformRow(row map[string]string) (Product, error) funksiyasini yozing. price maydonini strconv.ParseFloat bilan o'giring; agar bu muvaffaqiyatsiz bo'lsa, fmt.Errorf("invalid price %q: %v", row["price"], err) qaytaring.

Butun slice ustida TransformRowni chaqiradigan TransformRows(rows []map[string]string) ([]Product, error) funksiyasini yozing. Birinchi xatoda darhol nil slice va o'sha xatoni qaytaring.

Misollar:

  • TransformRow(map[string]string{"name": "laptop", "price": "999.99", "category": "electronics"}) Product{Name: "laptop", Price: 999.99, Category: "electronics"}, nil qaytaradi
  • TransformRow(map[string]string{"name": "bad", "price": "N/A", "category": "x"}) bo'sh Product va "invalid price \"N/A\": ..." bilan boshlanadigan xato qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/4)

Key Takeaway

Key Takeaway:

Xom map[string]stringni to'g'ri turlarga ega structga aylantirish — bu odatiy "transformatsiya" bosqichi. strconv.ParseFloat kabi konvertatsiyalar muvaffaqiyatsiz bo'lishi mumkin, shuning uchun xatoni yuqoriga, kontekst bilan birga (%q, %v) uzating.

NEXT UP

Aggregator: Grouping