DEV Community

Cover image for A interface Write
Fabiano Santos Florentino
Fabiano Santos Florentino

Posted on

A interface Write

Em Go, interfaces são fundamentais para promover polimorfismo e abstração. Elas atuam como contratos que especificam um conjunto de métodos que um tipo deve implementar, permitindo que diferentes tipos sejam tratados de maneira uniforme e flexível.

Interfaces

Em Go, uma interface é um tipo que define um conjunto de métodos, sem implementá-los. Ela especifica apenas as assinaturas dos métodos que um tipo deve possuir para satisfazer a interface. Isso permite que diferentes tipos possam ser tratados de forma uniforme, desde que implementem os métodos definidos pela interface. Interfaces promovem polimorfismo e abstração, facilitando a criação de código flexível e reutilizável.

io.Writer

A interface io.Writer é uma das mais utilizadas em Go. Ela define o método Write, que recebe um slice de bytes ([]byte) e retorna um inteiro (int) e um erro (error). Diversos tipos implementam essa interface, incluindo os.File, bytes.Buffer e net.Conn. Isso permite que diferentes tipos de destinos de escrita sejam tratados de maneira uniforme e flexível.

// Writer é a interface que encapsula a operação básica de escrita.
type Writer interface {
    Write(p []byte) (n int, err error)
}
Enter fullscreen mode Exit fullscreen mode
  • Write: é o método que recebe um slice de bytes ([]byte) como argumento e retorna dois valores.
    • n: é o número de bytes escritos.
    • err: é um valor do tipo error que indica se ocorreu algum erro durante a escrita.

Qualquer tipo que implemente o método Write com a assinatura correta será considerarado um io.Writer.

Por que o io.Writer?

  • Abstração: permite tratar diferentes tipos de destinos de escrita de forma uniforme.
  • Flexibilidade: facilita a criação de métodos genéricos que aceitam qualquer tipo que implemente a interface io.Writer.
  • Reutilização de código: utilizando o io.Writer pode ser reutilizado com diferentes tipos de destinos, como arquivos, sockets, buffers, etc.
  • Teste: permite criar mocks e stubs para testar código de forma isolada.

Exemplo

package main

import (
  "fmt"
  "os"
  "io"
)

func main() {
  var w io.Writer = os.Stdout // w é do tipo io.Writer

  n, err := w.Write([]byte("Hello, World!"))
  if err != nil {
    fmt.Println("Erro:", err)
  }

  fmt.Printf("\bBytes escritos: %b", n)
}
Enter fullscreen mode Exit fullscreen mode
/tmp ➜ go run example_io_writer.go
Hello, World!
Bytes escritos: 1101
Enter fullscreen mode Exit fullscreen mode

Conclusão

A interface io.Writer é uma das interfaces mais comuns em Go. Ela é usada para abstrair a operação de escrita de dados, permitindo que diferentes tipos de destinos de escrita sejam tratados de forma uniforme. Isso facilita a reutilização de código, a criação de métodos genéricos e a escrita de testes. Além disso, a interface io.Writer promove polimorfismo, permitindo que diferentes tipos que implementam a interface sejam usados de maneira intercambiável. Ela é amplamente implementada em vários pacotes padrão da linguagem Go, como os, bytes, net, entre outros, demonstrando sua versatilidade e importância no ecossistema Go.

Referências

https://pkg.go.dev/io#Writer
https://pkg.go.dev/os@go1.23.3#File.Write
https://pkg.go.dev/log/slog/internal/buffer#Buffer.Write
https://pkg.go.dev/net@go1.23.3#Conn

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay