A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Constructores

8/30
Recursos

Aportes 11

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Todas las formas de instanciar un objeto en Go:

  1. Crear una struct con valores zero por defecto.
e  := Employee{}
  1. Asignarle valores a las propiedades.
e2 := Employee{ id: 1, name: "Name", vacation: true }
  1. Usando la palabra reservada new.

Regresa una referencia a la instancia creada, para acceder al valor usamos *e3.

e3 := new(Employee)

猸 4. Crear una funci贸n que act煤e como m茅todo constructor.

La funci贸n regresa con & para que regrese la referencia y no una copia, de la struct.

func NewEmployee(id int, name string, vacation bool) *Employee {
	return &Employee{
		id:       id,
		name:     name,
		vacation: vacation,
	}
}
...
e4 := NewEmployee(1, "Name 2", true)

A mi parecer la de mas f谩cil lectura es la de

	e2 := Employee{
		id:       12,
		name:     "Name",
		vacation: true,
	}

Go no es 100% orientado a objectos, para hacernos una idea si Java es 95 % orientado a objetos (Recuerden que los primitivos de Java no son objectos) go es como el 50%, talvez un poco m谩s un poco menos.
Pero almenos hasta esta clase hemos aprendido a implementar lo basico de la orientacion a objectos.
.
.

Creando una clase
Para crear una clase en go utlizamos un struct y tambien debemos utilizar la palabra reservada type al comienzo de la declaraci贸n.

// Esta es nuestra clase con dos atributos
type Employee struct {
	id   int
	name string
}

.
.

Creando un constructor
Pensemos en un constructor como un representante de un gran artista el cual vela por los intereses del artista que est谩 representando.
De igual forma el constructor de la clase vela por los intereses de la clase a la que representa, por ejemplo el constructor determina c贸mo es que se debe instanciar a una clase.
Si no tienes muy claro el paradigma de la programaci贸n orientada a objetos por favor para aqu铆 y ve a este curso https://platzi.com/clases/oop/ esta buenisimo !!!
.
Aunque el profesor mostr贸 varios ejemplos para crear un constructor a mi me gustaron estos dos.

//Forma No1: Crear directamente el objeto donde se va a utilizar .
func main() {

	e1 := Employee{
		id:   14,
		name: 鈥Esteban鈥,
	}
	fmt.Printf("%v\n", e1)
}


//Forma No2: Crear una funci贸n que reciba por parametro los valores que tendr谩 nuestro objecto , asigne los valores a sus respectivos atributos y luego devuelva una referencia en memoria del objeto creado.

func NewEmployee(id int, name string) *Employee {
	return &Employee{
		id:   id,  //Asignando valores.
		name: name,
	}
}

//Nuestra funci贸n principal
func main() {
	e2:= NewEmployee(23, "Miguel") //Instanciando nuestro objecto.
	fmt.Printf("%v\n", *e2)

}

.
.
.

Creando m茅todos.
En simples palabras un m茅todo determina el comportamiento que tendr谩 un objeto, si no te suena ya sabes ve a este link https://platzi.com/clases/oop/.
.
Utilicemos los famosisimos m茅todos getters y setters

// Este es nuestro m茅todo set, y tenemos que indicarle que pertenece a nuestra clase Employee para ello le pasamos un puntero * que apunte a esa clase  鈥媝ara luego poder tener acceso al atributo y asignarle el valor que nos pasen a trav茅s de este m茅todo setId.
func (x *Employee) setId(i int) {
	x.id = i
}

// Este es nuestro m茅todo get, igual que el anterior pasamos un puntero * pero en este caso vamos a retornar un valor int por ello lo indicamos en la declaracion del metodo.
func (x *Employee) getId() int {
	return x.id
}

//Nuestra funci贸n principal
func main() {

	e2:= NewEmployee(23, "Miguel")
	fmt.Printf("%v\n", *e2)
	idE2 := e2.getId() // recuperamos el atributo id del objecto e2
	e2.setId(14) // Cambiamos el atributo id del objecto e2
	fmt.Printf("%d\n", idE2)
	fmt.Printf("%v\n", *e2)
}

