Переменная os.Stdin

Переменная os.Stdin представляет собой стандартный поток ввода (stdin) в операционной системе. Она является файловым дескриптором типа os.File и позволяет программе читать данные, поступающие из стандартного ввода. Это может быть ввод с клавиатуры, данные из конвейера или содержимое перенаправленного файла. Использование os.Stdin является основным способом взаимодействия с пользователем через командную строку в Go-программах.

Синтаксис

goos.Stdin.Read([]byte) (int, error)

Переменная os.Stdin предоставляет методы для чтения данных. Основной метод - Read, который принимает байтовый срез и возвращает количество прочитанных байтов и ошибку. Также доступны методы ReadAt, Seek, Stat и другие, поскольку os.Stdin является файловым дескриптором.

Пример

Давайте прочитаем строку из стандартного ввода с помощью метода Read:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  data := make([]byte, 1024)
  n, err := os.Stdin.Read(data)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Printf("Read %d bytes: %s", n, string(data[:n]))
}

Результат выполнения кода при вводе "hello":

go"Read 6 bytes: hello"

Пример

Для построчного чтения удобно использовать сканер из пакета bufio вместе с os.Stdin:

gopackage main

import (
  "bufio"
  "fmt"
  "os"
)

func main() {
  scanner := bufio.NewScanner(os.Stdin)
  fmt.Print("Enter text: ")
  scanner.Scan()
  text := scanner.Text()
  if err := scanner.Err(); err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Printf("You entered: %s", text)
}

Результат выполнения кода при вводе "Hello Go":

go"Enter text: Hello Go"
"You entered: Hello Go"

Пример

Давайте прочитаем несколько строк из стандартного ввода, пока не встретим пустую строку:

gopackage main

import (
  "bufio"
  "fmt"
  "os"
)

func main() {
  scanner := bufio.NewScanner(os.Stdin)
  fmt.Println("Enter lines (empty line to stop):")
  for scanner.Scan() {
    line := scanner.Text()
    if line == "" {
      break
    }
    fmt.Printf("Line: %s\n", line)
  }
  if err := scanner.Err(); err != nil {
    fmt.Println("Error:", err)
  }
}

Результат выполнения кода при вводе строк "first", "second" и пустой строки:

go"Enter lines (empty line to stop):"
"Line: first"
"Line: second"

Смотрите также

  • переменную os.Stdout,
    которая представляет стандартный поток вывода
  • переменную os.Stderr,
    которая представляет стандартный поток ошибок
  • функцию os.Open,
    которая открывает файл для чтения
  • функцию os.ReadFile,
    которая читает содержимое файла целиком