Skip to main content

Metodai

M.Gzegozevskis...About 2 minGo programavimo kalbaGo

Go programvimo kalboje nėra klasių tačiau yra alternatyva naudoti metodus, kurie yra analogiška struktūra go struct (tipo praplėtimui papildymui nauju funkcionalumu) žinomu kaip funkcija praplėsti funkcionalumą (angl. Extension function). Bazinė struktūra labai panaši į funkciją tik turi papildomą parametrą, kuris yra kaip įvesties tipas (angl. Receiver).

func(reciver_pavadinimas Tipas) metodo_pavadinimas(parameterų sąrašas)(return_tipas){
// Sakiniai kodo blokas
}

Metodo pavyzdys su struktūros tipo receiver parametru:

package main
import "fmt"
// Author struktūra
type author struct {
    name      string
    branch    string
    particles int
    salary    int
}
 
// metodas su receiver parametru author
func (a author) show() {
 
    fmt.Println("Author's Name: ", a.name)
    fmt.Println("Branch Name: ", a.branch)
    fmt.Println("Published articles: ", a.particles)
    fmt.Println("Salary: ", a.salary)
}
func main() {
    // inicijuojame author struktūrą
    res := author{
        name:      "Sona",
        branch:    "CSE",
        particles: 203,
        salary:    34000,
    }
 
    // iškviečiamas metodas panašiai kaip ir objektiniame programavime
    res.show()
}

Ekrane bus išvestas rezultatas:

Author's Name:  Sona
Branch Name:  CSE
Published articles:  203
Salary:  34000

Metodo pavyzdys su įprasto tipo (int, float ar kt.) parametru:

package main
import "fmt"
 
// Tipo aprašymas tai yra tik int tipui suteikiamas kitas pavadinimas
// Kitu atveju gausime klaidą jeigu naudosime tiesiog int tipą
type data int
 
// Aprašomas metodas su įprastu tipu
func (d1 data) multiply(d2 data) data {
    return d1 * d2
}
/*
// Naudojant įprastą tipą int gausime programos klaidą
func(d1 int)multiply(d2 int)int{
   return d1 * d2
}
*/
func main() {
    value1 := data(23)
    value2 := data(20)
    res := value1.multiply(value2)
    fmt.Println("Final result: ", res)
}

Ekrana bus išvestas tekstas:

Final result:  460

Metodas su rodyklės tipo receiver parametru

Pavyzdys naudojant rodyklės tipo receiver parametrą:

package main
import "fmt"
 
// autoriaus struktūra
type author struct {
    name      string
    branch    string
    particles int
}

// Metodo aprašymas su rodyklės author tipo receiver parametru
func (a *author) show(abranch string) {
    (*a).branch = abranch
}
 
func main() {
 
    // Initializing the values
    // of the author structure
    res := author{
        name:   "Sona",
        branch: "CSE",
    }
 
    fmt.Println("Author's name: ", res.name)
    fmt.Println("Branch Name(Before): ", res.branch)
 
    // Sukuriama rodyklė ir nurodoas author struktūros objekto egzemplioriaus adresas
    p := &res
 
    // Metodo iškvietimas
    p.show("ECE")
    fmt.Println("Author's name: ", res.name)
    fmt.Println("Branch Name(After): ", res.branch)
}

Ekrane bus išvestas rezultatas:

Author's name:  Sona
Branch Name(Before):  CSE
Author's name:  Sona
Branch Name(After):  ECE

Metodos priimantis rodyklės ir kaip reikšmė (angl. value) tipų parametrus

Pavyzdys naudojant rodyklės ir reikšmės tipo receiver parametrus:

package main
import "fmt"
 
// Author struktūra
type author struct {
    name   string
    branch string
}
 
// Metodas su autoriaus tipo rodyklės receiver parametru
func (a *author) show_1(abranch string) {
    (*a).branch = abranch
}
 
// Metodas su autoriaus reikšmės tipo receiver parametru
func (a author) show_2() {
    a.name = "Gourav"
    fmt.Println("Author's name(Before) : ", a.name)
}
func main() {
 
    // Inicijuojame autoriaus struktūrą
    res := author{
        name:   "Sona",
        branch: "CSE",
    }
 
    fmt.Println("Branch Name(Before): ", res.branch)
 
    // Šį metodą galima vadinti rodyklės tipo metodas
    // Iškviečiamas metodas show_1 su papildomu parametru 
    res.show_1("ECE")
    fmt.Println("Branch Name(After): ", res.branch)
 
    // Šį metodą galima vadinti reikšmės tipo metodas
    // Iškviečiamas metodas show_2 be papildomo parametro
    (&res).show_2()
    fmt.Println("Author's name(After): ", res.name)
}

Ekranas bus išvestas rezultatas:

Branch Name(Before):  CSE
Branch Name(After):  ECE
Author's name(Before) :  Gourav
Author's name(After):  Sona
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.15.8