Verificados capitulos 1 y 2
This commit is contained in:
24
es/02.6.md
24
es/02.6.md
@@ -187,7 +187,7 @@ Si una función usa una interfaz vacía como su tipo de argumento, esta puede ac
|
||||
|
||||
Cualquier variable puede usarse en una interfaz, entonces podemos pensar sobre como podemos usar esta característica para pasar cualquier tipo de variable a una función.
|
||||
|
||||
Por ejemplo, usamos mucho fmt.Println, pero alguna vez notaste que este acepta cualquier tipo de argumento? Si vemos el código fuente de fmt que es libre, podemos ver la siguiente definición.
|
||||
Por ejemplo, usamos mucho fmt.Println, pero alguna vez notaste que ¿acepta cualquier tipo de argumento? Si vemos el código fuente de fmt que es libre, podemos ver la siguiente definición.
|
||||
```
|
||||
type Stringer interface {
|
||||
String() string
|
||||
@@ -224,13 +224,13 @@ Volviendo atrás al ejemplo de Box, podemos ver que Color también implementa la
|
||||
fmt.Println("The biggest one is", boxes.BiggestsColor().String())
|
||||
fmt.Println("The biggest one is", boxes.BiggestsColor())
|
||||
```
|
||||
Atención: Si el tipo implementa la interfaz `error`, fmt va a llamar a `error()`, entonces en este punto usted no tendrá que implementar Stringer.
|
||||
Atención: Si el tipo implementa la interfaz `error`, fmt va a llamar a `error()`, entonces en este punto no tendrás que implementar Stringer.
|
||||
|
||||
### Tipos de variables en un interfaz
|
||||
|
||||
Si una variable es del tipo que implementa una interfaz, sabemos que cualquier otro tipo que implemente la misma interfaz puede ser asignada a esta variable. La pregunta es ¿Como podemos saber cual es el tipo específico almacenado en la interfaz? Tenemos dos formas, que le voy a comentar a continuación.
|
||||
Si una variable es del tipo que implementa una interfaz, sabemos que cualquier otro tipo que implemente la misma interfaz puede ser asignada a esta variable. La pregunta es ¿Cómo podemos saber cual es el tipo específico almacenado en la interfaz? Tenemos dos formas, que te voy a comentar a continuación.
|
||||
|
||||
- Patrón de afirmación Comma-ok
|
||||
- Patron de Aserción Comma-ok
|
||||
|
||||
Go tiene la sintaxis `value, ok := element.(T)`. Esto comprueba si la variable es del tipo que se espero, donde value es el valor de la variable, y ok es un valor de tipo booleano, element es la variable interfaz y T es el tipo que se afirma tener.
|
||||
|
||||
@@ -326,7 +326,7 @@ Una cosa que deberíamos recordar es que `element.(type)` no puede ser usado fue
|
||||
|
||||
### Interfaces embebidas
|
||||
|
||||
La como más atractiva es que Go tiene mucha sintaxis para la lógica embebida, como campos anónimos en un struct. No es para sorprenderse, que podamos usar interfaces también como campos anónimos, pero vamos a llamarlas `Interfaces embebidas`. Aquí, vamos a seguir las mismas reglas que para los campos anónimos. Más específicamente, si una interfaz tiene otra interfaz como una interfaz embebida, esta tendrá todos los métodos que la clase embebida tiene.
|
||||
La cosa más atractiva es que Go tiene mucha lógica embebida en su sintaxis, como campos anónimos en un struct. No es para sorprenderse, que podamos usar interfaces también como campos anónimos, pero vamos a llamarlas `Interfaces embebidas`. Aquí, vamos a seguir las mismas reglas que para los campos anónimos. Más específicamente, si una interfaz tiene otra interfaz como una interfaz embebida, esta tendrá todos los métodos que la clase embebida tiene.
|
||||
|
||||
Podemos ver el archivo fuente `container/heap` que tiene una definición como la siguiente.
|
||||
```
|
||||
@@ -335,9 +335,9 @@ Podemos ver el archivo fuente `container/heap` que tiene una definición como la
|
||||
Push(x interface{}) //el método Push para empujar elementos a la pila
|
||||
Pop() interface{} //el elemento Pop que saca elementos de la pila
|
||||
}
|
||||
|
||||
```
|
||||
Podemos ver que `sort.Interface` es una interfaz embebida, por lo que la interfaz anterior tiene tres métodos que son explícitos de `sort.Interface`.
|
||||
|
||||
```
|
||||
type Interface interface {
|
||||
// Len es el número de elementos en la colección.
|
||||
Len() int
|
||||
@@ -347,9 +347,9 @@ Podemos ver que `sort.Interface` es una interfaz embebida, por lo que la interfa
|
||||
// Swap intercambia los elementos con índices i y j.
|
||||
Swap(i, j int)
|
||||
}
|
||||
|
||||
```
|
||||
Otro ejemplo es el de `io.ReadWriter` en el paquete `io`.
|
||||
|
||||
```
|
||||
// io.ReadWriter
|
||||
type ReadWriter interface {
|
||||
Reader
|
||||
@@ -373,7 +373,7 @@ Después de eso, necesitamos convertir el tipo reflect de el valor que tomamos a
|
||||
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
|
||||
fmt.Println("value:", v.Float())
|
||||
```
|
||||
Finalmente, si buscamos cambiar el valor que vino del tipo reflects,necesitamos hacerlo modificable. Como hablamos antes, esta es una diferencia entre pasar por valor o por referencia. El siguiente código no compilará.
|
||||
Finalmente, si buscamos cambiar el valor que vino del tipo reflects, necesitamos hacerlo modificable. Como hablamos antes, esta es una diferencia entre pasar por valor o por referencia. El siguiente código no compilará.
|
||||
```
|
||||
var x float64 = 3.4
|
||||
v := reflect.ValueOf(x)
|
||||
@@ -386,10 +386,10 @@ En lugar de eso, debemos usar el siguiente código para cambiar el valor de los
|
||||
v := p.Elem()
|
||||
v.SetFloat(7.1)
|
||||
```
|
||||
Acabo de hablar sobre los conocimientos básicos de sobre el uso de reflexión (reflection), debería practicar más para entenderlo mejor.
|
||||
Acabamos de hablar sobre los conocimientos básicos de sobre el uso de reflexión (reflection), deberías practicar más para entenderlo mejor.
|
||||
|
||||
## Enlaces
|
||||
|
||||
- [Indice](preface.md)
|
||||
- [Índice](preface.md)
|
||||
- Sección anterior: [Orientado a objetos](02.5.md)
|
||||
- Siguiente sección: [Concurrencia](02.7.md)
|
||||
|
||||
Reference in New Issue
Block a user