Стандартные потоки ввода-вывода и io.Copy

Последнее обновление: 15.01.2018

Пакет os определяет три переменных: os.Stdin, os.Stdout и os.Stderr, которые представляют стандартные потоки ввода, вывода и вывода ошибок соответственно. Так, стандартный поток вывода os.Stdout представляет вывод информации на консоль.

Например, мы можем использовать функцию io.Copy() для копирования данных из одного потока в другой:

n, err = io.Copy(io.Writer, io.Reader)

Эта функция упрощает копирование данных из объекта io.Reader в объект io.Writer. В качестве результата функция возвращает количество скопированных файлов и информацию об ошибке.

И при выводе из файла текстовой информации на консоль гораздо проще передать данные из файлового потока в os.Stdout, через выводить данные отдельными порциями:

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)
}

В качестве io.Reader можно использовать свои кастомные объекты, которые реализуют данный интерфейс. Например:

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()
}

В данном случае в качестве интерфейса io.Reader передается объект phoneReader, который считывает цифровые символы из номера телефона.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850