English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Golang

Instrucciones de control de Golang

Funciones y métodos de Golang

Estructuras de Golang

Cortes y arreglos de Golang

Cadenas de Golang (String)

Punteros de Golang

Interfaces de Golang

Concurrencia de Golang

Excepciones de Golang (Error)

Otros aspectos de Golang

Métodos de Go (Method)

El idioma de programación Go admite métodos. Los métodos de Go son similares a las funciones de Go, pero tienen una diferencia, ya que los métodos contienen un parámetro de receptor. Con la ayuda del parámetro de receptor, este método puede acceder a las propiedades del receptor. Aquí, el receptor puede ser de tipo estructura o de tipo no estructura. Al crear métodos en el código, el receptor y el tipo de receptor deben estar en el mismo paquete. Además, no se permite crear un método donde el tipo de receptor ya haya sido definido en otro paquete, incluyendo tipos integrados como int, string, etc. Si intenta hacer esto, el compilador lanzará un error.

Sintaxis:

func(reciver_name Type) method_name(parameter_list)(return_type){
    // Código
}

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

métodos del receptor de tipo estructura

En el idioma de programación Go, se permite definir métodos cuyos receptores sean de tipo estructura. Dentro del método, se puede acceder a este receptor, como se muestra en el siguiente ejemplo:

package main 
  
import "fmt"
  
//Estructura Author
type author struct { 
    name string 
    branch string 
    particles int
    salary	int
} 
  
//método del receptor 
func(a author) show() { 
  
    fmt.Println("Nombre del Autor: ", a.name) 
    fmt.Println("Nombre de Rama: ", a.branch) 
    fmt.Println("Artículos publicados: ", a.particles) 
    fmt.Println("Salario: ", a.salary) 
} 
  
func main() { 
  
    //Valores de inicialización
    //Estructura Author
    res := author{ 
        nombre: "Sona", 
        rama: "CSE", 
        particles: 203, 
        salario:    34000, 
    } 
  
    //Llamar al método
    res.show() 
}

Salida:

Nombre del autor: Sona
Nombre de la rama: CSE
Artículos publicados:  203
Salario:  34000

Métodos de receptor de tipo no estructurado

En el lenguaje Go, siempre que el tipo y la definición del método existan en el mismo paquete, se puede crear un método con receptor de tipo no estructurado. Si están en diferentes paquetes como int, string, etc., el compilador lanzará un error porque se definen en diferentes paquetes.

package main 
  
import "fmt"
  
//Definición de tipo
type data int
//Definir un método
//Receptor de tipo no estructurado 
func (d1 data) multiply(d2 data) data { 
    return d1 * d2 
} 
  
/* 
//Si intenta ejecutar este código,
//Luego el compilador lanzará un error 
func(d1 int)multiply(d2 int)int{ 
return d1 * d2 
} 
*/
  
func main() { 
    value1 := data(23) 
    value2 := data(20) 
    res := value1.multiply(value2) 
    fmt.Println("Resultado final: ", res) 
}

Salida:

Resultado final:  460

Métodos de Go con receptor de puntero

En el lenguaje Go, se permite usarPunteroLa creación de métodos de receptor. Con la ayuda del receptor de puntero, si los cambios realizados en el método se reflejarán en el llamado, esto es imposible para el receptor de valor.

Sintaxis:

func (p *Type) método_name(...Type) Type {
    // Código
}
package main 
  
import "fmt"
  
// Estructura Author
type author struct { 
    name string 
    branch string 
    particles int
} 
  
//Método, utiliza receptor de tipo author
func (a *author) show(abranch string) { 
    (
*a.branch = abranch 
} 
  
// Función principal 
func main() { 
  
    //Inicializar la estructura author
    res := author{ 
        name: "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("Nombre del autor: ", res.name) 
    fmt.Println("Nombre de la rama (Antes): ", res.branch) 
  
    //Crear un puntero
    p := &res 
  
    //Llamar al método show
    p.show("ECE") 
    fmt.Println("Nombre del autor: ", res.name) 
    fmt.Println("Nombre de la rama (Después): ", res.branch) 
}

Salida:

Nombre del autor: Sona
Nombre de la rama (Antes): CSE
Nombre del autor: Sona
Nombre de la rama (Después): ECE

Los métodos pueden aceptar punteros y valores

Es bien conocido que en Go, cuando una función tiene parámetros de valor, solo acepta el valor de los parámetros. Si intenta pasar un puntero a una función de valor, no se aceptará, y viceversa. Pero los métodos de Go pueden aceptar valores y punteros, independientemente de si se definen con receptor de puntero o de valor. Como se muestra en el siguiente ejemplo:

package main 
  
import "fmt"
  
// Estructura Author
type author struct { 
    name string 
    branch string 
} 
  
//Método con puntero
//Receptor de tipo author
func (a *author) show_1(abranch string) {
 
    (
*a.branch = abranch 
} 
  
//Método con valor
//Receptor de tipo de autor 
func (a author) show_2()
 
    a.name = "Gourav"
    fmt.Println("Nombre del autor (Antes): ", a.name) 
} 
  
func main() { 
  
     //Valores de inicialización
     //Estructura de autor
    res := author{ 
        name: "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("Nombre de la rama (Antes): ", res.branch) 
  
     //Llamar a show_1Método
     //Método (con puntero) con valor
    res.show_1("ECE") 
    fmt.Println("Nombre de la rama (Después): ", res.branch) 
  
     //Llamar a show_2Método
     //Método (con puntero) de valor
    (&res).show_2()
 
    fmt.Println("Nombre del autor (Después): ", res.name) 
}

Salida:

Nombre de la rama (Antes): CSE
Nombre de la rama (Después): ECE
Nombre del autor (Antes): Gourav
Nombre del autor (Después): Sona

Diferencias entre métodos y funciones

MétodoFunción

Contiene receptor.

No contiene receptor.

Puede aceptar tanto punteros como valores.

No puede aceptar tanto punteros como valores al mismo tiempo.

Se puede definir métodos con el mismo nombre pero de diferentes tipos en el programa.

No se permite definir funciones con el mismo nombre pero de tipos diferentes en el programa.