Interfeyslar
Interfeys (interface) — bu metodlar ro’yxati. U turdan nima qilinishi kerakligini aytadi, qanday qilinishini emas. Go’da implementatsiya yashirin bo’ladi: implements degan kalit so’z yo’q — tur interfeysdagi metodlarni yozsa bo’lgani, u avtomatik shu interfeysni qondiradi.
package main
import (
"fmt"
"math"
)
type Shape interface {
Area() float64
}
type Rectangle struct{ W, H float64 }
type Circle struct{ R float64 }
func (r Rectangle) Area() float64 { return r.W * r.H }
func (c Circle) Area() float64 { return math.Pi * c.R * c.R }
func main() {
// turli turlarni bitta slice ichida saqlaymiz
shapes := []Shape{Rectangle{3, 4}, Circle{5}}
for _, s := range shapes {
fmt.Printf("Yuza: %.2f\n", s.Area())
}
}$ go run interface.go
Yuza: 12.00
Yuza: 78.54Xulosa: Rectangle ham, Circle ham hech qayerda “men Shapeman” deb aytmadi — shunchaki Area()ni yozib qo’ydi, tamom, interfeys qondi.
Metodi yo’q interfeys — bu bo’sh interfeys, uni istalgan qiymat qondiradi. Uning qulay taxallusi (alias) — any. fmt esa maxsus Stringer interfeysini taniydi: tur String() string yozsa, chop etilganda o’sha o’zi chaqiriladi.
package main
import "fmt"
type Point struct{ X, Y int }
func (p Point) String() string {
return fmt.Sprintf("(%d, %d)", p.X, p.Y)
}
func main() {
var v any = Point{3, 7} // any = bo'sh interface
fmt.Println(v) // Stringer.String() chaqiriladi
fmt.Printf("tur: %T\n", v)
}$ go run stringer-any.go
(3, 7)
tur: main.PointXulosa: any istalgan qiymatni qabul qiladi, String() esa obyektni chiroyli ko’rinishda chiqarishning standart yo’li (bo’lmaganida {3 7} chiqardi).
Manba / batafsil: Go spec — Interface types , fmt.Stringer