diff --git a/public/defer b/public/defer new file mode 100644 index 000000000..144c6a69b --- /dev/null +++ b/public/defer @@ -0,0 +1,235 @@ + + + + + + Go by Example: Defer + + + + + +
+

Go by Example: Defer

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Defer se utiliza para asegurar que una llamada a función se + realice más tarde en la ejecución de un programa, generalmente para + propósitos de limpieza. defer se usa a menudo donde, por ejemplo, + ensure y finally se utilizarían en otros lenguajes. +

+ +
+ + +
+ + + +
package main
+
+ + + +
import (
+    "fmt"
+    "os"
+)
+
+ +

Supongamos que queremos crear un archivo, escribir en él, + y luego cerrarlo cuando hayamos terminado. Así es como podríamos + hacerlo con defer.

+ +
+ +
func main() {
+
+ +

Inmediatamente después de obtener un objeto de archivo con + createFile, diferimos el cierre de ese archivo + con closeFile. Esto se ejecutará al final + de la función que lo encierra (main), después de que + writeFile haya terminado. +

+ + +
+ +
    f := createFile("/tmp/defer.txt")
+    defer closeFile(f)
+    writeFile(f)
+}
+
+ + + +
func createFile(p string) *os.File {
+    fmt.Println("creating")
+    f, err := os.Create(p)
+    if err != nil {
+        panic(err)
+    }
+    return f
+}
+
+ + + +
func writeFile(f *os.File) {
+    fmt.Println("writing")
+    fmt.Fprintln(f, "data")
+
+ + + +
}
+
+ +

Es importante verificar si hay errores al cerrar un + archivo, incluso en una función diferida.

+ + +
+ +
func closeFile(f *os.File) {
+    fmt.Println("closing")
+    err := f.Close()
+
+ + + +
    if err != nil {
+        fmt.Fprintf(os.Stderr, "error: %v\n", err)
+        os.Exit(1)
+    }
+}
+
+ + + + + + + + +
+ +

Ejecutar el programa confirma que el archivo se cierra + después de ser escrito.

+
+ +
$ go run defer.go
+creating
+writing
+closing
+
+ + +

+ Siguiente ejemplo: Recover. +

+ + + + +
+ + + + + \ No newline at end of file diff --git a/public/json.html b/public/json.html index 3b1a0722c..142db1f8d 100644 --- a/public/json.html +++ b/public/json.html @@ -1,335 +1,408 @@ - - - Go by Example: JSON - - - - -
-

Go by Example: JSON

- - - - - - - - - - - - - - - - + + + + + + + +
-

Go offers built-in support for JSON encoding and -decoding, including to and from built-in and custom -data types.

- -
- - -
- - - -
package main
-
- - - + + + + Go by Example: JSON + + + + + +
+

Go by Example: JSON

+ + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - -
+ +

Go ofrece soporte integrado para la codificación y + decodificación de JSON, incluyendo para tipos de datos + integrados y personalizados.

+ +
+ + +
+ + + +
package main
+
+ + +
import (
     "encoding/json"
     "fmt"
     "os"
 )
-
-

We’ll use these two structs to demonstrate encoding and -decoding of custom types below.

- -
- +
+ +

Usaremos estas dos estructuras para demostrar la codificación y + decodificación de tipos personalizados a continuación.

+ + +
+
type response1 struct {
     Page   int
     Fruits []string
 }
-
-

Only exported fields will be encoded/decoded in JSON. -Fields must start with capital letters to be exported.

- -
- +
+ +

Solo los campos exportados serán codificados/decodificados en JSON. + Los campos deben comenzar con letras mayúsculas para ser exportados.

+ +
+
type response2 struct {
     Page   int      `json:"page"`
     Fruits []string `json:"fruits"`
 }
