¿Qué es el tipo ~int en go y por qué hay una tilde delante del tipo?

Prefacio

Después de go1.18introducir 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/constraintsalgo 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 ¿ ~stringqué es esto? Cuando lo vi por primera vez, pensé que se trataba de IDEalguna pantalla auxiliar agregada, pero no era el carácter real =-=.

explicar

~int, ~stringAgregar una línea ondulada antes de cada tipo ~indica un tipo derivado, que typepuede reconocerse incluso si se utiliza un tipo personalizado ( type MyInt int), siempre que los tipos subyacentes sean consistentes.

Ejemplo

El siguiente ejemplo proporciona un minmétodo para encontrar el valor mínimo, personaliza los tipos MyInty MyInt1y 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 typese 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 goel paquete oficial golang.org/x/exp/constraints.

Supongo que te gusta

Origin blog.csdn.net/DisMisPres/article/details/130701818
Recomendado
Clasificación