Fluxuri standard de intrare-ieșire și io.Copy
Pachetul os definește trei variabile: os.Stdin, os.Stdout și os.Stderr, care reprezintă fluxurile standard de intrare, ieșire și erori, respectiv. Astfel, fluxul standard de ieșire os.Stdout reprezintă ieșirea informațiilor pe consolă.
De exemplu, putem utiliza funcția io.Copy() pentru a copia date dintr-un flux în altul:
n, err = io.Copy(io.Writer, io.Reader)
Această funcție simplifică copierea datelor dintr-un obiect io.Reader într-un obiect io.Writer. Ca rezultat, funcția returnează numărul de fișiere copiate și informații despre eroare, dacă aceasta apare.
La afișarea informațiilor textuale dintr-un fișier pe consolă, este mult mai simplu să transmitem datele din fluxul fișierului în os.Stdout, prin copierea acestora în bucăți separate:
package main
import (
"fmt"
"os"
"io"
)
func main() {
file, err := os.Open("hello.txt")
if err != nil{
fmt.Println(err)
os.Exit(1)
}
defer file.Close()
io.Copy(os.Stdout, file)
}
Ca io.Reader putem utiliza propriile noastre obiecte personalizate care implementează această interfață. De exemplu:
package main
import (
"fmt"
"io"
"os"
)
type phoneReader string
func (p phoneReader) Read(bs []byte) (int, error){
count := 0
for i := 0; i < len(p); i++{
if(p[i] >= '0' && p[i] <= '9'){
bs[count] = p[i]
count++
}
}
return count, io.EOF
}
func main() {
phone1 := phoneReader("+1(234)567 90-10")
io.Copy(os.Stdout, phone1)
fmt.Println()
}
În acest caz, ca interfață io.Reader se transmite obiectul phoneReader, care citește caractere numerice dintr-un număr de telefon.