Al principio cuando vi la sintaxis de go dije 鈥減or todos los servidores que es esto鈥 pero le estoy cogiendo cari帽o.
Tambi茅n si nunca han trabajado con punteros tal vez no se sientan c贸modos pero creanme los punteros de go son una ternurita comparados con C le dejo este curso: https://platzi.com/clases/1740-lenguaje-c-2019/24212-punteros/ Pero no se asusten todo es cuestion de practicar 馃槈 .

codigo con comentarios:

package main

import "fmt"

// Clase o struct empleado
type Employee struct {
	id       int
	name     string
	vacation bool
}

// funcion/metodo constructor.
func NewEmployee(id int, name string, vacation bool) *Employee {
	return &Employee{
		id:       id,
		name:     name,
		vacation: vacation,
	}
}

func main() {
	// forma numero 1.
	e := Employee{}
	fmt.Println("%v", e)

	// forma numero 2.
	e2 := Employee{
		id:   1,
		name: "Jose",
	}
	fmt.Println("%v", e2)

	// forma 3.
	e3 := new(Employee)    // new devuelve un apuntador
	fmt.Println("%v", *e3) // con * referenciamos al valor.

	// forma 4.
	e4 := NewEmployee(4, "Laura", false)
	fmt.Println(*e4)

}

鈥淐uando se trabajan con structs y se pasan a funciones, Go los trata como si fueran copias鈥

Me parece que las formas 1, 2 y 3 son m谩s legibles, en la forma 4 se acerca mucho a los constructores de otros lenguajes!

package main

import "fmt"

type Employee struct {
	id       int
	name     string
	vacation bool
}

func (e *Employee) SetId(id int) {
	e.id = id
}

func (e *Employee) SetName(name string) {
	e.name = name
}

func (e *Employee) GetId() int {
	return e.id
}

func (e *Employee) GetName() string {
	return e.name
}

func newEmployee(id int, name string, vacation bool) *Employee {
	return &Employee{
		id:       id,
		name:     name,
		vacation: vacation,
	}
}

func main() {
	e := Employee{}
	fmt.Printf("%+v\n", e)
	e.SetId(3)
	e.SetName("Marco")
	fmt.Printf("%+v\n", e)

	//creamos una funcion constructora

	e4 := newEmployee(5, "Pepe", true)
	fmt.Printf("%+v\n", *e4)
}

  • Aqu铆 por si tienen la duda de simplemente poner el nombre para hacer referencia al valor pasado tambi茅n funciona como en javascript almenos en mi versi贸n de Golang si 鈥済o1.17鈥.

Apuntes y c贸digo:

  • Los constructores permiten la instanciaci贸n de una clase a un objeto, asimismo permitedefinir propiedades predefinidas.
  • En Go podemos utilizar funciones que puedan crear structs con propiedades que nosotrospasamos como par谩metros.
package main

import "fmt"

type Employee struct {
	id       int
	name     string
	vacation bool
}

//Emulador de constructor
func NewEmployee(id int, name string, vacation bool) *Employee {
	return &Employee{
		id:       id,
		name:     name,
		vacation: vacation,
	}
}

func main() {
	// Forma 1
	e := Employee{}
	fmt.Printf("%v\n", e)
	// Forma 2
	e2 := Employee{
		id:       1,
		name:     "Benjamin",
		vacation: true,
	}
	fmt.Printf("%v\n", e2)
	// Forma 3
	e3 := new(Employee)
	fmt.Printf("%v\n", *e3)
	e3.id = 1
	e3.name = "Mateo"
	fmt.Printf("%v\n", *e3)
	// Forma 4
	e4 := NewEmployee(1, "Name", false)
	fmt.Printf("%v\n", *e4)
}

Las propiedades por defecto son conocidas como zero values

Constructores

  • Los constructores permiten la instanciaci贸n de una clase a un objeto, asimismo permite
    definir propiedades predefinidas.
  • En Go podemos utilizar funciones que puedan crear structs con propiedades que nosotros
    pasamos como par谩metros.