"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 > Como io.TeeReader e io.Copy diferem no Go?

Como io.TeeReader e io.Copy diferem no Go?

Publicado em 2024-11-04
Navegar:962

How do io.TeeReader and io.Copy differ in Go?

Diferenças entre io.TeeReader e io.Copy

No Go, io.TeeReader e io.Copy facilitam a transferência de dados de um io. Leitor para um io.Writer. Embora ambas as funções atendam a esse propósito, elas oferecem funcionalidades distintas.

io.Copy

io.Copy é uma função simples e direta que copia dados de forma eficiente de um leitor de origem para um escritor de destino. Ele se concentra exclusivamente na transferência de dados e não retorna valores.

io.TeeReader

io.TeeReader fornece uma abordagem mais versátil. Ao contrário de io.Copy, io.TeeReader cria um novo io.Reader que envolve o leitor original. Ao ler neste novo leitor, os dados são gravados simultaneamente no io.Writer fornecido. Esse recurso é útil quando você precisa inspecionar e processar dados copiados.

Exemplo de uso

Para ilustrar a diferença, considere um cenário em que precisamos copiar dados de um leitor para a saída padrão enquanto também calcula o hash MD5 do conteúdo copiado.

Usando io.TeeReader:

r := io.TeeReader(strings.NewReader(s), os.Stdout)
h := md5.New()
if _, err := io.Copy(h, r); err != nil { panic(err) }
fmt.Printf("Hash: %x\n", h.Sum(nil))

Neste exemplo, io.TeeReader nos permite imprimir simultaneamente os dados copiados na saída padrão e calcular o hash MD5 usando a função h.Sum(nil).

io.MultiWriter

Vale a pena notar que a funcionalidade do io.TeeReader também pode ser alcançada usando io.MultiWriter:

mw := io.MultiWriter(h, os.Stdout)
if _, err := io.Copy(mw, strings.NewReader(s)); err != nil { panic(err) }
fmt.Printf("Hash: %x\n", h.Sum(nil))

io.MultiWriter combina vários gravadores em um único destino, permitindo efetivamente que os dados sejam gravados em vários locais simultaneamente. Nesse caso, h recebe os dados copiados para cálculo de hash, enquanto os.Stdout os exibe.

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