No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Punteros en Structs

14/42
Recursos

Aportes 17

Preguntas 2

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Si te quedo alguna duda, revisa la doc de Go: https://tour.golang.org/methods/6 . Aclara varias cosas.

Por que si yo no pongo el & aun asi me sigue funcionando? es mala practica o algo?

t := &NombreStuct para que esto nos regrese la referencia
t *task nos da el valor de la referencia

Another example:

package main

import "fmt"

func changeVal(smth *string) {
	*smth = "test"
}

func main() {
	var test string = "fdfds"
	fmt.Println(test)
	changeVal(&test)
	fmt.Println(test)
}

// output:

// fdfds
// test

Cuando se definen receiver functions, es importante apuntar dichas funciones hacia punteros del struct. Esto se hace utilizando asterisco (indicando que es un pointer) previo al tipo del struct.

func (f *foo) someAction() { 
	// code ...
}

De esta manera se estará ligando la ejecución de la función a una instancia en específico.

En mi caso solo fue necesario agregar el asterisco * en la declaración del método como sale en el vídeo, el signo de & no es necesario cuando se crea el objeto.

😎

package main

import "fmt"

type task struct {
	nombre      string
	descripcion string
	completado  bool
}

func (t *task) marcarCompleta() {
	t.completado = true
}

func (t *task) actualizarDescripcion(desc string) {
	t.descripcion = desc
}

func (t *task) actualizarNombre( nombre string) {
	t.nombre = nombre
}

func main() {
	t := &task{
		nombre:      "Completar curso go",
		descripcion: "Completar el curso de go en esta semana",
	}

	fmt.Printf("%+v\n", t)

	t.marcarCompleta()
	t.actualizarNombre("Curso go")
	t.actualizarDescripcion("Completar el curso cuanto antes")
	fmt.Printf("%+v\n", t)
}

Una explicación detallada con respecto a los punteros

https://ed.team/blog/que-son-los-punteros-en-go

Por qué imprime así?

&{name:Complete go course description:I am enjoying my course isComplete:false}
&{name:new name description:new description isComplete:true}

y si le quito el ‘&’ funciona igualmente pero imprime así:

{name:Complete go course description:I am enjoying my course isComplete:false}
{name:new name description:new description isComplete:true}```

Genial 😃 gracias 😎

¿Como serian aplicadas las direcciones de memoria en un mundo real?, en código lo que normalmente hago es que se regresa un valor y ese es el que se sustituye para no tener dolores de cabeza al manejar múltiples elementos del mismo tipo.

Comparto otro enlace útil sobre el tema de punteros
https://www.golang-book.com/books/intro/8

creo que usamos el & para dejar indicado que estamos haciendo referencia a esa variable( struct).

Un puntero es un tipo de dato como los int o char que guarda direcciones de memoria de otras variables, por eso se dice que “referencia a” cuando obtenemos el valor de una variables por referencia, lo llamamos dereferenciación.

pero no arreglo el problema del main 😕

Tengo una pregunta, cual es la diferencia entre:

func (t *task) completeTask() { t.completed = true }

y

func (*task) completeTask() {
completed = true
}

o sea, que pasa si al crear la funcion no le coloco el t en (t *task) y que pasa cuando se lo coloco?