Tipet kompozite: Struktet

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ë
All Rights Reserved Theme by 404 THEME.