Si te quedo alguna duda, revisa la doc de Go: https://tour.golang.org/methods/6 . Aclara varias cosas.
Introducción a Go
Mi primer programa en Go
Instalación en Mac y Windows
Instalar VS Code
Comandos básicos de Go
Analizando un programa en Go
Nuestra Primera Aplicación Go
Descripción del proyecto 1: Calculadora
Leer inputs desde la consola
Manejo de errores y uso de If
Switch
Lista de Tareas
Structs y Receivers
Descripción del proyecto 2: Lista de Tareas
Structs para Lista de Tareas
Punteros
Punteros en Structs
Uso de Slices
Ciclo For
Implementar For en Struct
Interfaces
¿Qué es una interfaz?
Maps
¿Por qué las Interfaces?
Creando la Interfaz Animal
Imprimiendo el contenido de una Página Web usando Interfaces
Goroutines y Channels
Introducción al problema de la Concurrencia
GoRoutines
Channels
Implementación de Goroutines y channels
Construyendo un Servidor Web
Ciclos While y For
Descripción de Servidor Web
Creando el Servidor
Manejando rutas en backend
¿Qué es un Middleware?
Manejando Request HTTP
Asignando Rutas HTTP
Agregando Middlewares
Agregando Multiples Middlewares
Agregando otro Middleware
Manejando POST
Manejando Modelos y JSON
Respondiendo Request JSON
Go Modules creando nuestro primer módulo en Go
Implementando nuestro primer módulo en Go
Conclusiones del Curso y siguientes pasos
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Néstor Escoto
Aportes 17
Preguntas 3
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
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?
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?