Funksionet

  • Funksionet janë njësi të ripërdorshme të kodit.
  • Një funksion definohet me fjalën kyçe func.
  • Funksioni deklarohet një herë dhe mund të përdoret shumë herë.
  • Funksionet në Go mund të kthejnë më tepër se një vlerë
  • Funksionet në Go mund të lidhen me një tip të caktuar, me ç’rast ai tip quhet receiver (pranues)
  • Parametrat barten me vlerë (pass-by-value), që do të thotë se vlerat e parametrave kopjohen.

Go kërkon kthime eksplicite (explicit returns), pra funksioni nuk do ta kthejë me return vlerën e shprehjes së fundit në funksion. Megjithatë, nëse emri i një variabli ceket si vlerë kthyese në rreshtin e deklarimit të funksionit, funksioni do ta kthejë atë vlerë pa e cekur emrin e variablit. Në shembullin vijues, te nënshkrimi i funksionit (function signature) variabli c i tipit int është deklaruar si variabël vlerën e të cilit do ta kthejë urdhëri return.

package main

import (
    "fmt"
)

func main() {
    fmt.Println(Shumezo(3, 5))
}

func Shumezo(a, b int) (c int) {
    c = a * b
    return
}

https://play.golang.org/p/EO5SJZftjMm

Rezultati:

15

Closures

Recursion

Funksionet variadike

package main

import "fmt"

func main() {
    fmt.Println(mbledh(7, 3))
    fmt.Println(mbledh(9, 2, 1))
}

func mbledh(arg ...int) int {
    shuma := 0
    for _, v := range arg {
        shuma += v
    }
    return shuma 
}

https://play.golang.org/p/W5uTt_yTsRa

Funksion/metodë me pranues

Funksioneve që janë deklaruar nga një interfejs iu referohemi si metoda dhe ato mund të implementohen nga tipet e kustomizuar.

Implementimi i një metode duket ekzaktësisht si i funksionit, me dallimin që para emrit të funksionit shënohet tipi që e implementon atë, p.sh. (r Katerkendeshi) në shembullin vijues.

Kjo sintaksë mundëson që metoda e njëjtë t’iu përcaktohet tipeve të ndryshme.

Një tip dhe pointeri i tij e ndajnë namespace-n e njëjtë, prandaj një metodë mund të implementohet vetëm për njërin prej tyre. Në rast se metodën e përdorimin edhe për tipin edhe për pointerin, do të lajmërohet gabim gjatë kompajlimit sepse konsiderohet si rideklarim i metodës.

Metodat nuk mund të definohen për interfejsat, por vetëm për tipet konkrete. Megjithatë, interfejsët mund të përdoren në tipet kompozite, përfshirë këtu edhe parametrat e funksionit dhe vlerat kthyese.

Në Go, gjithçka bartet me vlerë (pass by value), kështu që kur thirret një funksion apo metodë, krijohet kopja e variablit në stack. Kjo nënkupton që ndryshimet që bëhen ndaj vlerë nuk reflektohen jashtë funksionit të thirrur. Edhe segmentet, mapat dhe tipet e tjerë referues barten me vlerë, por meqë struktura e brendshme e tyre përmban pointerë, ato veprojnë sikurse të ishin bartur me referencës. Nëse metoda është e definuar për një tip, nuk mund të definohet për pointerin e tij dhe anasjelltas.

package main

import "fmt"

type Katerkendeshi struct {
    a, b int
}

func (r Katerkendeshi) Siperfaqja() int {
    return r.a* r.b
}

func main() {
    x := Katerkendeshi{a: 5, b: 3}
    fmt.Println("Siperfaqja: ", x.Siperfaqja())
}

https://play.golang.org/p/s85X-9RHTMF

Rezultati:

Siperfaqja:  15

Për ta ndryshuar variablin origjinal, argumenti duhet të jetë pointer i vetë variablit. Pointeri do të kopjohet, por ai do të jetë referencë e adresës së njëjtë memorike, duke mundësuar kështu ndryshimin e vlerës.

package main

import (
    "fmt"
)

func main() {
    a := 5
    fmt.Println(a)
    test(&a)
    fmt.Println(a)

}

func test(b *int) bool {
    *b = 555
    return true
}

https://play.golang.org/p/ef75lkFpp3n

Rezultati:

5
555

Kur pranuesi i metodës është tip e jo pointer, nëse vlera i ndryshohet brenda funksionit, nuk do të propagohet jashtë funksionit, pra do të trajtohet si variabël lokale.

package main

import (
    "fmt"
)

type Anetari struct {
    Emri  string
    Mosha int
}

func (a Anetari) TregoMoshen() {
    a.Mosha++
    fmt.Println(a.Emri, "i ka", a.Mosha, "vjet")
}

func main() {
    a := Anetari{Emri: "Petriti", Mosha: 23}
    fmt.Println(a.Emri, "i ka", a.Mosha, "vjet")
    a.TregoMoshen()
    fmt.Println(a.Emri, "i ka", a.Mosha, "vjet")
}

https://play.golang.org/p/7w5u7-1WluI

Rezultati:

Petriti i ka 23 vjet
Petriti i ka 24 vjet
Petriti i ka 23 vjet

Nëse pranuesi i metodës është pointer, vlera që ndryshohet do të jetë e dukshme edhe jashtë funksionit.

package main

import (
    "fmt"
)

type Anetari struct {
    Emri  string
    Mosha int
}

func (a *Anetari) TregoMoshen() {
    a.Mosha++
    fmt.Println(a.Emri, "i ka", a.Mosha, "vjet")
}

func main() {
    a := Anetari{Emri: "Petriti", Mosha: 23}
    fmt.Println(a.Emri, "i ka", a.Mosha, "vjet")
    a.TregoMoshen()
    fmt.Println(a.Emri, "i ka", a.Mosha, "vjet")
}

https://play.golang.org/p/90AZHL23Yrz

Rezultati:

Petriti i ka 23 vjet
Petriti i ka 24 vjet
Petriti i ka 24 vjet

Built-in functions

Një numër i vogël i funksioneve është i paradefinuar, për të cilët nuk ka nevojë të importohet asnjë pako.

close

Përdoret në komunikim të kanaleve, ku shërben për mbylljen e kanalit.

delete

Përdoret për fshirjen e të dhënave në maps.

len dhe cap

Funksioni len tregon gjatësinë e një stringu si dhe numrin e anëtarëve të segmenteve (slices) dhe vargjeve (arrays).

new

Përdoret për rezervimin e memorjes për tipet e të dhënave e definuara nga përdoruesi (user defined data types).

make

Përdoret për rezervimin e memorjes për tipet e integruara ( built-in types), siç janë: hartat (maps), segmentet (slices) dhe kanalet (channels).

copy

Përdoret për kopjimin e segmenteve.

append

Përdoret për bashkangjitjen e segmenteve.

panic dhe recover

Përdoret në mekanizmin e raportimit të gabimeve.

print dhe println

Funksione të nivelit të ultë që mund të përdoren pa përdorimin e pakos fmt. Kryesisht përdoren për debugging.

complex, real and imag

Përdoren për punë me numrat kompleksë.

All Rights Reserved Theme by 404 THEME.