Функция fmt.Fscanln

Функция fmt.Fscanln сканирует данные, прочитанные из переданного интерфейса io.Reader, и записывает их в переданные указатели. В качестве первого параметра она принимает источник данных (например, strings.Reader или bytes.Buffer), а в последующие параметры — указатели на переменные, в которые будут сохранены значения. Функция считывает данные до символа новой строки и ожидает, что количество переданных аргументов будет соответствовать количеству значений в строке.

Синтаксис

gofunc Fscanln(r io.Reader, a ...any) (n int, err error)

Пример

Давайте прочитаем строку с тремя значениями из strings.Reader:

gopackage main

import (
  "fmt"
  "strings"
)

func main() {
  s := "Go 1.21 true"
  reader := strings.NewReader(s)

  var lang string
  var version float32
  var active bool

  res, err := fmt.Fscanln(reader, &lang, &version, &active)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("Res:", res)
  fmt.Println("Lang:", lang)
  fmt.Println("Version:", version)
  fmt.Println("Active:", active)
}

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

go"Res: 3"
"Lang: Go"
"Version: 1.21"
"Active: true"

Пример

Попробуем прочитать две строки из strings.Reader:

gopackage main

import (
  "fmt"
  "strings"
)

func main() {
  s := "Alice 25\nBob 30"
  reader := strings.NewReader(s)

  var name string
  var age int

  res, err := fmt.Fscanln(reader, &name, &age)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println("Res:", res)
  fmt.Println("Name:", name)
  fmt.Println("Age:", age)
}

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

go"Res: 2"
"Name: Alice"
"Age: 25"

Функция прочитала только первую строку до символа новой строки, вторая строка осталась непрочитанной.

Пример

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

gopackage main

import (
  "fmt"
  "strings"
)

func main() {
  s := "1 2 3"
  reader := strings.NewReader(s)

  var a, b int

  res, err := fmt.Fscanln(reader, &a, &b)
  if err != nil {
    fmt.Println("Error:", err)
    fmt.Println("Res before error:", res)
    return
  }

  fmt.Println("Res:", res)
  fmt.Println("A:", a)
  fmt.Println("B:", b)
}

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

go"Error: expected newline"
"Res before error: 2"

Функция возвращает ошибку, так как количество значений в строке больше, чем количество аргументов.

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

  • функцию fmt.Fscan,
    которая читает данные из io.Reader без привязки к строке
  • функцию fmt.Fscanf,
    которая читает из io.Reader с использованием форматной строки
  • функцию fmt.Sscanln,
    которая читает данные из строки по строкам
  • функцию fmt.Scanln,
    которая читает данные из стандартного ввода по строкам