Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Status
Date
Autor
Notes
¿Que es Go?
Compilado y estaticamente tipado
Go/Golang.
Programadores: Gophers.
Mascota: Gopher.
Curso Básico de GO 1
Gopherize yourself
Generate a Gopher pic that's as unique as you
https://gopherize.me/
Instalando GO
export GOPATH=$HOME/go # entorno donde desarrollaremos nuestros programas
export GOBIN=$GOPATH/bin # Donde estarán todos los binarios a ejecutar
export GOROOT=/usr/local/go # o /usr/lib/go Aquí esta el ejecutador de GO
mkdir -p $HOME/go/{bin,pkg,src}
Curso Básico de GO 2
import "fmt"
func main() {
fmt.Println("Hola Mundo")
}
Para comenzar debemos definir que nuestro paquete es el principal, usando package
main .
Luego importamos la libreria fmt , la cual nos permite mostrar texto por pantalla.
Para terminar creamos una función (debe tener siempre el nombre main la funcion a
ejecutar) que contenga la llamada a la función Println de la libreria fmt . Al igual que
en otros lenguajes, le pasamos lo que queremos mostrar como argumento.
package main
import "fmt"
func main() {
const pi float64 = 3.14
const pi2 = 3.1415
Para declarar constantes podemos definir su tipo o no (dejando que el compilador las
infiera)
el valor 3.1415 .
Variables
Curso Básico de GO 3
base := 12 // Declarada sin tipo ni keyword usando el operador :=
En Go no podemos dejar variables sin usar dado a que el lenguaje nos marca error en
compilación cuando las variables declaradas no son usadas.
package main
import "fmt"
func main() {
base := 12
var altura int = 14 Este error error se lanza al
var area int
area = 12 momento de compilar y evita
} que gastemos espacio
(aunque sea minimo) en
variables no usadas.
package main
import "fmt"
func main() {
base := 12
var altura int = 14
var area int
area = 12
Zero Values
package main
Curso Básico de GO 4
import "fmt"
func main() {
var a int
var b float64
var c string Por defecto los valores que nos entregan
var d bool
las variables no inicializadas (sin darles
fmt.Println(a, b, c, d) valor) poseen los siguientes valores.
}
int :0
float :0
bool : false
Operadores aritmeticos
package main
import "fmt"
func main() {
x := 10
y := 5
// Suma
result := x + y
fmt.Println("suma:", result) Fijarse que en el primer
// Resta
result usamos el operador
result = x - y
fmt.Println("resta:", result) para inferir tipos ( := ).
// Multiplicacion
result = x * y Y en las siguientes lineas
fmt.Println("multiplicacion:", result)
(donde modificamos la
// Division
result = x / y variable result ) solo usamos
fmt.Println("division:", result)
el operador de asignación
// Modulo
result = y % x ( = ).
fmt.Println("modulo:", result)
} Esto se debe a que al usar :=
Curso Básico de GO 5
Incremental y Decremental
var x int
x++ // Le suma 1 a la variable x
x-- // Le resta 1 a la variable x
Quiz
Calcular area de rectangulo, trapecio y circulo.
package main
import "fmt"
func main() {
const base int = 30
const base_2 int = 28
const altura int = 15
const radio int = 3
const pi float32 = 3.1415
// Area rectagunlo
area_rect := base * altura
fmt.Println("area rectangulo:", area_rect)
// area trapecio
area_trap := ((base + base_2) * altura) / 2
fmt.Println("area trapecio:", area_trap)
// area circulo
area_circ := pi * float32(radio) // radio (int) -> radio (float32) dada la mult con pi
fmt.Println("area circulo:", area_circ)
}
Valores Primitivos
Enteros
Curso Básico de GO 6
int = Depende de la arquitectura del OS si es 32bits o 64bits
Enteros Positivos
uint = Depende del OS (32 o 64bits)
Decimales
float32 = 32bits = +/- 1.18e^-38 a +/- 3.4e^38
Strings y Bool
string = “” En Go siempre las strings llevan comillas “dobles”
Números Complejos
complex64 = Real o imaginario float32
Ejemplo: c := 10 + 8i
Paquete FMT
Además de poder usarlo para mostrar texto por consola tiene otras utilidades.
Curso Básico de GO 7
Println
package main
import "fmt"
func main() {
// Println
hello := "Hello"
world := "world!"
fmt.Println(hello, world)
fmt.Println(hello, world)
}
Printf
package main
import "fmt"
func main() {
// Printf
nombre := "pablo"
edad := 18
Con Printf podemos escribir variables junto con texto, agregandolas con el caracter
% , el cual se acompaña de la abreviación del tipo de dato o se usa v para que se
%s Imprimir cadenas.
%d Imprimir enteros.
%f Imprimir flotantes.
Curso Básico de GO 8
Además de eso, con Printf podemos saber el tipo de dato de nuestras variables.
package main
import "fmt"
func main() {
// Printf
// tipo de dato
nombre := "pablo"
edad := 18
El simbolo % al final de la palabra bool significa que ahí se ubica el final del texto
(dado que no usamos un println al final para dar el salto de línea).
Sprintf
Con esta utilidad podemos crear strings o cadenas para que luego puedan ser
impresas.
package main
import "fmt"
func main() {
// Sprintf
nombre := "pablo"
edad := 18
Curso Básico de GO 9
}
Funciones
package main
import "fmt"
func sayHello() {
fmt.Println("Hello!")
}
func main() {
sayHello()
sum(4, 6)
Curso Básico de GO 10
fmt.Println(num)
}
pkg.go.dev
Go is an open source programming language that makes it easy to
build simple, reliable, and efficient software.
https://pkg.go.dev/?utm_source=godoc
Ciclos
En el caso de Go solo poseemos un ciclo iterativo. For
package main
import "fmt"
func main() {
// For condicional
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// For while
counter := 0
for counter < 10 {
fmt.Println(counter)
Curso Básico de GO 11
counter++
}
// For forever
counterForever := 0
for {
fmt.Println(counterForever)
counterForever++
}
For Condicional
El tipico uso de For en lenguajes como Javascript, C y C++.
Necesita de una variable iterar, condición y cantidad a sumar/restar a este iterable.
For While
Implementación de el bucle while sin usar ese keyword. Simplmente se usa el for
For Forever
Al igual que un while true este se ejecutará por siempre. La implementación se basa en
solo un for seguido de un bloque de código {} .
Operadores de comparación
Son aquellos que retornan TRUE o FALSE en caso de cumplirse o no una expresión.
Son los siguientes:
Curso Básico de GO 12
valor1 > valor2: Retorna TRUE si valor1 es mayor que valor2
valor1 >= valor2: Retorna TRUE si valor1 es igual o mayor que valor2
valor1 <= valor2: Retorna TRUE si valor1 es menor o igual que valor2.
Operadores lógicos
Son aquellos que retorna TRUE o FALSE si cumplen o no una condición
utilizando puertas lógicas.
Ejemplo1: 1>0 && 2 >0 Esto retornará TRUE porque tanto la primera como la segunda
condición son verdaderas.
Ejemplo2: 2<0 && 1 > 0 Esto retornará FALSE porque una de las condiciones no es
verdadera.
Operador OR || :
Este operador indica que al menos una de las condiciones debe cumplirse para
marcarse como TRUE. En Go, se representa con el símbolo || .
Ejemplo: 2<0 || 1 > 0 Esto retornará TRUE porque la segunda condición se cumple, a
pesar que la primera no.
Operador NOT:
Este operador retornará el opuesto al boleano que está dentro de la variable. Ejemplo:
myBool :=true
fmt.Println(!myBool) // Esto retornará false
Condicional If
La sintaxis que debemos tener en cuenta para escribir condicionales es la siguiente:
Curso Básico de GO 13
if <condicion>{
// codigo
} else {
// codigo
}
package main
import "fmt"
func main() {
// If
valor1 := 1
if valor1 == 1 {
fmt.Println("Es 1")
} else {
fmt.Println("No es 1")
}
// AND
valor2 := 2
// OR
if valor1 == 0 || valor1 == 2 {
fmt.Println("Es 0 ó es 2")
} else {
fmt.Println("No es 0 ó 2")
}
// NOT
if valor1 != 1 {
fmt.Println("No es 1")
}
Curso Básico de GO 14
Conversion de tipos
Para estas conversiones necesitamos de la libreria strconv . La cual debemos importar.
Texto a Número
Importando la librería strconv y usando Atoi con un parametro como string este nos
retornará ese valor pero en entero.
Además de eso, la función Atoi ascii to int nos devuelve el valor y el error (posible).
Si el error ( err ) es igual a nil significa que el valor dado como parametro ES VALIDO.
Entonces creamos una condición la cual verifique si es diferente a este valor, y si lo es,
que nos muestre un error por pantalla (usando log.Fatal(err) )
Número a Texto
i := strconv.Itoa(33)
fmt.Println(i) // "33"
Al usar Itoa int to ascii solo necesitamos recibir un valor, a diferencia de recibir el error
como en Atoi .
Parse…
Para covertir una string a booleanos usamos ParseBool(str) .
Para convertir una string en flotante usamos ParseFloat(str, bits) .
Curso Básico de GO 15
strconv
Package strconv implements conversions to and from string representations of basic data types. Numeric
Conversions ¶ The most common numeric conversions are Atoi (string to int) and Itoa (int to string). i, err :=
strconv.Atoi("-42") s := strconv.Itoa(-42) These assume decimal and the Go int type.
https://pkg.go.dev/strconv
Switch
Con switch podemos evitar tener multiples condiciones if anidadas.
Con condición
Con case podemos definir que hacer a partir del valor que demos, como este caso,
hacemos un caso para cuando la variable modulo sea 0 y un caso por defecto default
para cuando ningún caso corresponda.
package main
import "fmt"
func main() {
text := "y"
switch text {
case "x", "y", "z":
fmt.Println("X, Y ó Z")
Curso Básico de GO 16
default:
fmt.Println("Una letra")
}
}
Una forma de omitir escribir multiples veces casos que solo cambie su condición y su
código a ejecutar sea el mismo es declarar casos con sus condiciones seguidads por
comas.
Tenemos que en el caso de que sea x , y o z la variable text se ejecutará el mismo
bloque de código.
Sin condición
package main
import "fmt"
func main() {
// Sin condicion
value := 4
switch {
case value > 10:
fmt.Println("Mayor que 10")
case value < 0:
fmt.Println("Menor que 0")
default:
fmt.Println("Entre 0 y 10")
}
}
Otra forma de usar switch es usarlo directamente como un if sin darle una
variable/condición al iniciar el bloque.
package main
import "fmt"
Curso Básico de GO 17
func main() {
defer fmt.Println("Mundo")
fmt.Println("Hola")
Este keyword nos sirve para ejecutar una línea de código al final de la ejecución del
programa.
Continue
Con el keyword continue podemos producir que un bucle salte/continue a la siguiente
iteración.
package main
import "fmt"
func main() {
// continue
for i := 1; i < 6; i++ {
if i%2 == 0 {
fmt.Printf("El %d es par\n", i)
continue
}
fmt.Println(i)
}
}
Curso Básico de GO 18
En este código ocurre que al ser nuestra variable i par escribiremos que su valor es
par y continuaremos a la siguiente iteración (siguiente valor de i ). Evitando que el
código de más abajo imprima los valores pares.
Break
Con break podemos parar la ejecución de los bucles.
En estos ejemplos vemos el uso de break en for while escritos de distinta forma en Go.
Arrays y Slices
Curso Básico de GO 19
Arrays
Los arrays o listas tienen un largo definido al crear el array. Este no puede recibir más
valores que los especificados en la declaración del array y debe ser de un unico tipo,
especificado en la declaración.
Por defecto los arrays al ser creados rellenan los valores vacios (en este caso enteros)
con ceros.
Si fuera un array de strings este se llenaria con espacios " " vacios.
package main
import "fmt"
func main() {
// arrays
var array [4]int
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
fmt.Println(array)
fmt.Println(len(array), cap(array))
fmt.Println(array[0:2])
fmt.Println(array[2:4])
}
Curso Básico de GO 20
Al imprimir los arrays este nos los muestra de la forma [x x x x] .
Poseemos funciones que nos permiten ver el largo de un array (elementos usados).
len(array)
💡 Los arrays son inmutables, lo que significa que su largo no puede ser
modificado, pero no significa que los valores que contenga el array no
puedan ser cambiados.
Slices
Los slices a diferencia de los arreglos pueden ser declarados a una variable con los
datos incluidos y sin necesidad de darle un largo predefinido.
package main
import "fmt"
func main() {
// Slices
var slice = []int{0, 1, 2, 3, 4, 5, 6}
fmt.Println(slice)
Curso Básico de GO 21
fmt.Println(len(slice), cap(slice))
// metodos en el slice
fmt.Println(slice[0])
fmt.Println(slice[:3])
fmt.Println(slice[2:4])
fmt.Println(slice[4:])
Los slices comparten casi las mismas caracteristicas que los arreglos pero estos
pueden ser más faciles de aplicar cuando no tenemos claro el largo que necesitamos.
slice := []int{1,2,3,4}
slice = append(slice, 5)
fmt.Println(slice) // [1 2 3 4 5]
Curso Básico de GO 22
slice1 := []int{1,2,3,4}
slice2 := []int{5,6,7,8}
slice1 = append(slice1, slice2...)
fmt.Println(slice) // [1 2 3 4 5 6 7 8]
slice3 := []int{1, 2, 3, 4}
slice3 = append(slice3, 5, 6, 7, 8)
fmt.Println(slice3) // [1 2 3 4 5 6 7 8]
import "fmt"
func main() {
slice := []string{"Tierra", "Marte", "Venus"}
El primer for : Al usar la función range y pasandole como parametro el slice, esta
función nos devolverá 2 iterables. Los cuales corresponen al indice y valor de nuestro
slice.
Curso Básico de GO 23
}
El segundo for : Como sabemos, en Go no podemos dejar ninguna función sin usar.
Dado eso usamos el _ para indicar que no usaremos dicha variable, con lo cuál
podemos mostrar solo los valores del slice por pantalla.
El tercer for : Es una simplificación del segundo for , si solo queremos el indice, solo
debemos definir una variable receptora. Esto propociona que solo se entregen indices.
Palindromos
package main
import (
"fmt"
"strings"
)
Curso Básico de GO 24
text += string(strg[i])
}
if strings.ToLower(strg) == strings.ToLower(text) {
return true
} else {
return false
}
}
func main() {
string := "Ema, si vas, avisame"
fmt.Printf("La palabra '%s' ", string)
if esPalindromo(string) {
fmt.Println("Es Palindromo")
} else {
fmt.Println("No es Palindromo")
}
strings
Package strings implements simple functions to manipulate UTF-8 encoded strings. For information about UTF-
8 strings in Go, see https://blog.golang.org/strings.
https://pkg.go.dev/strings?utm_source=godoc#example-Join
Recorrer Maps
func main() {
m := make(map[string]int)
m["Jose"] = 14
m["Pedro"] = 16
m["Maria"] = 23
m["Emma"] = 3
fmt.Println(m)
// recorrer maps
for i, val := range m {
fmt.Println(i, val)
}
}
Curso Básico de GO 25
Los maps al usar de forma nativa la concurrencia suponen una diferencia frente a los
slices, además de no tener indices, teniendo por su parte llaves y valors, estos no
tienen un orden especifico.
Cada vez que llamemos a la función main esta nos imprimirá un orden distinto del Map.
Encontrar valores
Para encontrar valores solo debemos saber la llave. En estos casos las llaves
disponibles erían “Jose” , “Maria” , “Emma” y “Pedro” .
// encontrar valores
value := m["Jose"]
fmt.Println(value) // 14
value, ok := m["Pablo"]
fmt.Println(value, ok) // 0 false
Curso Básico de GO 26
valor correcto, si es un valor falso nos indica que la llave no existe)
value, ok := m["Pablo"]
fmt.Println(value, ok) // 0 false
Al “Pablo” no existir en el Map nos devuelve por defecto el ZeroValue del tipo de dato
usado (int) y con la variable ok recibimos el posible error. Luego de esto seguiría
comprobar si ok es verdadero o falso para indicar al usuario si la llave es o no valida.
value, ok := m["Pablo"]
fmt.Println(value, ok) // 0 false
if ok{
fmt.Printf("El valor de la llave %s es %d", "Pablo", value)
} else{
fmt.Println("La llave no existe")
}
maps
This section is empty. This section is empty. This section is empty.
https://pkg.go.dev/github.com/ross-oreto/go-list-map?utm_source=godoc
Curso Básico de GO 27
Para usar este Struct debemo instanciarlo:
package main
import "fmt"
func main() {
// instanciar
firstCar := car{brand: "Honda", year: 2021, color: "blue"}
fmt.Println(firstCar)
}
Al instanciar de esta forma estamos llenando todos los valores del struct.
package main
import "fmt"
func main() {
// otra forma de instanciar
var secondCar car
secondCar.brand = "Tesla"
fmt.Println(secondCar)
}
Curso Básico de GO 28
Al instanciar de esta forma estamos creando una variable con su tipo de dato dado por
car .
Además de eso, no estamos llenando todos los valores del struct, estamos solo
dandole una marca al usar la dot notation para acceder a sus atributos (variables de
una clase).
instancia.atributo = valor
Al no tener todos los valores llenos con un valor estos tendrán por defecto el ZeroValue
de su tipo.
Modificadores de Acceso
Curso Básico de GO 29