Prefacio
Después de go1.18
introducir los genéricos y comprender su sintaxis básica, el código anterior se refactorizó utilizando genéricos. Ha estado relativamente vacío recientemente y voy a optimizar el código relacionado con el genérico. Al explorar el código fuente, encontré golang.org/x/exp/constraints
algo extraño ( ~
) en el paquete, como sigue:
type Ordered interface {
Integer | Float | ~string
}
Se entiende que esta forma de escribir es una sintaxis genérica y las restricciones de tipo personalizado se pueden agregar directamente, pero ¿ ~string
qué es esto? Cuando lo vi por primera vez, pensé que se trataba de IDE
alguna pantalla auxiliar agregada, pero no era el carácter real =-=.
explicar
~int, ~string
Agregar una línea ondulada antes de cada tipo ~
indica un tipo derivado, que type
puede reconocerse incluso si se utiliza un tipo personalizado ( type MyInt int
), siempre que los tipos subyacentes sean consistentes.
Ejemplo
El siguiente ejemplo proporciona un min
método para encontrar el valor mínimo, personaliza los tipos MyInt
y MyInt1
y ejecuta el método genérico. Se puede ver que el valor de retorno se puede generar correctamente.
package main
import (
"fmt"
"golang.org/x/exp/constraints"
)
type MyInt = int
type MyInt1 int
func min[T constraints.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
func min1[T ~int](a, b T) T {
if a < b {
return a
}
return b
}
func main() {
fmt.Println(min(MyInt(1), MyInt(2)))
fmt.Println(min1(MyInt1(1), MyInt1(2)))
}
Resumir
Este artículo presenta una pequeña característica de los genéricos ~
. El método de escritura de agregar una línea ondulada antes de este tipo indica un tipo derivado. Incluso si type
se usa un tipo personalizado, se puede reconocer ( type MyInt int
), siempre que el tipo subyacente sea el mismo. Es principalmente lo mismo que se usa con genéricos.
Por lo general, cuando utilice este tipo de clasificación, puede utilizar directamente go
el paquete oficial golang.org/x/exp/constraints
.