-
- - - -
func main() {
-
-

First we’ll look at encoding basic data types to -JSON strings. Here are some examples for atomic -values.

- -
- -
    bolB, _ := json.Marshal(true)
+        
+ + + +
func main() {
+
+ +

Primero veremos la codificación de tipos de datos básicos a + cadenas JSON. Aquí hay algunos ejemplos para valores atómicos.

+ + +
+ +
    bolB, _ := json.Marshal(true)
     fmt.Println(string(bolB))
-
- - - -
    intB, _ := json.Marshal(1)
+        
+ + + +
    intB, _ := json.Marshal(1)
     fmt.Println(string(intB))
-
- - - -
    fltB, _ := json.Marshal(2.34)
+        
+ + + +
    fltB, _ := json.Marshal(2.34)
     fmt.Println(string(fltB))
-
- - - -
    strB, _ := json.Marshal("gopher")
+        
+ + + +
    strB, _ := json.Marshal("gopher")
     fmt.Println(string(strB))
-
-

And here are some for slices and maps, which encode -to JSON arrays and objects as you’d expect.

- -
- -
    slcD := []string{"apple", "peach", "pear"}
+        
+ +

Y aquí hay algunos para slices y mapas, que se codifican + en arreglos y objetos JSON como esperarías.

+
+ +
    slcD := []string{"apple", "peach", "pear"}
     slcB, _ := json.Marshal(slcD)
     fmt.Println(string(slcB))
-
- - - -
    mapD := map[string]int{"apple": 5, "lettuce": 7}
+        
+ + + +
    mapD := map[string]int{"apple": 5, "lettuce": 7}
     mapB, _ := json.Marshal(mapD)
     fmt.Println(string(mapB))
-
-

The JSON package can automatically encode your -custom data types. It will only include exported -fields in the encoded output and will by default -use those names as the JSON keys.

- -
- -
    res1D := &response1{
+        
+ +

El paquete JSON puede codificar automáticamente tus + tipos de datos personalizados. Solo incluirá campos exportados + en la salida codificada y por defecto + usará esos nombres como las claves JSON.

+
+ +
    res1D := &response1{
         Page:   1,
         Fruits: []string{"apple", "peach", "pear"}}
     res1B, _ := json.Marshal(res1D)
     fmt.Println(string(res1B))
-
-

You can use tags on struct field declarations -to customize the encoded JSON key names. Check the -definition of response2 above to see an example -of such tags.

- -
- -
    res2D := &response2{
+        
+ +

Puedes usar etiquetas en las declaraciones de campos de estructuras + para personalizar los nombres de las claves JSON codificadas. Revisa la + definición de response2 arriba para ver un ejemplo + de tales etiquetas.

+ + +
+ +
    res2D := &response2{
         Page:   1,
         Fruits: []string{"apple", "peach", "pear"}}
     res2B, _ := json.Marshal(res2D)
     fmt.Println(string(res2B))
-
-

Now let’s look at decoding JSON data into Go -values. Here’s an example for a generic data -structure.

- -
- -
    byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
-
-

We need to provide a variable where the JSON -package can put the decoded data. This -map[string]interface{} will hold a map of strings -to arbitrary data types.

- -
- -
    var dat map[string]interface{}
-
-

Here’s the actual decoding, and a check for -associated errors.

- -
- -
    if err := json.Unmarshal(byt, &dat); err != nil {
+        
+ +

Ahora veamos la decodificación de datos JSON en valores de Go. + Aquí hay un ejemplo para una estructura de datos genérica.

+
+ +
    byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
+
+ +

Necesitamos proporcionar una variable donde el paquete JSON + pueda poner los datos decodificados. Este + map[string]interface{} contendrá un mapa de cadenas + a tipos de datos arbitrarios. +

+ + +
+ +
    var dat map[string]interface{}
+
+ +

Aquí está la decodificación real y una verificación de + errores asociados.

+ +
+ +
    if err := json.Unmarshal(byt, &dat); err != nil {
         panic(err)
     }
     fmt.Println(dat)
-
-

In order to use the values in the decoded map, -we’ll need to convert them to their appropriate type. -For example here we convert the value in num to -the expected float64 type.

- -
- -
    num := dat["num"].(float64)
+        
+ +

Para usar los valores en el mapa decodificado, + necesitaremos convertirlos a su tipo apropiado. + Por ejemplo, aquí convertimos el valor en num al + tipo float64 esperado.

+ + + +
+ +
    num := dat["num"].(float64)
     fmt.Println(num)
-
-

Accessing nested data requires a series of -conversions.

- -
- -
    strs := dat["strs"].([]interface{})
+        
+ +

Acceder a datos anidados requiere una serie de + conversiones.

+
+ +
    strs := dat["strs"].([]interface{})
     str1 := strs[0].(string)
     fmt.Println(str1)
-
-

We can also decode JSON into custom data types. -This has the advantages of adding additional -type-safety to our programs and eliminating the -need for type assertions when accessing the decoded -data.

- -
- -
    str := `{"page": 1, "fruits": ["apple", "peach"]}`
+        
+ +

También podemos decodificar JSON en tipos de datos personalizados. + Esto tiene las ventajas de agregar seguridad de tipo adicional + a nuestros programas y eliminar la + necesidad de afirmaciones de tipo al acceder a los datos + decodificados.

+ +
+ +
    str := `{"page": 1, "fruits": ["apple", "peach"]}`
     res := response2{}
     json.Unmarshal([]byte(str), &res)
     fmt.Println(res)
     fmt.Println(res.Fruits[0])
-
-

In the examples above we always used bytes and -strings as intermediates between the data and -JSON representation on standard out. We can also -stream JSON encodings directly to os.Writers like -os.Stdout or even HTTP response bodies.

- -
- +
+ +

En los ejemplos anteriores siempre usamos bytes y + cadenas como intermediarios entre los datos y + la representación JSON en la salida estándar. También podemos + transmitir codificaciones JSON directamente a os.Writers como + os.Stdout o incluso cuerpos de respuesta HTTP. +

+ + + +
+
    enc := json.NewEncoder(os.Stdout)
     d := map[string]int{"apple": 5, "lettuce": 7}
     enc.Encode(d)
 }
-
- - - - - - + + +
- - - -
$ go run json.go
+        
+ + + + + + - - - - - - - -
+ + + +
$ go run json.go
 true
 1
 2.34
@@ -344,32 +417,36 @@ 

Go by Example: JSON

{1 [apple peach]} apple {"apple":5,"lettuce":7}
-
-

We’ve covered the basic of JSON in Go here, but check -out the JSON and Go -blog post and JSON package docs -for more.

- -
- - -
- - -

- Siguiente ejemplo: XML. -

- - -
+ +

Hemos cubierto lo básico de JSON en Go aquí, pero consulta + la publicación del blog JSON and Go + y la documentación del paquete JSON + para más información.

+
+ + +
+ + +

+ Siguiente ejemplo: XML. +

+ + + -
- - - - + + + + + + \ No newline at end of file diff --git a/public/panic b/public/panic new file mode 100644 index 000000000..4bb90c609 --- /dev/null +++ b/public/panic @@ -0,0 +1,218 @@ + + + + + + Go by Example: Panic + + + + + +
+

Go by Example: Panic

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Un panic generalmente significa que algo salió inesperadamente + mal. Mayormente lo usamos para fallar rápidamente en errores que + no deberían ocurrir durante la operación normal, o que no estamos + preparados para manejar de manera elegante.

+
+ + +
+ + + +
package main
+
+ + + +
import "os"
+
+ + + +
func main() {
+
+ +

Usaremos panic a lo largo de este sitio para verificar + errores inesperados. Este es el único programa en el + sitio diseñado para causar un panic.

+ +
+ +
    panic("a problem")
+
+ +

Un uso común de panic es abortar si una función + devuelve un valor de error que no sabemos cómo + (o queremos) manejar. Aquí hay un ejemplo de + causar un panic si obtenemos un error inesperado al crear un nuevo archivo. +

+ +
+ +
    _, err := os.Create("/tmp/file")
+    if err != nil {
+        panic(err)
+    }
+}
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ +

Ejecutar este programa causará que entre en panic, imprima + un mensaje de error y rastreos de goroutine, y salga con + un estado no cero.

+ + +
+ + +
+ +

Cuando el primer panic en main se dispara, el programa se cierra + sin alcanzar el resto del código. Si te gustaría + ver al programa intentar crear un archivo temporal, comenta + el primer panic.

+ +
+ +
$ go run panic.go
+panic: a problem
+
+ + + +
goroutine 1 [running]:
+main.main()
+    /.../panic.go:12 +0x47
+...
+exit status 2
+
+ +

Nota que, a diferencia de algunos lenguajes que usan excepciones + para el manejo de muchos errores, en Go es idiomático + usar valores de retorno que indican errores siempre que sea posible.

+ +
+ + +
+ + +

+ Siguiente ejemplo: Defer. +

+ + + + +
+ + + + + \ No newline at end of file diff --git a/public/recover b/public/recover new file mode 100644 index 000000000..34efa31be --- /dev/null +++ b/public/recover @@ -0,0 +1,223 @@ + + + + + + Go by Example: Recover + + + + + +
+

Go by Example: Recover

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Go hace posible recuperarse de un pánico, utilizando + la función incorporada recover. Un recover puede + detener un panic para que no aborte el programa y permitir + que continúe con la ejecución en su lugar.

+
+ + +
+ +

Un ejemplo de dónde esto puede ser útil: un servidor + no querría colapsar si una de las conexiones de los clientes + muestra un error crítico. En cambio, el servidor querría + cerrar esa conexión y continuar atendiendo + a otros clientes. De hecho, esto es lo que hace por defecto + el net/http de Go para los servidores HTTP.

+ +
+ + +
+ + + +
package main
+
+ + + +
import "fmt"
+
+ +

Esta función causa un pánico.

+ + +
+ +
func mayPanic() {
+    panic("a problem")
+}
+
+ +

recover debe ser llamado dentro de una función diferida. + Cuando la función que lo encierra causa un pánico, el defer + se activará y una llamada a recover dentro de él capturará + el pánico.

+ +
+ +
func main() {
+
+ +

El valor de retorno de recover es el error generado en + la llamada a panic.

+ + +
+ +
    defer func() {
+        if r := recover(); r != nil {
+
+ + + +
            fmt.Println("Recovered. Error:\n", r)
+        }
+    }()
+
+ + + +
    mayPanic()
+
+ +

Este código no se ejecutará, porque mayPanic causa un pánico. + La ejecución de main se detiene en el punto del + pánico y se reanuda en el cierre diferido.

+ +
+ +
    fmt.Println("After mayPanic()")
+}
+
+ + + + + + + + +
+ + + +
$ go run recover.go
+Recovered. Error:
+ a problem
+
+ + +

+ Siguiente ejemplo: String Functions. +

+ + + + +
+ + + + + \ No newline at end of file diff --git a/public/regular-expressions.html b/public/regular-expressions.html index 7cd4ab96c..1de1b1e9d 100644 --- a/public/regular-expressions.html +++ b/public/regular-expressions.html @@ -1,270 +1,335 @@ - - - Go by Example: Regular Expressions - - - - -
-

Go by Example: Regular Expressions

- - - - - - - - - - - - - - - - + + + + + + + +
-

Go offers built-in support for regular expressions. -Here are some examples of common regexp-related tasks -in Go.

- -
- - -
- - - -
package main
-
- - - + + + + Go by Example: Regular Expressions + + + + + +
+

Go by Example: Regular Expressions

+ + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - -
+ +

Go ofrece soporte integrado para expresiones + regulares. + Aquí hay algunos ejemplos de tareas comunes relacionadas con regexp + en Go.

+ +
+ + +
+ + + +
package main
+
+ + +
import (
     "bytes"
     "fmt"
     "regexp"
 )
-
- - - -
func main() {
-
-

This tests whether a pattern matches a string.

- -
- -
    match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
+        
+ + + +
func main() {
+
+ +

Esto prueba si un patrón coincide con una cadena.

+ + +
+ +
    match, _ := regexp.MatchString("p([a-z]+)ch", "peach")
     fmt.Println(match)
-
-

Above we used a string pattern directly, but for -other regexp tasks you’ll need to Compile an -optimized Regexp struct.

- -
- -
    r, _ := regexp.Compile("p([a-z]+)ch")
-
-

Many methods are available on these structs. Here’s -a match test like we saw earlier.

- -
- -
    fmt.Println(r.MatchString("peach"))
-
-

This finds the match for the regexp.

- -
- -
    fmt.Println(r.FindString("peach punch"))
-
-

This also finds the first match but returns the -start and end indexes for the match instead of the -matching text.

- -
- -
    fmt.Println("idx:", r.FindStringIndex("peach punch"))
-
-

The Submatch variants include information about -both the whole-pattern matches and the submatches -within those matches. For example this will return -information for both p([a-z]+)ch and ([a-z]+).

- -
- -
    fmt.Println(r.FindStringSubmatch("peach punch"))
-
-

Similarly this will return information about the -indexes of matches and submatches.

- -
- -
    fmt.Println(r.FindStringSubmatchIndex("peach punch"))
-
-

The All variants of these functions apply to all -matches in the input, not just the first. For -example to find all matches for a regexp.

- -
- -
    fmt.Println(r.FindAllString("peach punch pinch", -1))
-
-

These All variants are available for the other -functions we saw above as well.

- -
- -
    fmt.Println("all:", r.FindAllStringSubmatchIndex(
+        
+ +

Arriba usamos un patrón de cadena directamente, pero para + otras tareas de regexp necesitarás Compile una + estructura Regexp optimizada.

+ +
+ +
    r, _ := regexp.Compile("p([a-z]+)ch")
+
+ +

Hay muchos métodos disponibles en estas estructuras. Aquí hay + una prueba de coincidencia como la que vimos anteriormente.

+ + +
+ +
    fmt.Println(r.MatchString("peach"))
+
+ +

Esto encuentra la coincidencia para la regexp.

+
+ +
    fmt.Println(r.FindString("peach punch"))
+
+ +

Esto también encuentra la primera coincidencia pero devuelve los + índices de inicio y fin para la coincidencia en lugar del + texto coincidente.

+ +
+ +
    fmt.Println("idx:", r.FindStringIndex("peach punch"))
+
+ +

Las variantes de Submatch incluyen información sobre + las coincidencias del patrón completo y las subcoincidencias + dentro de esas coincidencias. Por ejemplo, esto devolverá + información tanto para p([a-z]+)ch como para ([a-z]+).

+ + +
+ +
    fmt.Println(r.FindStringSubmatch("peach punch"))
+
+ +

De manera similar, esto devolverá información sobre los + índices de coincidencias y subcoincidencias.

+
+ +
    fmt.Println(r.FindStringSubmatchIndex("peach punch"))
+
+ +

Las variantes de All de estas funciones se aplican a todas + las coincidencias en la entrada, no solo a la primera. Por + ejemplo, para encontrar todas las coincidencias de una regexp.

+
+ +
    fmt.Println(r.FindAllString("peach punch pinch", -1))
+
+ +

Estas variantes de All están disponibles también para las otras + funciones que vimos anteriormente.

+ +
+ +
    fmt.Println("all:", r.FindAllStringSubmatchIndex(
         "peach punch pinch", -1))
-
-

Providing a non-negative integer as the second -argument to these functions will limit the number -of matches.

- -
- -
    fmt.Println(r.FindAllString("peach punch pinch", 2))
-
-

Our examples above had string arguments and used -names like MatchString. We can also provide -[]byte arguments and drop String from the -function name.

- -
- -
    fmt.Println(r.Match([]byte("peach")))
-
-

When creating global variables with regular -expressions you can use the MustCompile variation -of Compile. MustCompile panics instead of -returning an error, which makes it safer to use for -global variables.

- -
- -
    r = regexp.MustCompile("p([a-z]+)ch")
+        
+ +

Proporcionar un entero no negativo como segundo + argumento a estas funciones limitará el número + de coincidencias.

+ +
+ +
    fmt.Println(r.FindAllString("peach punch pinch", 2))
+
+ +

Nuestros ejemplos anteriores tenían argumentos de cadena y usaban + nombres como MatchString. También podemos proporcionar + argumentos de []byte y eliminar String del + nombre de la función. +

+ +
+ +
    fmt.Println(r.Match([]byte("peach")))
+
+ +

Cuando creas variables globales con expresiones regulares, puedes usar la variación + MustCompile + de Compile. MustCompile genera un pánico en lugar de + devolver un error, lo que lo hace más seguro para usar en + variables globales. +

+ +
+ +
    r = regexp.MustCompile("p([a-z]+)ch")
     fmt.Println("regexp:", r)
-
-

The regexp package can also be used to replace -subsets of strings with other values.

- -
- -
    fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))
-
-

The Func variant allows you to transform matched -text with a given function.

- -
- +
+ +

El paquete regexp también puede ser utilizado para reemplazar + subconjuntos de cadenas con otros valores.

+ + +
+ +
    fmt.Println(r.ReplaceAllString("a peach", "<fruit>"))
+
+ +

La variante Func te permite transformar el texto coincidente + con una función dada.

+ +
+
    in := []byte("a peach")
     out := r.ReplaceAllFunc(in, bytes.ToUpper)
     fmt.Println(string(out))
 }
-
- - - - - - + + +
- - - +
+ + + + + + - - - - - - - -
+ + +
$ go run regular-expressions.go
 true
 true
@@ -279,30 +344,34 @@ 

Go by Example: Regular Expressions

regexp: p([a-z]+)ch a <fruit> a PEACH
-
-

For a complete reference on Go regular expressions check -the regexp package docs.

- -
- - -
- - -

- Siguiente ejemplo: JSON. -

- - -
+ +

Para una referencia completa sobre las expresiones regulares de Go consulta + la documentación del paquete regexp. +

+ + +
+ + +
+ + +

+ Siguiente ejemplo: JSON. +

+ + + -
- - - - + + + + + + \ No newline at end of file diff --git a/public/sorting b/public/sorting new file mode 100644 index 000000000..9518e0e80 --- /dev/null +++ b/public/sorting @@ -0,0 +1,176 @@ + + + + + + Go by Example: Sorting + + + + + +
+

Go by Example: Sorting

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

El paquete slices de Go implementa la ordenación para tipos integrados + y tipos definidos por el usuario. Primero veremos la ordenación para + tipos integrados.

+ +
+ + +
+ + + +
package main
+
+ + + +
import (
+    "fmt"
+    "slices"
+)
+
+ + + +
func main() {
+
+ +

Las funciones de ordenación son genéricas y funcionan para cualquier + tipo integrado ordenado. Para ver una lista de tipos ordenados, + consulta cmp.Ordered. +

+ + + +
+ +
    strs := []string{"c", "a", "b"}
+    slices.Sort(strs)
+    fmt.Println("Strings:", strs)
+
+ +

Un ejemplo de ordenación de ints.

+
+ +
    ints := []int{7, 2, 4}
+    slices.Sort(ints)
+    fmt.Println("Ints:   ", ints)
+
+ +

También podemos usar el paquete slices para comprobar si + un slice ya está en orden ordenado.

+
+ +
    s := slices.IsSorted(ints)
+    fmt.Println("Sorted: ", s)
+}
+
+ + + + + + + + +
+ + + +
$ go run sorting.go
+Strings: [a b c]
+Ints:    [2 4 7]
+Sorted:  true
+
+ + +

+ Siguiente ejemplo: Sorting by Functions. +

+ + + + +
+ + + + + \ No newline at end of file diff --git a/public/sorting-by-functions b/public/sorting-by-functions new file mode 100644 index 000000000..5350ca776 --- /dev/null +++ b/public/sorting-by-functions @@ -0,0 +1,219 @@ + + + + + + Go by Example: Sorting by Functions + + + + + +
+

Go by Example: Sorting by Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

A veces querremos ordenar una colección por algo + distinto a su orden natural. Por ejemplo, supongamos que + queremos ordenar cadenas por su longitud en lugar de + alfabéticamente. Aquí hay un ejemplo de ordenaciones personalizadas + en Go.

+ +
+ + +
+ + + +
package main
+
+ + + +
import (
+    "cmp"
+    "fmt"
+    "slices"
+)
+
+ + + +
func main() {
+    fruits := []string{"peach", "banana", "kiwi"}
+
+ +

Implementamos una función de comparación para la longitud de las cadenas. + cmp.Compare es útil para esto. +

+ + +
+ +
    lenCmp := func(a, b string) int {
+        return cmp.Compare(len(a), len(b))
+    }
+
+ +

Ahora podemos llamar a slices.SortFunc con esta función de comparación personalizada + para ordenar fruits por la longitud del nombre.

+
+ +
    slices.SortFunc(fruits, lenCmp)
+    fmt.Println(fruits)
+
+ +

Podemos usar la misma técnica para ordenar un slice de + valores que no son tipos integrados.

+ +
+ +
    type Person struct {
+        name string
+        age  int
+    }
+
+ + + +
    people := []Person{
+        Person{name: "Jax", age: 37},
+        Person{name: "TJ", age: 25},
+        Person{name: "Alex", age: 72},
+    }
+
+ +

Ordenar people por edad usando slices.SortFunc.

+ + +

Nota: si la estructura Person es grande, + quizás quieras que el slice contenga *Person en su lugar + y ajustar la función de ordenación en consecuencia. Si tienes + dudas, ¡haz un benchmark!

+ +
+ +
    slices.SortFunc(people,
+        func(a, b Person) int {
+            return cmp.Compare(a.age, b.age)
+        })
+    fmt.Println(people)
+}
+
+ + + + + + + + +
+ + + +
$ go run sorting-by-functions.go 
+[kiwi peach banana]
+[{TJ 25} {Jax 37} {Alex 72}]
+
+ + +

+ Siguiente ejemplo: Panic. +

+ + + + +
+ + + + + \ No newline at end of file diff --git a/public/string-formatting.html b/public/string-formatting.html index 73793cdfd..d76372a70 100644 --- a/public/string-formatting.html +++ b/public/string-formatting.html @@ -1,369 +1,450 @@ - - - Go by Example: String Formatting - - - - -
-

Go by Example: String Formatting

- - - - - - - - - - - - - - - - + + +
-

Go offers excellent support for string formatting in -the printf tradition. Here are some examples of -common string formatting tasks.

- -
- - -
- - - -
package main
-
- - - + + + + Go by Example: String Formatting + + + + + +
+

Go by Example: String Formatting

+ + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - -
+ +

Go ofrece un excelente soporte para el formato de cadenas al + estilo de printf. Aquí hay algunos ejemplos de + tareas comunes de formateo de cadenas.

+
+ + +
+ + + +
package main
+
+ + +
import (
     "fmt"
     "os"
 )
-
- - - +
+ + +
type point struct {
     x, y int
 }
-
- - - -
func main() {
-
-

Go offers several printing “verbs” designed to -format general Go values. For example, this prints -an instance of our point struct.

- -
- -
    p := point{1, 2}
+        
+ + + +
func main() {
+
+ +

Go ofrece varios "verbos" de impresión diseñados para + formatear valores generales de Go. Por ejemplo, esto imprime + una instancia de nuestra estructura point.

+
+ +
    p := point{1, 2}
     fmt.Printf("struct1: %v\n", p)
-
-

If the value is a struct, the %+v variant will -include the struct’s field names.

- -
- -
    fmt.Printf("struct2: %+v\n", p)
-
-

The %#v variant prints a Go syntax representation -of the value, i.e. the source code snippet that -would produce that value.

- -
- -
    fmt.Printf("struct3: %#v\n", p)
-
-

To print the type of a value, use %T.

- -
- -
    fmt.Printf("type: %T\n", p)
-
-

Formatting booleans is straight-forward.

- -
- -
    fmt.Printf("bool: %t\n", true)
-
-

There are many options for formatting integers. -Use %d for standard, base-10 formatting.

- -
- -
    fmt.Printf("int: %d\n", 123)
-
-

This prints a binary representation.

- -
- -
    fmt.Printf("bin: %b\n", 14)
-
-

This prints the character corresponding to the -given integer.

- -
- -
    fmt.Printf("char: %c\n", 33)
-
-

%x provides hex encoding.

- -
- -
    fmt.Printf("hex: %x\n", 456)
-
-

There are also several formatting options for -floats. For basic decimal formatting use %f.

- -
- -
    fmt.Printf("float1: %f\n", 78.9)
-
-

%e and %E format the float in (slightly -different versions of) scientific notation.

- -
- -
    fmt.Printf("float2: %e\n", 123400000.0)
+        
+ +

Si el valor es una estructura, la variante %+v incluirá + los nombres de los campos de la estructura.

+
+ +
    fmt.Printf("struct2: %+v\n", p)
+
+ +

La variante %#v imprime una representación en sintaxis Go + del valor, es decir, el fragmento de código fuente que + produciría ese valor.

+
+ +
    fmt.Printf("struct3: %#v\n", p)
+
+ +

Para imprimir el tipo de un valor, usa %T.

+ + +
+ +
    fmt.Printf("type: %T\n", p)
+
+ +

Formatear booleanos es sencillo.

+
+ +
    fmt.Printf("bool: %t\n", true)
+
+ +

Hay muchas opciones para formatear enteros. + Usa %d para el formateo estándar en base 10.

+ + +
+ +
    fmt.Printf("int: %d\n", 123)
+
+ +

Esto imprime una representación binaria.

+ + +
+ +
    fmt.Printf("bin: %b\n", 14)
+
+ +

Esto imprime el carácter correspondiente al + entero dado.

+
+ +
    fmt.Printf("char: %c\n", 33)
+
+ +

%x proporciona codificación hexadecimal.

+ +
+ +
    fmt.Printf("hex: %x\n", 456)
+
+ +

También hay varias opciones de formateo para + flotantes. Para un formateo decimal básico usa %f.

+
+ +
    fmt.Printf("float1: %f\n", 78.9)
+
+ +

%e y %E formatean el flotante en (ligeramente + diferentes versiones de) notación científica.

+ + +
+ +
    fmt.Printf("float2: %e\n", 123400000.0)
     fmt.Printf("float3: %E\n", 123400000.0)
-
-

For basic string printing use %s.

- -
- -
    fmt.Printf("str1: %s\n", "\"string\"")
-
-

To double-quote strings as in Go source, use %q.

- -
- -
    fmt.Printf("str2: %q\n", "\"string\"")
-
-

As with integers seen earlier, %x renders -the string in base-16, with two output characters -per byte of input.

- -
- -
    fmt.Printf("str3: %x\n", "hex this")
-
-

To print a representation of a pointer, use %p.

- -
- -
    fmt.Printf("pointer: %p\n", &p)
-
-

When formatting numbers you will often want to -control the width and precision of the resulting -figure. To specify the width of an integer, use a -number after the % in the verb. By default the -result will be right-justified and padded with -spaces.

- -
- -
    fmt.Printf("width1: |%6d|%6d|\n", 12, 345)
-
-

You can also specify the width of printed floats, -though usually you’ll also want to restrict the -decimal precision at the same time with the -width.precision syntax.

- -
- -
    fmt.Printf("width2: |%6.2f|%6.2f|\n", 1.2, 3.45)
-
-

To left-justify, use the - flag.

- -
- -
    fmt.Printf("width3: |%-6.2f|%-6.2f|\n", 1.2, 3.45)
-
-

You may also want to control width when formatting -strings, especially to ensure that they align in -table-like output. For basic right-justified width.

- -
- -
    fmt.Printf("width4: |%6s|%6s|\n", "foo", "b")
-
-

To left-justify use the - flag as with numbers.

- -
- -
    fmt.Printf("width5: |%-6s|%-6s|\n", "foo", "b")
-
-

So far we’ve seen Printf, which prints the -formatted string to os.Stdout. Sprintf formats -and returns a string without printing it anywhere.

- -
- -
    s := fmt.Sprintf("sprintf: a %s", "string")
+        
+ +

Para imprimir cadenas básicas usa %s.

+
+ +
    fmt.Printf("str1: %s\n", "\"string\"")
+
+ +

Para poner comillas dobles a las cadenas como en el código fuente de Go, usa %q.

+ + + +
+ +
    fmt.Printf("str2: %q\n", "\"string\"")
+
+ +

Como con los enteros vistos anteriormente, %x representa + la cadena en base 16, con dos caracteres de salida + por cada byte de entrada.

+ + +
+ +
    fmt.Printf("str3: %x\n", "hex this")
+
+ +

Para imprimir una representación de un puntero, usa %p.

+ + +
+ +
    fmt.Printf("pointer: %p\n", &p)
+
+ +

Cuando formateas números a menudo querrás + controlar el ancho y la precisión de la figura resultante. + Para especificar el ancho de un entero, usa un + número después del % en el verbo. Por defecto el + resultado será justificado a la derecha y rellenado con + espacios.

+ +
+ +
    fmt.Printf("width1: |%6d|%6d|\n", 12, 345)
+
+ +

También puedes especificar el ancho de los flotantes impresos, + aunque normalmente también querrás restringir la + precisión decimal al mismo tiempo con la sintaxis + ancho.precisión.

+ + + +
+ +
    fmt.Printf("width2: |%6.2f|%6.2f|\n", 1.2, 3.45)
+
+ +

Para justificar a la izquierda, usa la bandera -.

+ +
+ +
    fmt.Printf("width3: |%-6.2f|%-6.2f|\n", 1.2, 3.45)
+
+ +

También puedes querer controlar el ancho al formatear + cadenas, especialmente para asegurar que se alineen en + salidas similares a tablas. Para un ancho justificado a la derecha básico.

+ + +
+ +
    fmt.Printf("width4: |%6s|%6s|\n", "foo", "b")
+
+ +

Para justificar a la izquierda usa la bandera - como con los números.

+
+ +
    fmt.Printf("width5: |%-6s|%-6s|\n", "foo", "b")
+
+ +

Hasta ahora hemos visto Printf, que imprime la + cadena formateada en os.Stdout. Sprintf formatea + y devuelve una cadena sin imprimirla en ningún lugar.

+ + +
+ +
    s := fmt.Sprintf("sprintf: a %s", "string")
     fmt.Println(s)
-
-

You can format+print to io.Writers other than -os.Stdout using Fprintf.

- -
- +
+ +

Puedes formatear+imprimir en io.Writers distintos de + os.Stdout usando Fprintf. +

+
+
    fmt.Fprintf(os.Stderr, "io: an %s\n", "error")
 }
-
- - - - - - + + +
- - - -
$ go run string-formatting.go
+        
+ + + + + + - - -
+ + + +
$ go run string-formatting.go
 struct1: {1 2}
 struct2: {x:1 y:2}
 struct3: main.point{x:1, y:2}
@@ -387,18 +468,18 @@ 

Go by Example: String Formatting

width5: |foo |b | sprintf: a string io: an error
-
- - -

- Siguiente ejemplo: Text Templates. -

- - -
+ + +

+ Siguiente ejemplo: Text Templates. +

+ + + -
- - - - + + + + + + \ No newline at end of file diff --git a/public/string-functions.html b/public/string-functions.html index c810465a2..e82cfcbce 100644 --- a/public/string-functions.html +++ b/public/string-functions.html @@ -1,101 +1,120 @@ - - - Go by Example: String Functions - - - - -
-

Go by Example: String Functions

- - - - - - - - - - - - - - - - + + +
-

The standard library’s strings package provides many -useful string-related functions. Here are some examples -to give you a sense of the package.

- -
- - -
- - - -
package main
-
- - - + + + + Go by Example: String Functions + + + + + +
+

Go by Example: String Functions

+ + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - -
+ +

El paquete strings de la biblioteca estándar proporciona muchas + funciones útiles relacionadas con cadenas. Aquí hay algunos ejemplos + para darte una idea del paquete.

+
+ + +
+ + + +
package main
+
+ + +
import (
     "fmt"
     s "strings"
 )
-
-

We alias fmt.Println to a shorter name as we’ll use -it a lot below.

- -
- -
var p = fmt.Println
-
- - - -
func main() {
-
-

Here’s a sample of the functions available in -strings. Since these are functions from the -package, not methods on the string object itself, -we need pass the string in question as the first -argument to the function. You can find more -functions in the strings -package docs.

- -
- +
+ +

Aliasamos fmt.Println a un nombre más corto ya que lo + usaremos mucho a continuación.

+
+ +
var p = fmt.Println
+
+ + + +
func main() {
+
+ +

He aquí una muestra de las funciones disponibles en + strings. Dado que estas son funciones del + paquete, y no métodos del objeto string en sí, + necesitamos pasar la cadena en cuestión como el primer + argumento a la función. Puedes encontrar más + funciones en la documentación del paquete + strings. +

+ + +
+
    p("Contains:  ", s.Contains("test", "es"))
     p("Count:     ", s.Count("test", "t"))
     p("HasPrefix: ", s.HasPrefix("test", "te"))
@@ -109,20 +128,21 @@ 

Go by Example: String Functions

p("ToLower: ", s.ToLower("TEST")) p("ToUpper: ", s.ToUpper("test")) }
-
- - - - - - + + +
- - - -
$ go run string-functions.go
+        
+ + + + + + - - -
+ + + +
$ go run string-functions.go
 Contains:   true
 Count:      2
 HasPrefix:  true
@@ -135,18 +155,18 @@ 

Go by Example: String Functions

Split: [a b c d e] ToLower: test ToUpper: TEST
-
- - -

- Siguiente ejemplo: String Formatting. -

- - -
+ + +

+ Siguiente ejemplo: String Formatting. +

+ + + -
- - - - + + + + + + \ No newline at end of file diff --git a/public/text-templates.html b/public/text-templates.html index 8d828be5d..4132b8d0a 100644 --- a/public/text-templates.html +++ b/public/text-templates.html @@ -1,117 +1,136 @@ - - - Go by Example: Text Templates - - - - -
-

Go by Example: Text Templates

- - - - - - - - - - - - - - - - + + +
-

Go offers built-in support for creating dynamic content or showing customized -output to the user with the text/template package. A sibling package -named html/template provides the same API but has additional security -features and should be used for generating HTML.

- -
- - -
- - - -
package main
-
- - - + + + + Go by Example: Text Templates + + + + + +
+

Go by Example: Text Templates

+ + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + - - -
+ +

Go ofrece soporte integrado para crear contenido dinámico o mostrar salidas personalizadas + al usuario con el paquete text/template. Un paquete hermano + llamado html/template proporciona la misma API pero tiene características de seguridad + adicionales y debe ser utilizado para generar HTML.

+
+ + +
+ + + +
package main
+
+ + +
import (
     "os"
     "text/template"
 )
-
- - - -
func main() {
-
-

We can create a new template and parse its body from -a string. -Templates are a mix of static text and “actions” enclosed in -{{...}} that are used to dynamically insert content.

- -
- +
+ + + +
func main() {
+
+ +

Podemos crear una nueva plantilla y analizar su cuerpo desde + una cadena. + Las plantillas son una mezcla de texto estático y “acciones” encerradas en + {{...}} que se utilizan para insertar contenido dinámicamente. +

+ +
+
    t1 := template.New("t1")
     t1, err := t1.Parse("Value is {{.}}\n")
     if err != nil {
         panic(err)
     }
-
-

Alternatively, we can use the template.Must function to -panic in case Parse returns an error. This is especially -useful for templates initialized in the global scope.

- -
- -
    t1 = template.Must(t1.Parse("Value: {{.}}\n"))
-
-

By “executing” the template we generate its text with -specific values for its actions. The {{.}} action is -replaced by the value passed as a parameter to Execute.

- -
- +
+ +

Alternativamente, podemos usar la función template.Must para + generar un pánico en caso de que Parse devuelva un error. Esto es especialmente + útil para plantillas inicializadas en el ámbito global.

+
+ +
    t1 = template.Must(t1.Parse("Value: {{.}}\n"))
+
+ +

Al “ejecutar” la plantilla generamos su texto con + valores específicos para sus acciones. La acción {{.}} es + reemplazada por el valor pasado como parámetro a Execute.

+
+
    t1.Execute(os.Stdout, "some text")
     t1.Execute(os.Stdout, 5)
     t1.Execute(os.Stdout, []string{
@@ -120,87 +139,101 @@ 

Go by Example: Text Templates

"C++", "C#", })
-
-

Helper function we’ll use below.

- -
- +
+ +

Función auxiliar que usaremos a continuación.

+ + +
+
    Create := func(name, t string) *template.Template {
         return template.Must(template.New(name).Parse(t))
     }
-
-

If the data is a struct we can use the {{.FieldName}} action to access -its fields. The fields should be exported to be accessible when a -template is executing.

- -
- -
    t2 := Create("t2", "Name: {{.Name}}\n")
-
- - - -
    t2.Execute(os.Stdout, struct {
+        
+ +

Si los datos son una estructura, podemos usar la acción {{.FieldName}} para acceder + a sus campos. Los campos deben ser exportados para ser accesibles cuando una + plantilla se está ejecutando.

+
+ +
    t2 := Create("t2", "Name: {{.Name}}\n")
+
+ + + +
    t2.Execute(os.Stdout, struct {
         Name string
     }{"Jane Doe"})
-
-

The same applies to maps; with maps there is no restriction on the -case of key names.

- -
- +
+ +

Lo mismo se aplica a los mapas; con los mapas no hay restricción en el + caso de los nombres de las claves.

+ +
+
    t2.Execute(os.Stdout, map[string]string{
         "Name": "Mickey Mouse",
     })
-
-

if/else provide conditional execution for templates. A value is considered -false if it’s the default value of a type, such as 0, an empty string, -nil pointer, etc. -This sample demonstrates another -feature of templates: using - in actions to trim whitespace.

- -
- -
    t3 := Create("t3",
+        
+ +

if/else proporciona ejecución condicional para plantillas. Un valor se considera + falso si es el valor predeterminado de un tipo, como 0, una cadena vacía, + un puntero nulo, etc. + Este ejemplo demuestra otra + característica de las plantillas: usar - en acciones para recortar espacios en blanco.

+
+ +
    t3 := Create("t3",
         "{{if . -}} yes {{else -}} no {{end}}\n")
     t3.Execute(os.Stdout, "not empty")
     t3.Execute(os.Stdout, "")
-
-

range blocks let us loop through slices, arrays, maps or channels. Inside -the range block {{.}} is set to the current item of the iteration.

- -
- +
+ +

Los bloques range nos permiten recorrer slices, arrays, mapas o canales. Dentro + del bloque range {{.}} se establece en el elemento actual de la iteración.

+
+
    t4 := Create("t4",
         "Range: {{range .}}{{.}} {{end}}\n")
     t4.Execute(os.Stdout,
@@ -211,20 +244,21 @@ 

Go by Example: Text Templates

"C#", }) }
-
- - - - - - + + +
- - - -
$ go run templates.go 
+        
+ + + + + + - - -
+ + + +
$ go run templates.go 
 Value: some text
 Value: 5
 Value: [Go Rust C++ C#]
@@ -233,18 +267,18 @@ 

Go by Example: Text Templates

yes no Range: Go Rust C++ C#
-
- - -

- Siguiente ejemplo: Regular Expressions. -

- - -
+ + +

+ Siguiente ejemplo: Regular Expressions. +

+ + + -
- - - - + + + + + + \ No newline at end of file diff --git a/vercel.json b/vercel.json deleted file mode 100644 index c6acd6830..000000000 --- a/vercel.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": 2, - "routes": [ - { - "src": "/public/for", - "dest": "/public/for", - "headers": { - "Content-Type": "text/html" - } - } - ] -}