Trabalhando com 인터페이스 em Go

8032 단어 tutorialgo
Interface é um tipo de dado que define um conjunto de métodos.
예를 들어, podemos criar uma interface chamadaFormaGeometrica는 형식 기하학으로 deveão implementar pois todas elas possuem um perímetro e uma área로 요청합니다.

type FormaGeometrica interface {
    Perimetro() float32
    Area() float32
}


다음과 같은 형식으로 essa 인터페이스를 구현하기 위해 예를 들면 다음과 같은 유형의 팁Circulo이 있습니다.

type Circulo struct {
    raio float32
}

func NewCirculo(raio float32) Circulo {
    return Circulo{
        radius: raio,
    }
}

func (c Circulo) Perimetro() float32 {
    return 2 * math.Pi * c.raio
}

func (c Circulo) Area() float32 {
    return math.Pi * c.raio * c.raio
}


주의할 점은 인터페이스Circulo를 구현하는 팁FormaGeometrica에 대한 설명입니다. Isso ocorre porque em Go isso é feito de forma implícita, ou seja, se um tipo implementa os métodos contidos em uma interface, esse tipo automaticamente implementa essa interface.

특정 인터페이스를 구체적으로 구현하려면 특정 인터페이스를 구현해야 하며, 컴파일 오류가 있을 수 있고 essa 인터페이스를 구현해야 할 수도 있습니다. 다른 코드는 없습니다:

var _ FormaGeometrica = NewCirculo(3)


Aqui estamos usando o identificador em branco para definir uma variável que nunca será utilizada no código. essa variável은 essa 인터페이스를 구현하지 않고 컴파일 오류로 인해 오류가 발생한 인터페이스에 대한 팁을 제공합니다struct Circulo. Fazendo isso, conseguimos forçar nossos tipos는 특히 구현 알고리즘 인터페이스입니다.

Outro ponto Importante é saber que existe a interface{} que nada mais é do que uma interface que não possui nenhum método, ou seja, todos os tipos de dados implementam essa interface. Isso significa que se algum método receber um paraâmetro do tipo interface{} , qualquer variável poderá ser enviado nesse paraâmetro, independente do tipo.

Vamos criar agora mais um tipo para exemplificar:

type Quadrado struct {
    lado float32
}

func NewQuadrado(lado float32) Quadrado {
    return Quadrado{
        lado: lado,
    }
}

func (c Quadrado) Perimetro() float32 {
    return 4 * c.lado
}

func (c Quadrado) Area() float32 {
    return c.lado * c.lado
}


Agora podemos usar esseses tipos em variáveis ​​do tipo interface de FormaGeometrica . No código abaixo está sendo criada uma slice do tipo FormaGeometrica que pode armazenar variáveis ​​tanto do tipo Circulo quanto do tipo Quadrado . Ao iterar sobre os elementos dessa slice, não precisamos saber qual o tipo concreto de cada elemento, basta utilizar os métodos definidos pela interface.

package main

import "fmt"

type FormaGeometrica interface {
    Perimetro() float32
    Area() float32
}

func main() {
    var formas []FormaGeometrica
    circulo := NewCirculo(2)
    quadrado := NewQuadrado(2)
    formas = append(formas, circulo)
    formas = append(formas, quadrado)

    for _, f := range formas {
        fmt.Println(f.Perimetro())
    }
}

좋은 웹페이지 즐겨찾기