Tarkibga o'tish

3. Struct va metodlar

Struct — maydonlar to'plami; metod — qabul qiluvchisi (receiver) bor funksiya. Masalalarda qiymat (func (p Point)) va ko'rsatkich (func (p *Point)) qabul qiluvchilar farqiga alohida e'tibor bering.

Struct asoslari

1. Point{X, Y float64} struct'ini e'lon qiling. Uni turli usullarda yarating: nomlangan maydonlar bilan, pozitsion, nol qiymat bilan va &Point{} orqali. Har birini %v, %+v va %#v formatlarida chiqaring.
Misol: Point{X: 1, Y: 2} → %v: {1 2}, %+v: {X:1 Y:2}, %#v: main.Point{X:1, Y:2}; &Point{} → &{0 0}

2. Struct'ni boshqa o'zgaruvchiga o'zlashtirib, nusxani o'zgartiring va asl struct o'zgarmaganini ko'rsating. Struct ichida slice maydoni bo'lganda nima bo'lishini ham tekshiring.
Misol: a := Point{1, 2}; b := a; b.X = 9 → a = {1 2}, b = {9 2}; slice maydonli struct nusxasida slice elementi o'zgarsa, asl struct ham o'zgaradi

3. Ikki Point ni == bilan solishtiring. So'ng struct'ga []int maydon qo'shib, nega solishtirish kompilyatsiya xatosi berishini izohlang.
Misol: Point{1, 2} == Point{1, 2} → true; []int maydonli struct'larni == bilan solishtirish kompilyatsiya xatosi beradi

4. Anonim struct yordamida jadvalga asoslangan testlar uchun ma'lumotlar ro'yxatini tuzing: []struct{ in, want int }.
Misol: tests := []struct{ in, want int }{{1, 2}, {2, 4}} → for _, tc := range tests ichida tc.in = 2 uchun tc.want = 4

5. NewRectangle(w, h float64) (*Rectangle, error) konstruktor funksiyasini yozing: manfiy yoki nol o'lchamlarda xato qaytarsin.
Misol: NewRectangle(3, 4) → &{3 4} <nil>; NewRectangle(-1, 4) → <nil> va xato

Metodlar

6. Rectangle uchun Area() va Perimeter() metodlarini qiymat qabul qiluvchi bilan, Scale(k float64) metodini ko'rsatkich qabul qiluvchi bilan yozing. Scale ni qiymat qabul qiluvchi bilan yozsangiz nima bo'lishini ko'rsating.
Misol: Rectangle{3, 4}: Area() → 12, Perimeter() → 14; Scale(2) (ko'rsatkich) → {6 8}; qiymat qabul qiluvchi bilan → {3 4} (o'zgarmaydi)

7. Counter struct'i uchun Inc(), Reset() va Value() metodlarini yozing. Qaysi metodlar ko'rsatkich qabul qiluvchi bo'lishi shartligini asoslang.
Misol: Inc(), Inc(), Value() → 2; Reset() dan keyin Value() → 0

