27 - Estructura de datos tipo structs - parámetros

Cuando pasamos un struct a una función lo que sucede es que se hace una copia de la misma (es lo mismo que sucede con los arrays)

Si queremos modificar el registro en la función debemos pasar la dirección del registro y por lo tanto que lo reciba un puntero.

Problema 1:

Se tiene la siguiente declaración de registro:

type Producto struct {
    codigo int
    descripcion string
    precio float64
}
En la función main definir una variable de tipo "Producto".
Implementar dos funciones una que permita cargar el registro definido en la main y otra que lo imprima.

Programa: ejercicio127.go

package main

import "fmt"

type Producto struct {
    codigo int
    descripcion string
    precio float64
}

func cargar(producto *Producto) {
    fmt.Print("Ingrese el código:")
    fmt.Scan(&producto.codigo)
    fmt.Print("Ingrese la descripción:")
    fmt.Scan(&producto.descripcion)
    fmt.Print("Ingrese el precio")
    fmt.Scan(&producto.precio)
}

func imprimir(producto Producto) {
    fmt.Println("Codigo:", producto.codigo)
    fmt.Println("Descripcion:", producto.descripcion)
    fmt.Println("Precio:", producto.precio)
}

func main() {
    var producto1 Producto
    cargar(&producto1)
    imprimir(producto1)
}

Como vemos cuando queremos modificar un registro en una función debemos pasar la dirección del registro desde la main y la función lo recibe mediante un puntero:

func cargar(producto *Producto) {

Desde la main le enviamos la dirección de la variable:

func main() {
    var producto1 Producto
    cargar(&producto1)

Dentro de la función debemos acceder a los campos del registro con la misma sintaxis vista sin punteros:

func cargar(producto *Producto) {
    fmt.Print("Ingrese el código:")
    fmt.Scan(&producto.codigo)
    fmt.Print("Ingrese la descripción:")
    fmt.Scan(&producto.descripcion)
    fmt.Print("Ingrese el precio")
    fmt.Scan(&producto.precio)
}

Como la función imprimir no necesita modificar el registro que le enviamos no le pasamos una dirección sino el registro propiamente dicho:

func imprimir(producto Producto) {
    fmt.Println("Codigo:", producto.codigo)
    fmt.Println("Descripcion:", producto.descripcion)
    fmt.Println("Precio:", producto.precio)
}

Problema propuesto

  • Se tiene la siguiente declaración de registro:
    type Pais struct {
        nombre string
        cantidadhab int
    }
    
    Definir tres variables de tipo país en la función main.

    Crear una función que reciba un puntero de tipo Pais y cargue por teclado el nombre del país y la cantidad de habitantes.
    Mostrar en otra función los datos cargados de cada país.
Solución
ejercicio128.go

package main

import "fmt"

type Pais struct {
    nombre string
    cantidadhab int
}

func cargar(pais *Pais) {
    fmt.Print("Ingrese el nombre del país:")
    fmt.Scan(&pais.nombre)
    fmt.Print("Ingrese la cantidad de habitantes:")
    fmt.Scan(&pais.cantidadhab)
}

func imprimir(pais Pais) {
    fmt.Println("País:", pais.nombre)
    fmt.Println("Habitantes:", pais.cantidadhab)
    fmt.Println("------------------------------")
}

func main() {
    var pais1, pais2, pais3 Pais
    cargar(&pais1)
    cargar(&pais2)
    cargar(&pais3)
    imprimir(pais1)
    imprimir(pais2)
    imprimir(pais3)
}