English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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
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
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
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
Método | Funció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. |