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 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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?

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.

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.

馃槑

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 鈥渞eferencia 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?