"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Quando usar ~[]E vs []E para argumentos de fatia no Go?

Quando usar ~[]E vs []E para argumentos de fatia no Go?

Publicado em 2024-11-04
Navegar:273

When to Use ~[]E vs []E for Slice Arguments in Go?

Explorando as sutilezas dos argumentos genéricos de fatias

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:

Restrições de tipo

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.

Implicações Práticas

À 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.

A importância de um parâmetro de tipo restrito à fatia

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.

Uma demonstração com Grow

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.

Example

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.

Conclusão

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.

Declaração de lançamento Este artigo foi reimpresso em: 1729668019 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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