Strukti është një tip i definuar (user-defined type) që përmban koleksion të fushave të emërtuara. Përdoret për grupimin e të dhënave brenda një njësie të vetme. Për shembull, një strukt mund të përmbajë të dhëna mbi një libër: titulli, autori, numri ISBN, numri i faqeve, etj.
type Libri struct {
Titulli string
Autori string
ISBN string
Faqe int
}
Me fjalën kyçe type
e krijojmë një tip të ri të të dhënave; në vijim e shënojmë emrin për tipin e ri që në këtë rast është Libri, ndërsa në fund shënojmë struct
për të treguar se jemi duke definuar një strukt.
Mund ta rishkruajmë edhe duke i grupuar fushat që i përkasinë tipit të njëjtë:
type Libri struct {
Titulli, Autori, ISBN string
Faqe int
}
Deklarimi dhe inicializimi i struktit
Deklarimi i një variable të tipit struct
Deklarimi i variablit bëhet sikurse edhe me tipet e tjera:
var lb Libri
Në kodin e mësipërm kemi deklaruar një variabël lb
të jetë e tipit Libri, duke mos e inicializuar. Në këtë rast, të gjitha fushat e struktit Libri (Titulli, Autori, ISBN dhe Faqe) marrin vlerat iniciale sipas tipit:
- Fushat e tipeve numerike marrin vlerën zero (0)
- Fushat e tipit string marrin vlerën e stringut bosh (“”)
- Fushat e tipit boolean marrin vlerën
false
Një strukt mund ta deklarojmë dhe inicializojmë në mënyrën vijuese:
var lb = Libri{"Origjina", "Dan Brown", "9789994305353", 616}
Duhet të kemi parasysh që renditja e vlerave të korrespondojë me renditjen e fushave të struktit.
Në këtë formëm, duhet të jenë prezente vlerat për të gjitha fushat, pra nuk mund të përdorim:
var lb = Libri{"Origjina"}
Në këtë rast, lajmërohet gabimi too few values in Libri literal
.
Cekja e fushave gjatë inicializimit të struktit
Për inicializim, mund ta përdorim fomën fusha:vlera
, me ç’rast renditja e fushave nuk luan rol.
var lb = Libri{Autori: "Dan Brown", Titulli: "Origjina", Faqe: 616, ISBN: "9789994305353"}
Për ta bërë struktin më të lexueshëm, mund të shkruajmë edhe në formën vijuese:
var lb = Libri{Autori: "Dan Brown",
Titulli: "Origjina",
Faqe: 616,
ISBN: "9789994305353",
}
Nëse e përdorim këtë formë, rreshti i fundit patjetër duhet të përfundojë me presje. Nëse kllapën e madhe mbyllëse }
e vendosim në fund të rreshtit të fundit, atëherë presja nuk shënohet.
var lb = Libri{Autori: "Dan Brown",
Titulli: "Origjina",
Faqe: 616,
ISBN: "9789994305353"}
Me përdorimin e emrave të fushave, mund ta bëjmë edhe inicializimin e pjesshëm të struktit, ku ato fusha që mungojnë do të marrin zero vlerat përkatëse.
var lb = Libri{Autori: "Dan Brown",
Titulli: "Origjina"}
Në këtë rast, fusha ISBN
merr vlerën “”, ndërsa fusha Faqe
merr vlerën 0.
Qasja vlerave të fushave të struktit
package main
import (
"fmt"
)
type Libri struct {
Titulli, Autori, ISBN string
Faqe int
}
func main() {
var lb = Libri{Autori: "Dan Brown",
Titulli: "Origjina",
Faqe: 616,
ISBN: "9789994305353"}
fmt.Println("Titull i librit:", lb.Titulli)
fmt.Println("Autori:", lb.Autori)
fmt.Println("ISBN:", lb.ISBN)
fmt.Println("Gjithsej faqe:", lb.Faqe)
}
https://play.golang.org/p/lBpe2ryajLw
Rezultati:
Titull i librit: Origjina
Autori: Dan Brown
ISBN: 9789994305353
Gjithsej faqe: 616
Siç e shohim, fushave individuale të struktit i qasemi ashtu që e shënojmë variablin që e përmban struktit, pikën e pastaj emrin e fushës: lb.Autori
.
Përdorimi i pointerëve me strukt
package main
import (
"fmt"
)
type Libri struct {
Titulli, Autori, ISBN string
Faqe int
}
func main() {
var lb = Libri{Autori: "Dan Brown",
Titulli: "Origjina",
Faqe: 616,
ISBN: "9789994305353"}
fmt.Println(lb.Titulli)
lb2 := &lb
fmt.Println(lb2.Titulli)
lb2.Titulli = "Zanafilla"
fmt.Println(lb.Titulli)
}
https://play.golang.org/p/R-8D8LZZLCa
Rezultati:
Origjina
Origjina
Zanafilla
Vërejmë se nuk kemi nevojë të bëjmë deferencim eksplicit me *.
Krijimi i structit me new()
package main
import (
"fmt"
)
type Libri struct {
Titulli, Autori, ISBN string
Faqe int
}
func main() {
var lb = new(Libri)
lb.Titulli = "Origjina"
lb.Autori = "Dan Brown"
lb.ISBN = "9789994305353"
lb.Faqe = 616
fmt.Println(lb)
}
https://play.golang.org/p/ien1oao99Sr
Rezultati:
&{Origjina Dan Brown 9789994305353 616}
Vërejmë se është krijuar pointer i struktit.
Eksportimi i strukteve dhe fushave
Struktet që fillojnë me shkronjë të madhe do të eksportohen, dmth do të jenë të qasshëm edhe nga pakot tjera.
Po ashtu edhe fushat e struktit që fillojnë me shkronjë të madhe do të eksportohen.
Atyre që emri iu fillon me shkronjë të vogël, do të jenë të qasshëm vetëm brenda pakos ku janë deklaruar.
Struktet janë tipe me vlerë, jo me referencë.
package main
import (
"fmt"
)
type Libri struct {
Titulli, Autori, ISBN string
Faqe int
}
func main() {
var lb = Libri{Autori: "Dan Brown",
Titulli: "Origjina",
Faqe: 616,
ISBN: "9789994305353"}
lb2 := lb
lb2.Titulli = "Zanafilla"
fmt.Println(lb2)
}
https://play.golang.org/p/8-5Ukll6Pk1
Rezultati:
{Zanafilla Dan Brown 9789994305353 616}
Shohim se lb2
përmban kopjen e vlerave të lb
dhe jo referencë.
Krahasimi i strukteve
Dy strukte janë të barabartë nëse të gjitha fushat janë të barabarta ndërmjet vete.
package main
import "fmt"
type Katerkendeshi struct {
gjeresia int
gjatesia int
}
func main() {
k1 := Katerkendeshi{7, 3}
k2 := Katerkendeshi{7, 3}
if k1 == k2 {
fmt.Println("Të barabartë")
} else {
fmt.Println("Jo të barabartë")
}
}
https://play.golang.org/p/m9M-gGI-rLY
Rezultati:
Të barabartë