Considere dos funciones del paquete de sectores experimentales: Contiene y Crece. Ambas funciones aceptan argumentos de segmento, pero con diferentes restricciones de tipo:
El primer argumento de Contiene tiene tipo []E, donde E está restringido por comparable, lo que indica que E debe ser comparable . Por otro lado, el primer argumento de Grow tiene el tipo S, restringido por ~[]E, lo que indica que S debe tener un tipo subyacente que sea una porción de E.
A primera vista, puede parecer que no existe una diferencia práctica entre el uso de estos dos tipos de restricciones. Sin embargo, este no es el caso cuando necesita devolver una porción del mismo tipo que el argumento en Grow.
Si necesita devolver un segmento del mismo tipo que el argumento de entrada, debe usar un parámetro de tipo que se restrinja a un segmento (por ejemplo, ~[]E). Esto permite que la función devuelva un valor del mismo tipo que el argumento.
Consideremos dos implementaciones de Grow:
func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E
Al pasar un segmento de un tipo personalizado con un segmento como tipo subyacente , Grow puede devolver un valor del mismo tipo, mientras que Grow2 no. Grow2 solo puede devolver un valor de un tipo de segmento sin nombre, []E.
type ints []int // user-defined slice type ints x := []int{1} // initialize a slice x of type []int x2 := Grow(x, 10) // x2 will be of type []int y := ints{1} // initialize a slice y of type ints y2 := Grow(y, 10) // y2 will be of type ints
Aquí, Grow2(y, 10) recibe un valor de tipo ints pero devuelve un valor de tipo []int, que no es el comportamiento previsto.
En conclusión, cuando la llamada a la función requiere devolver un segmento del mismo tipo (posiblemente con nombre) como argumento, se usa un parámetro de tipo que se limita a un segmento (~[]E) es necesario. De lo contrario, se puede utilizar un parámetro de tipo que restrinja solo el tipo de elemento (E cualquiera).
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3