День 16 — глубже
Всё здесь необязательно. Материалы на английском помечены.
Срезы от авторов языка (англ.)
- A Tour of Go, раздел Arrays и Slices — https://go.dev/tour/moretypes/6 Интерактивные страницы: массив, срез, литерал среза,
len,append,range. Код запускается в браузере. Страницы проcapиmakeоставьте до дня 17. - Effective Go, раздел Slices — https://go.dev/doc/effective_go#slices Короткое объяснение, почему в Go почти не пишут массивы и почему
appendвозвращает срез. - Go Slices: usage and internals — https://go.dev/blog/slices-intro Пост в блоге Go с картинками памяти. Первая половина — то, что было сегодня; вторая — ровно тема дня 17. Хорошо читать после него.
Точные правила индексов (англ.)
- Спецификация Go, Index expressions — https://go.dev/ref/spec#Index_expressions Официальный текст правил: когда выход за границу — ошибка компиляции, а когда — паника при запуске. Сверьте с таблицей первой страницы.
Срез строк
Попробуйте сейчас: срез не только из чисел.
Цель: увидеть, что срез бывает из любого типа и печатается так же.
✎ Наберите в файлscratch/main.gopackage main import "fmt" func main() { names := []string{"болт", "гайка", "шайба"} fmt.Println(names, len(names), names[1]) }▶ Выполнитеcd ~/gocourse/day16/scratch go run .Что должно получиться:
Вывод · это печатает программа, набирать не нужно[болт гайка шайба] 3 гайкаДопишите
names = append(names, "винт")и напечатайте срез ещё раз. Попробуйте дописать в него число — какое сообщение даст компилятор?Готово, когда: срез из четырёх названий напечатан, а сообщение про число записано в словарик. Проверка дня этот опыт не сверяет.
Как печатать срез
Попробуйте сейчас: срез в Printf.
Цель: узнать, как
Printfпечатает срез и чем пустой срез отличается от объявленного черезvar.✎ Наберите в файлscratch/main.gopackage main import "fmt" func main() { stock := []int{12, 40, 5} fmt.Printf("%d\n", stock) fmt.Printf("%v\n", stock) var empty []int fmt.Println(empty, len(empty)) other := []int{} fmt.Println(other, len(other)) }▶ Выполнитеcd ~/gocourse/day16/scratch go run .Что должно получиться:
Вывод · это печатает программа, набирать не нужно[12 40 5] [12 40 5] [] 0 [] 0
%dприменяется к каждому элементу,%v— «как есть». Два пустых среза печатаются одинаково. Разница между ними всё же есть — она называетсяnilи разбирается в день 17.Готово, когда: вывод совпал. Проверка дня этот опыт не сверяет.
Задачи на закрепление
- Напишите функцию
func count(stock []int, limit int) int— сколько ячеек ниже порога — и тест к ней. Как её можно выразить черезlowCellsодной строкой? - Выведите опись в обратном порядке: от последней ячейки к первой. Какое начальное значение у
iи какое условие цикла? Проверьте на срезе из одного элемента и на пустом.