Esta pagina se ve mejor con JavaScript habilitado

Go struct embedding

 ·  🎃 kr0m

En Go, el embedding se refiere a la capacidad de incrustar un tipo en otro, de este modo conseguimos:

  • Reutilización de código: El embedding es útil para compartir funcionalidades comunes entre tipos sin heredar explícitamente de una clase base.
  • Composición: Permite la composición de tipos, lo que significa que un tipo puede incluir otros tipos y, por lo tanto, heredar sus comportamientos.
  • Extensión de funcionalidad: Se utiliza para extender la funcionalidad de un tipo existente incorporando otros tipos que proporcionan funcionalidades adicionales.
  • Simplicidad y claridad: Puede simplificar y hacer más claro el diseño de tipos al permitir una estructura más modular y fácil de entender.

Si eres nuevo en el mundo de Go te recomiendo los siguientes artículos anteriores:


En este sencillo ejemplo tenemos tres estructuras:

  • person: Estructura común.
  • student: Hereda de person y además añade el string grade.
  • teacher: Hereda de person y además añade el int teaching_years.
vi university.go
package main

import "fmt"

type person struct {
    name string
    age int
}

func (p person) introduction() {
    fmt.Printf("Hello, I'm %s and I'm %d years old.\n", p.name, p.age)
}

type student struct {
    person
    grade string
}

func (s student) study() {
    fmt.Printf("%s is studying in %s.\n", s.name, s.grade)
}

type teacher struct {
    person
    teaching_years int
}

func (t teacher) teaching() {
    fmt.Printf("%s has been teaching %d years.\n", t.name, t.teaching_years)
}

func main() {
    student := student{
        person: person{
            name: "Ana",
            age:   20,
        },
        grade: "engineering",
    }
    teacher := teacher{
        person: person{
            name: "Joe",
            age:   30,
        },
        teaching_years: 10,
    }

    student.introduction()
    student.study()
    fmt.Println("-----")
    teacher.introduction()
    teacher.teaching()
}

Ejecutamos el código:

go run university.go

Podemos ver como cada objeto comparte los campos definidos en la estructura person(name/age) y además tienen los campos adicionales específicos(grade/teaching_years) respectivamente, además las estructuras person, student y teacher tienen una función común introduction y una función propia study y teaching respectively debido a los Go methods :

Hello, I'm Ana and I'm 20 years old.
Ana is studying in engineering.
-----
Hello, I'm Joe and I'm 30 years old.
Joe has been teaching 10 years.
Si te ha gustado el artículo puedes invitarme a un RedBull aquí