8. BankAccount struct'ini yarating (egasi, balans). Deposit, Withdraw (mablag' yetmasa xato qaytarsin) va Transfer(to *BankAccount, sum) metodlarini yozing.
Misol: Ali balansi 100: Deposit(50) → 150; Withdraw(200) → xato (mablag' yetmaydi); Transfer(vali, 100) → Ali 50, Vali +100

9. Fraction (surat, maxraj) turi uchun Add, Mul, Simplify va String() metodlarini yozing; String() natijasi fmt.Println da avtomatik ishlatilishini ko'rsating.
Misol: 1/2 + 1/3 → 5/6; 1/2 · 2/3 → 2/6, Simplify() dan keyin 1/3

10. Matrix turi ([][]float64 asosida) uchun Mul, Transpose va String metodlarini yozing; o'lchamlar mos kelmaganda xato qaytarilsin.
Misol: [[1 2] [3 4]] · [[5 6] [7 8]] → [[19 22] [43 50]]; Transpose → [[1 3] [2 4]]; 2×3 va 2×3 ko'paytmasi → xato

11. Metod qiymati (f := p.Distance) va metod ifodasi (g := Point.Distance) ni yarating va ularni chaqirib, farqini ko'rsating.
Misol: p := Point{3, 4}, f := p.Distance, g := Point.Distance → f() → 5, g(p) → 5

12. type Celsius float64 va type Fahrenheit float64 turlarini e'lon qiling, ular orasida o'girish metodlarini yozing. Nega Celsius va Fahrenheit qiymatlarini to'g'ridan-to'g'ri qo'shib bo'lmasligini ko'rsating.
Misol: Celsius(100) → Fahrenheit(212); Celsius(1) + Fahrenheit(1) — kompilyatsiya xatosi (turlar mos emas)

Kompozitsiya (embedding)

13. Person{Name, Age} va unga ichki joylashtirilgan (embedded) Employee{Person; Salary} struct'larini yarating. Employee orqali Person maydonlari va metodlariga to'g'ridan-to'g'ri murojaat qilishni ko'rsating.
Misol: Employee{Person{"Ali", 30}, 5000000}: e.Name → Ali, e.Person.Name → Ali

14. Ichki joylashtirilgan struct va tashqi struct'da bir xil nomli metod bo'lganda qaysi biri chaqirilishini (soyalash) ko'rsating va ichki metodni aniq chaqiring.
Misol: ichki Person.Hello() → Salom, Ali, tashqi Employee.Hello() → Salom, xodim Ali; e.Hello() tashqini, e.Person.Hello() ichkini chaqiradi

15. strings.Builder ni ichki joylashtirilgan maydon sifatida ishlatuvchi HTMLWriter turini yarating: Tag(name, text string) metodi <name>text</name> ni yozsin, WriteString va String metodlari esa to'g'ridan-to'g'ri strings.Builder dan olinsin.
Misol: Tag("b", "salom") → <b>salom</b>; WriteString("!") dan keyin String() → <b>salom</b>!

16. Logger struct'ini boshqa struct'larga ichki joylashtirib, ularning har biriga log yozish imkoniyatini qo'shing.
Misol: type Service struct{ Logger }: s.Log("start") → [log] start

Teglar, nol qiymat va amaliy masalalar

17. Struct maydonlariga json:"name,omitempty" teglarini qo'shing va reflect yordamida har bir maydonning nomi va tegini chiqaring.
Misol: Name string `json:"name,omitempty"` → Name: json:"name,omitempty"

18. Nol qiymati darhol ishlatishga yaroqli bo'lgan tur yarating (masalan, bytes.Buffer kabi): var s Stack e'lon qilingandan keyin konstruktorsiz ishlasin.
Misol: var s Stack; s.Push(1); s.Push(2); s.Pop() → 2

19. Bog'langan ro'yxatni Node{Val int; Next *Node} va List{head *Node; size int} struct'lari bilan amalga oshiring: PushFront, PushBack, Remove, String metodlari bilan.
Misol: PushBack(1), PushBack(2), PushFront(0) → 0 → 1 → 2; Remove(1) → 0 → 2

20. Ikkilik qidiruv daraxtini struct va metodlar bilan amalga oshiring: Insert, Contains, Min, Max, InOrder(func(int)).
Misol: Insert 5 3 8: InOrder → 3 5 8; Contains(3) → true; Min() → 3; Max() → 8

21. Date turi (yil, oy, kun) uchun AddDays, Before, DaysBetween va Weekday metodlarini time paketidan foydalanmasdan yozing, so'ng natijalarni time paketi bilan tekshiring.
Misol: Date{2024, 2, 28}.AddDays(2) → 2024-03-01; DaysBetween(2024-01-01, 2024-03-01) → 60; Weekday(2024-03-01) → Friday

22. «Kutubxona» modeli: Book, Member va Library struct'lari; Borrow, Return va Overdue(today) metodlari bilan.
Misol: Borrow(kitob1, Ali) → muvaffaqiyatli; qaytarish muddati o'tgan kitoblar Overdue(today) → [kitob1]

23. «Savat» modeli: Product, CartItem, Cart struct'lari; Add, Remove, Total va chegirma qo'llovchi ApplyDiscount(percent) metodlari bilan.
Misol: Add(Non, 2) (4000), Add(Sut, 1) (9000) → Total() → 17000; ApplyDiscount(10) → 15300

24. Funksional variantlar (functional options) naqshi: NewServer(addr string, opts ...Option) konstruktorini WithTimeout, WithMaxConn kabi variantlar bilan yozing.
Misol: NewServer("localhost:8080", WithTimeout(5*time.Second), WithMaxConn(100)) → {addr:localhost:8080 timeout:5s maxConn:100}

25. Zanjirli (fluent) quruvchi: NewQuery().Select("name").From("users").Where("age > 18").Build() ko'rinishida SQL satr yig'uvchi tur yozing.
Misol: NewQuery().Select("name").From("users").Where("age > 18").Build() → SELECT name FROM users WHERE age > 18