Функция fmt.Fscanln
Функция fmt.Fscanln сканирует данные, прочитанные из переданного
интерфейса io.Reader, и записывает их в переданные указатели.
В качестве первого параметра она принимает источник данных
(например, strings.Reader или bytes.Buffer),
а в последующие параметры — указатели на переменные, в которые
будут сохранены значения. Функция считывает данные до символа
новой строки и ожидает, что количество переданных аргументов
будет соответствовать количеству значений в строке.
Синтаксис
func Fscanln(r io.Reader, a ...any) (n int, err error)
Пример
Давайте прочитаем строку с тремя значениями из strings.Reader:
package 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)
}
Результат выполнения кода:
"Res: 3"
"Lang: Go"
"Version: 1.21"
"Active: true"
Пример
Попробуем прочитать две строки из strings.Reader:
package 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)
}
Результат выполнения кода:
"Res: 2"
"Name: Alice"
"Age: 25"
Функция прочитала только первую строку до символа новой строки, вторая строка осталась непрочитанной.
Пример
Давайте рассмотрим случай, когда количество переменных не соответствует количеству значений:
package 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)
}
Результат выполнения кода:
"Error: expected newline"
"Res before error: 2"
Функция возвращает ошибку, так как количество значений в строке больше, чем количество аргументов.
Смотрите также
-
функцию
fmt.Fscan,
которая читает данные из io.Reader без привязки к строке -
функцию
fmt.Fscanf,
которая читает из io.Reader с использованием форматной строки -
функцию
fmt.Sscanln,
которая читает данные из строки по строкам -
функцию
fmt.Scanln,
которая читает данные из стандартного ввода по строкам