День 07 · дополнительные материалы

День 07 — глубже

Всё здесь необязательно. Материалы на английском помечены.


Документация пакетов (англ.)

То же самое открывается в терминале через go doc, который вы знаете с дня 04: go doc bufio.Scanner, go doc strconv.Atoi, go doc 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 (англ.)

Потоки и перенаправления (англ.)

Мини-опыт: >> и 2>&1

Попробуйте сейчас: >> и 2>&1.

Цель: увидеть, как >> дописывает файл, а 2>&1 собирает оба потока в один файл.

1. Программа — та же «Отчёт по складу», что на пятой странице; наберите её в scratch/main.go:

✎ Наберите в файл scratch/main.go
package 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 означает «нашёл», «не нашёл» и «ошибка».