Interfejsi është një set metodash. Një interfejs përshkruan sjelljen (behaviour) e një tipi.
Nëse interfejsi nuk e definon asnjë metodë, atëherë ai është interfejs i zbrazët. Të gjitha tipet e implementojnë interfejsin e zbrazët.
Në Go nuk kemi deklarim eksplicit të interfejsit me implements
, siç e kemi në gjuhët tjera. Cilido tip i të dhënave (p.sh. strukt), që është pranues (receiver) i metodave të definuara në një interfejs, në mënyrë implicite e implementon atë interfejs.
package main
import (
"fmt"
"math"
)
type FormaGjeometrike interface {
Siperfaqja() float32
}
type Katerkendeshi struct {
Gjeresia float32
Gjatesia float32
}
func (k Katerkendeshi) Siperfaqja() float32 {
return k.Gjeresia * k.Gjatesia
}
func (r Rrethi) Siperfaqja() float32 {
return math.Pi * r.Rrezja * r.Rrezja
}
func Matja(fgj FormaGjeometrike) float32 {
return fgj.Siperfaqja()
}
type Rrethi struct {
Rrezja float32
}
func main() {
r := Rrethi{5}
fmt.Println("Siperfaqja e rrethit: ")
fmt.Println(Matja(r))
k := Katerkendeshi{5, 2}
fmt.Println("Siperfaqja e katerkendeshit: ")
fmt.Println(Matja(k))
}
https://play.golang.org/p/OMrS3VIfpHc
Rezultati:
Siperfaqja e rrethit:
78.53982
Siperfaqja e katerkendeshit:
10
package main
import (
"fmt"
)
type Person interface {
Pershendetje() string
}
type Student struct {
Emri string
Mbiemri string
Mosha int
NotaMesatare float32
}
type Punetor struct {
Emri string
Mbiemri string
Mosha int
Paga float32
}
func (st Student) Pershendetje() string {
return "Mirëmëngjes, " + st.Emri
}
func (pn Punetor) Pershendetje() string {
return "Punë të mbarë, " + pn.Emri
}
// Pranon tipet Student dhe Punetor,
// sepse te dyja e implementojne interfejsin Person
func TeDhenat(p Person) string {
rez := ""
switch p.(type) {
case Student:
rez = p.(Student).Emri + " " + p.(Student).Mbiemri + ", student, nota mesatare " + fmt.Sprintf("%.2f", p.(Student).NotaMesatare)
case Punetor:
rez = p.(Punetor).Emri + " " + p.(Punetor).Mbiemri + ", punëtor, paga " + fmt.Sprintf("%.2f", p.(Punetor).Paga) + " EURO"
}
return rez
}
func main() {
// STUDENTI
var a = Student{
Emri: "Taulant",
Mbiemri: "Berisha",
Mosha: 19,
NotaMesatare: 8.9,
}
// PUNËTORI
fmt.Println(a.Pershendetje())
fmt.Println(TeDhenat(a))
var b = Punetor{
Emri: "Durim",
Mbiemri: "Krasniqi",
Mosha: 28,
Paga: 1000,
}
fmt.Println(b.Pershendetje())
fmt.Println(TeDhenat(b))
}
https://play.golang.org/p/XOdPtP4pYU4
Rezultati:
Mirëmëngjes, Taulant
Taulant Berisha, student, nota mesatare 8.90
Punë të mbarë, Durim
Durim Krasniqi, punëtor, paga 1000.00 EURO
Variablat a dhe b mund t’i deklarojmë të tipit Person, me çka a bëhet variabël e tipit Student që implementon interfejsin Person, ndërsa b bëhet variabël e tipit Punetor që implementon po atë interfejs. Mirëpo, ky nuk është implementim eksplicit i interfejsit, sepse interfejsi konsiderohet i implementuar nëse një tip (në këtë rast struct) posedon metodat që janë listuar në interfejs.
Nëse tipi, në këtë rast strukti, nuk i posedon TË GJITHA metodat e cekura në interfejs dhe me po të njëjtat nënshkrime të funksioneve (function signature), pra numrin dhe tipin e argumenteve dhe të rezultateve kthyese, atëherë nuk është duke e implementuar atë interfejs.
// STUDENTI
var a Person = Student{
Emri: "Taulant",
Mbiemri: "Berisha",
Mosha: 19,
NotaMesatare: 8.9,
}
// PUNËTORI
var b Person = Punetor{
Emri: "Durim",
Mbiemri: "Krasniqi",
Mosha: 28,
Paga: 1000,
}