День 07 — глубже
Всё здесь необязательно. Материалы на английском помечены.
Документация пакетов (англ.)
То же самое открывается в терминале через go doc, который вы знаете с дня 04: go doc bufio.Scanner, go doc strconv.Atoi, go doc os.Exit.
- bufio.Scanner — https://pkg.go.dev/bufio#Scanner В описании сказано, что
Scannerчитает кусками и держит запас. Отсюда поведение двухscannerна одном вводе. - strconv.Atoi и ParseFloat — https://pkg.go.dev/strconv#Atoi Какие ещё ошибки бывают:
ErrSyntaxиErrRange, те самыеinvalid syntaxиvalue out of range. - os.Exit — https://pkg.go.dev/os#Exit Одна фраза, которая станет важной в блоке 5: при
os.Exitне выполняются отложенные действия.
Дробные: strconv.ParseFloat
Вес посылки, объём коробки — дробные числа. Для них strconv.ParseFloat. У неё два аргумента: строка и число 64 — «сколько бит в результате»; 64 даёт float64, другой вариант не понадобится.
package main
import (
"fmt"
"strconv"
)
func main() {
w, err := strconv.ParseFloat("12.5", 64)
fmt.Println(w, err)
w, err = strconv.ParseFloat("12,5", 64)
fmt.Println(w, err)
w, err = strconv.ParseFloat("abc", 64)
fmt.Println(w, err)
w, err = strconv.ParseFloat("7", 64)
fmt.Println(w, err)
w, err = strconv.ParseFloat(" 7", 64)
fmt.Println(w, err)
}stagiaire@lab:~/gocourse/day07/scratch$ go run .
12.5 <nil>
0 strconv.ParseFloat: parsing "12,5": invalid syntax
0 strconv.ParseFloat: parsing "abc": invalid syntax
7 <nil>
0 strconv.ParseFloat: parsing " 7": invalid syntaxРазделитель дробной части — только точка. Запятую, привычную в русских текстах, ParseFloat не понимает. Пробелы по краям — та же беда, что у Atoi: сначала strings.TrimSpace.
| Что видите | Что это значит | Что делать |
|---|---|---|
not enough arguments in call to strconv.ParseFloat и строки have (string), want (string, int) |
забыт второй аргумент | strconv.ParseFloat(s, 64) |
strconv.ParseFloat: parsing "12,5": invalid syntax |
запятая вместо точки | вводить 12.5 |
Про ошибки в Go (англ.)
- Go by Example: Errors — https://gobyexample.com/errors Короткие примеры
if err != nil. Функции, которые сами возвращают ошибку, будут в блоке 3 — туда можно заглянуть заранее. - Go by Example: Exit — https://gobyexample.com/exit
- Go by Example: Line Filters — https://gobyexample.com/line-filters Программа, которая читает ввод построчно в цикле. Циклы — завтра.
- Effective Go: Errors — https://go.dev/doc/effective_go#errors Почему текст ошибки начинается с имени того, кто её сообщил:
strconv.Atoi: parsing ….
Потоки и перенаправления (англ.)
- Bash Reference Manual: Redirections — https://www.gnu.org/software/bash/manual/html_node/Redirections.html Все виды
<,>,2>,>>— дописать в конец файла, а не стереть.
Мини-опыт: >> и 2>&1
Попробуйте сейчас:
>>и2>&1.Цель: увидеть, как
>>дописывает файл, а2>&1собирает оба потока в один файл.1. Программа — та же «Отчёт по складу», что на пятой странице; наберите её в
scratch/main.go:✎ Наберите в файлscratch/main.gopackage main import ( "fmt" "os" ) func main() { fmt.Println("Отчёт по складу") fmt.Fprintln(os.Stderr, "нет данных за вчера") fmt.Println("Остаток: 40") }2. Соберите её и выполните команды по очереди:
▶ Выполнитеcd ~/gocourse/day07/scratch go build -o report .▶ Выполните./report >> log.txt ./report >> log.txt cat log.txt ./report > all.txt 2>&1 cat all.txt
>>дописывает в конец.2>&1— «поток ошибок туда же, куда обычный вывод».Готово, когда: в
log.txtстроки отчёта повторились дважды, а вы записали, в каком порядке строки оказались вall.txt.
Мини-опыт: что ещё Atoi считает числом
В scratch проверьте strconv.Atoi на строках "0x1F", "١٢" (арабские цифры), "1_000" и "-0". Сначала запишите предсказание, потом запустите. Сравните с тем, что Go принимает в самом коде программы: x := 1_000 компилируется.
Мини-опыт: код возврата у команд терминала
Попробуйте сейчас: коды возврата ls и grep.
Цель: увидеть, что код возврата есть у любой команды терминала.
▶ Выполнитеls ~/gocourse; echo $? ls /nosuchdir; echo $? grep Остаток ~/gocourse/day07/scratch/out.txt; echo $?У
grepтри разных кода: нашёл, не нашёл, ошибка. Узнайте, какой какой, изman grep, раздел EXIT STATUS.Готово, когда: у
ls ~/gocourseкод0, уls /nosuchdir— не0, и вы знаете, какой код уgrepозначает «нашёл», «не нашёл» и «ошибка».