Considere duas funções do pacote experimental de fatias: Contém e Cresce. Ambas as funções aceitam argumentos de fatia, mas com restrições de tipo diferentes:
O primeiro argumento de Contains tem tipo []E, onde E é restringido por comparável, indicando que E deve ser comparável . Por outro lado, o primeiro argumento de Grow tem tipo S, restringido por ~[]E, indicando que S deve ter um tipo subjacente que é uma fatia de E.
À primeira vista, pode parecer que não há diferença prática entre usar estes dois tipos de restrições. No entanto, este não é o caso quando você precisa retornar uma fatia do mesmo tipo que o argumento em Grow.
Se você precisar retornar uma fatia do mesmo tipo que o argumento de entrada, você deve usar um parâmetro de tipo que se restrinja a uma fatia (por exemplo, ~[]E). Isso permite que a função retorne um valor do mesmo tipo que o argumento.
Vamos considerar duas implementações 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
Ao passar uma fatia de um tipo personalizado com uma fatia como seu tipo subjacente , Grow pode retornar um valor do mesmo tipo, enquanto Grow2 não. Grow2 só pode retornar um valor de um tipo de fatia sem nome, []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
Aqui, Grow2(y, 10) recebe um valor do tipo ints mas retorna um valor do tipo []int, que não é o comportamento pretendido.
Em conclusão, quando a chamada de função requer o retorno de uma fatia do mesmo tipo (possivelmente nomeado) do argumento, usando um parâmetro de tipo que se restringe a uma fatia (~[]E) é necessário. Caso contrário, um parâmetro de tipo que restrinja apenas o tipo de elemento (E any) poderá ser usado.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3