Métodos en Golang

Vaya a los métodos de soporte de idiomas. Los métodos Go son similares a la función Go con una diferencia, es decir, el método contiene un argumento de receptor. Con la ayuda del argumento del receptor, el método puede acceder a las propiedades del receptor. Aquí, el receptor puede ser de tipo estructura o no estructura. Cuando crea un método en su código, el receptor y el tipo de receptor deben estar presentes en el mismo paquete. Y no puede crear un método en el que el tipo de receptor ya esté definido en otro paquete, incluido el tipo incorporado como int, string, etc. Si intenta hacerlo, el compilador dará un error.

Sintaxis: 

func(reciver_name Type) method_name(parameter_list)(return_type){
// Code
}

Aquí, se puede acceder al receptor dentro del método.

Método con receptor de tipo de estructura

En el lenguaje Go, puede definir un método cuyo receptor sea de tipo estructura. Se puede acceder a este receptor dentro del método como se muestra en el siguiente ejemplo:

Ejemplo:

Go

// Go program to illustrate the
// method with struct type receiver
package main
 
import "fmt"
 
// Author structure
type author struct {
    name      string
    branch    string
    particles int
    salary    int
}
 
// Method with a receiver
// of author type
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)
}
 
// Main function
func main() {
 
    // Initializing the values
    // of the author structure
    res := author{
        name:      "Sona",
        branch:    "CSE",
        particles: 203,
        salary:    34000,
    }
 
    // Calling the method
    res.show()
}

Producción: 

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

Método con receptor de tipo no estructural

En el lenguaje Go, puede crear un método con un receptor de tipo sin estructura siempre que el tipo y las definiciones del método estén presentes en el mismo paquete. Si se presentan en diferentes paquetes como int, string, etc., el compilador dará un error porque están definidos en diferentes paquetes.

Ejemplo:

Go

// Go program to illustrate the method
// with non-struct type receiver
package main
 
import "fmt"
 
// Type definition
type data int
 
// Defining a method with
// non-struct type receiver
func (d1 data) multiply(d2 data) data {
    return d1 * d2
}
 
/*
// if you try to run this code,
// then compiler will throw an error
func(d1 int)multiply(d2 int)int{
return d1 * d2
}
*/
 
// Main function
func main() {
    value1 := data(23)
    value2 := data(20)
    res := value1.multiply(value2)
    fmt.Println("Final result: ", res)
}

Producción: 

Final result:  460

Métodos con receptor de puntero

En el lenguaje Go, puede crear un método con un receptor de puntero . Con la ayuda de un receptor de puntero, si se realiza un cambio en el método, se reflejará en la persona que llama, lo que no es posible con los métodos del receptor de valor.

Sintaxis: 

func (p *Type) method_name(...Type) Type {
// Code
}

Ejemplo:

Go

// Go program to illustrate pointer receiver
package main
 
import "fmt"
 
// Author structure
type author struct {
    name      string
    branch    string
    particles int
}
 
// Method with a receiver of author type
func (a *author) show(abranch string) {
    (*a).branch = abranch
}
 
// Main function
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)
 
    // Creating a pointer
    p := &res
 
    // Calling the show method
    p.show("ECE")
    fmt.Println("Author's name: ", res.name)
    fmt.Println("Branch Name(After): ", res.branch)
}

Producción:

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

El método puede aceptar tanto el puntero como el valor

Como sabemos que en Go, cuando una función tiene un argumento de valor, solo aceptará los valores del parámetro, y si intenta pasar un puntero a una función de valor, no lo aceptará y viceversa. Pero un método Go puede aceptar tanto el valor como el puntero, ya sea que se defina con un puntero o un receptor de valor. Como se muestra en el siguiente ejemplo:

Ejemplo:

Go

// Go program to illustrate how the
// method can accept pointer and value
 
package main
 
import "fmt"
 
// Author structure
type author struct {
    name   string
    branch string
}
 
// Method with a pointer
// receiver of author type
func (a *author) show_1(abranch string) {
    (*a).branch = abranch
}
 
// Method with a value
// receiver of author type
func (a author) show_2() {
 
    a.name = "Gourav"
    fmt.Println("Author's name(Before) : ", a.name)
}
 
// Main function
func main() {
 
    // Initializing the values
    // of the author structure
    res := author{
        name:   "Sona",
        branch: "CSE",
    }
 
    fmt.Println("Branch Name(Before): ", res.branch)
 
    // Calling the show_1 method
    // (pointer method) with value
    res.show_1("ECE")
    fmt.Println("Branch Name(After): ", res.branch)
 
    // Calling the show_2 method
    // (value method) with a pointer
    (&res).show_2()
    fmt.Println("Author's name(After): ", res.name)
}

Producción: 

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

Diferencia entre método y función

Método Función
Contiene un receptor. No contiene receptor.
En el programa se pueden definir métodos del mismo nombre pero de diferentes tipos. No se permite definir funciones del mismo nombre pero de diferente tipo en el programa.
No se puede utilizar como un objeto de primer orden. Se puede utilizar como objetos de primer orden y se puede pasar

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *