Tutorial conciso do Go Genéricos

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 [].

  1. m:= map[string]Numbernão é possível
  2. func 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.

Acho que você gosta

Origin juejin.im/post/7087528794873380894
Recomendado
Clasificación