Skip to content

Interface

Interface metodlar to'plamini belgilovchi abstrakt tur. U ma'lum metodlarga ega bo'lgan har qanday tur (struct, custom type va hokazo) uchun umumiy xatti-harakatni belgilab beradi.

Interface yordamida polimorfizm amalga oshiriladi, ya'ni turli structlar bitta interface ni implement qilishi mumkin.

Polimorfizm nima?

Polimorfizm — bir xil narsa turli shakllarda ishlashi. Tasavur qiling farzandingiz bor deylik. Unga O'tir! desangiz, u kursiga o'tiradi. Lekin agar O'tir! buyru'ini itga aytsangiz, u yerga o'tiradi.

Bir xil buyruq (O'tir!), lekin har xil harakat. Bu polimorfizm!

Go da polimorfizm interface lar orqali amalga oshiriladi.

Masalan, transport vositalarini tasavvur qiling:

  • Mashina yuradi
  • Velosiped yuradi
  • Samolyot uchad

Ularning barchasini harakat deb nomlashimiz mumkin.

Interface e'lon qilish

1
2
3
4
5
6
7
package main

type Transport interface {}

func main() {

}

Info

Interface ham struct kabi yangi tur hisoblanadi. Ammo u structdan farqli ravishda hech qanday ma'lumot saqlamaydi.

Struct va Interface farqi

Xususiyat Struct Interface
Yangi tur yaratish ✅ Ha ✅ Ha
Maydonlarga ega bo'lish ✅ Ha ❌ Yo'q
Metodlarni o'z ichiga olishi ❌ Yo'q ✅ Ha(qanday metodlar bo'lishi kerakligini belgilaydi)
Ma’lumot saqlashi ✅ Ha ❌ Yo'q
Turli struct lar uchun umumiy foydalanish ❌ Yo'q ✅ Ha
Polimorfizm bilan ishlaydi ❌ Yo'q ✅ Ha

Interfacega method qo'shish

1
2
3
4
5
6
7
8
9
package main

type Transport interface {
    Harakat()
}

func main() {

}

Agar biz transport vositalarini tasavvur qiladigan bo'lsak barcha transport vositalari uchun Transport interface mos keladi chunki barchasida harakat xususiyati bor.

  • Mashina yuradi
  • Velosiped yuradi
  • Samolyot uchad

Quyida yuqoridagi interface dan foydalanishni ko'ramiz.

package main

import "fmt"

type Transport interface {
    Harakat()
}

type Mashina struct {}
type Velosiped struct{}
type Samalyot struct{}

func (m Mashina) Harakat() {
    fmt.Println("Mashina yurmoqda...")
}

func (v Velosiped) Harakat() {
    fmt.Println("Velosiped yurmoqda...")
}

func (v Samalyot) Harakat() {
    fmt.Println("Samalyot uchmoqda...")
}

func HarakatniBoshlash(t Transport) {
    t.Harakat()
}

func main() {
    mashina := Mashina{}
    velosiped := Velosiped{}
    samalyot := Samalyot{}

    HarakatniBoshlash(mashina)
    HarakatniBoshlash(velosiped)
    HarakatniBoshlash(samalyot)

}

Natija:

Mashina yurmoqda...
Velosiped yurmoqda...
Samalyot uchmoqda...

Info

Agar interfaceda e'lon qilingan method biror structda mavjud bo'lsa, demak usha struct shu interfacega tegishli bo'ladi.

Yuqoridagi misolni quyidagicha izohlash mumkin:

  • Transport — bu interfeys, ya’ni har qanday harakatlanadigan narsalar uchun umumiy qoidalarni belgilaydi.
  • Mashina, Velosiped, Samolyot — bu turli vositalar (struct) va ularning barchasi Transport interfeysini qabul qiladi.
  • Harakat() metodi — bu interfeys talab qilgan metod bo'lib, har bir transport turida u har xil ishlaydi.
  • HarakatniBoshlash() funksiyasi interfeysga bog'langan. Ya’ni, unga istalgan transport yuborilsa, u shu transportning Harakat() metodini chaqiradi.

Transport interfeysi – bu yo'lda harakat qilish degan qoida. Lekin qanday harakat qilishini har bir transport turi(struct) o'zi aniqlaydi:

  • Interfeys — bu qanday ish bajarilishiemas, balki qanday metod bo'lishi kerakligini belgilaydi.
  • Struct lar esa metodni qanday harakat qilishini belgilab beradi.

Xulosa

Interfeys — bu Go tilida bir nechta tur (struct) uchun umumiy metodlarni belgilab beruvchi tuzilma. U qanday metodlar mavjud bo'lishi kerakligini ko'rsatadi, lekin ularning qanday ishlashini belgilab bermaydi. Struct lar esa metodni qanday ishlashini belgilab beradi.