Por favor, use genéricos após 1.18
O código deste artigo vem do Tutorial: Começando com genéricos. Ainda é relativamente simples. Este artigo (escrito por mim) continuará sendo atualizado.
veja o primeiro exemplo
// 累加int
func SumInts(m map[string]int64) int64 {
var s int64
for _, v := range m {
s += v
}
return s
}
// 累加float
func SumFloats(m map[string]float64) float64 {
var s float64
for _, v := range m {
s += v
}
return s
}
复制代码
É assim quando chamado:
func main() {
// 初始化int map
ints := map[string]int64{
"first": 34,
"second": 12,
}
// 初始化float map
floats := map[string]float64{
"first": 35.98,
"second": 26.99,
}
fmt.Printf("Non-Generic Sums: %v and %v\n",
SumInts(ints),
SumFloats(floats))
}
复制代码
Essas duas funções são obviamente duas em uma. Então, adicione uma declaração de tipo em 1.18
func[在这里写啦!]()
复制代码
Como acima, pode ser preenchido como:
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V
复制代码
Comparável é um tipo adaptativo. Adicionar | pode indicar que pode ser de dois tipos. Que tal? Tem gosto de ts?
Uma implementação mais específica é a seguinte:
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
复制代码
Outra coisa intrigante é quando usar comparável.
Permite qualquer tipo cujos valores possam ser usados como operando dos operadores de comparação
==
e!=
.Go exige que as chaves do mapa sejam comparáveis. Permite valores expressos com == e !=. Go requer que as chaves do mapa sejam comparáveis
Se você precisar usá-lo em vários lugares, você pode usar
type Number interface {
int64 | float64
}
复制代码
Salve tipos de união de escrita em todos os lugares.
func SumNumbers[K comparable, V Number](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
复制代码
mas! Não é possível usar Type em outros lugares, só pode ser usado em [].
m:= map[string]Number
não é possívelfunc ReturnSomthing() Number { return 1}
ainda não funciona
qualquer um pode substituir a interface{}, assim:
m:= map[string]any{
"1": 2,
"2":"GKD!",
}
复制代码
1.18 sai com genéricos, que impacto terá no futuro? No momento, 2022-04-17 não viu mudanças drásticas, mas no momento, apenas uma pode ser prevista: as perguntas da entrevista de go serão escritas em pequenos volumes. Acho que ir é muito bom. :) Bem-vindo outros irmãos para experimentá-lo, é grátis de qualquer maneira.