Перевод книги «Learn Go with Tests» на русский язык.

Изучите Go через тестирование

Три гофера разных цветов: один думает о еде, другой готовит, третий убирает. Надпись: Red, Green, Refactor.

Обложка нарисована Denise

Go Report Card

Форматы для чтения

Доступные переводы

Поддержите меня

Я горжусь тем, что предлагаю эту книгу для свободного использования, бесплатно. Однако, если вы хотите поддержать меня или выразить благодарность, то можете воспользоваться следующими пунктами:

Почему мне стоит это читать?

  • Узнайте о языке Go с помощью написания тестов.
  • Погрузитесь в TDD с головой. Go хороший язык для этого, потому-что он прост для изучения и в нём отлично реализованы тесты из коробки.
  • Получите уверенность, что вы можете писать надежные и хорошо протестированные системы на Go.
  • Посмотрите видео или почитайте, почему юнит-тестирование и TDD важны.

Оглавление

Основы Go

  1. Установка Go - Настройте рабочее окружение для комфортной работы.
  2. Привет, мир! - Объявляйте переменные, константы, используйте ветвления, напишите вашу первую программу на Go и тест для неё. Синтаксис подтестов и замыканий.
  3. Числа - Укрепите знания синтаксиса для функций и изучите новые пути улучшения документации вашего кода.
  4. Циклы - Узнайте о цикле for и для чего нужны бенчмарки.
  5. Массивы и Слайсы - Научитесь работать с массивами, слайсами, len, range, изучите вариативные функции и покройте тестами программу.
  6. Структуры, методы и интерфейсы - Погрузитесь в методы, узнайте об интерфейсах, структурах и табличных тестах.
  7. Указатели и ошибки - Узнайте об указателях и обработке ошибок в Go.
  8. Карты - Научитесь пользоваться картами для хранения данных.
  9. Управление зависимостями - Получите представления об управлении зависимости и как это связано с использованием интерфейсов и пакета io.
  10. Мокинг (имитация) - Возьмите существующий не протестированный код и используйте DI с мокингом для написания тестов.
  11. Многопоточность - Узнайте как писать многопоточный код и как сделать вашу программу быстрее.
  12. Оператор Select - Научитесь красиво и элегантно синхронизировать асинхронные процессы.
  13. Рефлексия - Получите основы о рефлексии в Go.
  14. Синхронизация - Узнайте о пакете sync, который включает в себя WaitGroup и Mutex.
  15. Использование context - Используйте пакет context для управления и закрытия долгих процессов.
  16. Property-based testing (использование предикатов) - Попрактикуйтесь в TDD с помощью Roman Numerals заданий и получите основы PBT.
  17. Использование math - Научитесь использовать пакет math и нарисуйте часы с использованием SVG.
  18. Чтение файлов - Читайте файлы и обрабатывайте их.

Создание приложения

После погружения в Go пришло время написать свое собственное приложения, используя полученные знания о большинстве важных аспектов языка и как применять TDD.

Каждая глава построена по принципу итеративности и зависит от предыдущей. Приложение обрастает новыми функции шаг за шагом.

Новые понятия будут представлены, чтобы научиться писать качественный код, но большинство материала будет зависеть от стандартных библиотек языка, которые были в предыдущей главе.

В конце главы вы получите полное представление о том, как писать программы на языке Go, покрытые при этом тестами, что особенно требуется для любого серьезного приложения.

  • HTTP-сервер - Мы создадим приложение, которое получает HTTP-запросы и отвечает на них.
  • JSON, маршрутизация и вложения - Мы создадим наши собственные запросы, которые возвращают JSON и разберемся как устроена маршрутизация HTTP-запросов.
  • IO и сортировка - Мы сохраним и прочитаем наши данные с диска и научимся эти данные сортировать.
  • Командная строка и структура проекта - Используем нашу кодовую базу для нескольких приложений и прочитаем ввод из командной строки.
  • Пакет time - Установим активности на определенный период времени с помощью пакета time.
  • Веб-сокеты - Узнаем как написать и протестировать сервер, который использует веб-сокеты.

Частые вопросы и ответы

Я часто сталкиваюсь с популярным вопросом от моих студентов:

Как я могу протестировать функцию, которая сначала делает x, затем y, а в конце z?

Если у вас есть подобные вопросы – заведите новый тикет на GitHub и я постараюсь найти время и написать маленькую главу о том, как решить эту проблему. Я чувствую, что такой контент ценнее, поскольку это настоящие проблемы вокруг тестирования.

  • Вызовы OS-команд - Пример как мы можем вызывать OS-команды для того, чтобы получить данные и сохранить нашу бизнес-логику способной для тестирования.
  • Создание собственных ошибок - Пример как мы можем создавать собственные ошибки, чтобы улучшить тесты и сделать код удобным для дальнейшей работы.
  • Context-независимый Reader - Узнаем как TDD дополняет io.Reader с отменой. Основываясь на статье "Context-aware io.Reader for Go".
  • Проектирование HTTP-хандлеров - Тестирование HTTP-хандлеров кажется болью для большинства разработчиков. Мы найдем основные проблемы и научимся проектировать HTTP-хандлеров правильно.

Дополнения / Обсуждения

  • Почему? - Посмотрите видео или почитайте о том, почему юнит-тестирование и TDD важны.
  • Введение в дженерики - Научитесь как писать функции которые принимают аргументы с дженериками и напишите свою собственную структуру данных.
  • Анти-паттерны - Маленькая глава об анти-паттернах в TDD и юнит-тестировании.

Внести свой вклад в развитие проекта

  • Данный проект находится в стадии разработки, поэтому не стесняйтесь связаться и предложить свои идеи.
  • Прочитайте как правильно контрибьютить в проект.
  • Есть идеи? Создайте новый запрос!

Обо мне

У меня есть опыт обучения Go для разработчиков и я попробовал разные пути: от команды, которая просто интересуется Go, до написания высокоэффективных систем на языке.

Не работающие подходы

Прочитать книгу

Мы пробовали применить подход, который обсуждался в синей книге и каждую неделю обсуждать следующую главу вместе с решением задач.

Мне нравится эта книга, но она требует высокий уровень вовлеченности. Эта книга детально описывает концепты, которые в целом полезны, но это значит что прогресс будет медленным и незаметным – это не для всех.

Небольшое количество людей хотело бы прочитать главу X и решать задачу, при этом большинство людей этого не делали.

Решать часть задач

Решение задач интересное занятие, но обычно их полезность довольна мала при изучении языка. Мы вряд ли будем использовать горутины для решения каких-то задач.

Другая проблема, когда у вас есть несколько уровней энтузиазма. Некоторые люди просто хотят изучить больше концепций языка чем другие и, когда они показывают что они уже сделали, то заканчивают особенностями языка, о котором другие не знают.

Это создает в обучении проблемы, вызывает не структурированность и отсутствие документации, тестов.

Работающие подходы

До этого момента самый эффективный путь был медленно изучать основы языка с помощью go by example, пробовать их запустить локально и смотреть на общую картину. Это немного более интерактивный подход, чем "прочитай главу X и выполни домашнее задание".

После этого вы получаете прочную базу по грамматике языка и поэтому можете начать проектировать какие-либо системы.

Это можно сравнить с практикой игры на гитаре, когда вы начинаете изучать гаммы и как их играть.

При этом не важно насколько вы артистичны, так как вряд ли вы напишите хорошую музыку без понимания основ и практики игры.

Работающие подходы для меня

Когда я изучаю новый язык программирования, я обычно начинаю с каких-то примеров кода и запускаю их в песочнице, но в основном я приверженец определенной структурированности.

Я бы хотел изучить основные концепты и затем укрепить их с помощью идей с тестами. Тесты подтверждают, что мой код корректен и документируют особенности, которые я изучил.

Из моего опыта обучения с группой или самостоятельно, я пытаюсь попробовать создать что-то, что может быть полезно другим разработчикам и командам. Написание маленьких тестов поможет улучшить ваши навыки в проектировании программного обеспечения и даст основы для новых высокоэффективных систем.

Для кого эта книга

  • Любому, кто заинтересовался в изучении Go.
  • Любому, кто уже немного знаком с Go, но хочет изучить TDD подход.

Что мне потребуется для прохождения?

  • Компьютер и установленный терминал, которым вы хорошо пользуетесь.
  • Установленный Go.
  • Текстовый редактор кода.
  • Небольшие познания в программировании. Понимание концепции ветвлений, что такое переменная, функция и т.д

Обратная связь

  • Создавайте новые тикеты/предлагайте изменения здесь или отметьте меня в Twitter.

Лицензия MIT

Логотип нарисовал egonelbre, спасибо!

Owner
Daniil Maslov
Support Engineer at @GoLandIDE. An active member of communities: @gobridge, @thepracticaldev and a bunch of others.
Daniil Maslov
Similar Resources

Golang tutorials - a self-project to learn Go.

Golang tutorials - a self-project to learn Go.

Golang Tutorials a self-project to learn Go. prod by blvnk. Tech With Tim Tutorials Intro to Go created a Hello World program. compiled a Hello World

Feb 21, 2022

Rps-game-in-go - Learn Go for Beginners Crash Course (Golang)

rps-game-in-go This rock-paper-scissors game was based on the Udemy course "Lear

Mar 20, 2022

A snapshot of the assets for the Learn Go course on FreeCodeCamp's youtube

Assets for "Learn Go" on FreeCodeCamp This is a snapshot of the code samples for the "Learn Go" course on Boot.dev at the time the video for FreeCodeC

May 12, 2023

Solving structy.net data structures & algorithms programming problems in Go (with Tests)

structy.net Solving structy.net data structures & algorithms programming problems in Go (with Tests) I. Introduction 000. hey programmer 001. max-valu

Oct 18, 2022

Extremely flexible golang deep comparison, extends the go testing package, tests HTTP APIs and provides tests suite

Extremely flexible golang deep comparison, extends the go testing package, tests HTTP APIs and provides tests suite

go-testdeep Extremely flexible golang deep comparison, extends the go testing package. Latest news Synopsis Description Installation Functions Availab

Jan 5, 2023

Rr-e2e-tests - Roadrunner end-to-end tests repository

Rr-e2e-tests - Roadrunner end-to-end tests repository

RoadRunner end-to-end plugins tests License: The MIT License (MIT). Please see L

Dec 15, 2022

keep track of things you learn / discover everyday!

keep track of things you learn / discover everyday!

🗄 Personal Archive Personal-Archive keeps track of things you learn / discover everyday! 💡 Why I face tons of articles every day. Via googling or RS

May 23, 2022

Learn how to write webapps without a framework in Go.

This is an easy to understand example based tutorial aimed at those who know a little of Go and nothing of webdev and want to learn how to write a webserver in Go. You will create a to do list application as you advance the chapters.

Dec 28, 2022

Learn Go with test-driven development

Learn Go with test-driven development

Learn Go with Tests Art by Denise Formats Gitbook EPUB or PDF Translations 中文 Português 日本語 한국어 Support me I am proud to offer this resource for free,

Jan 1, 2023

Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

Learn how to design large-scale systems. Prep for the system design interview.  Includes Anki flashcards.

English ∙ 日本語 ∙ 简体中文 ∙ 繁體中文 | العَرَبِيَّة‎ ∙ বাংলা ∙ Português do Brasil ∙ Deutsch ∙ ελληνικά ∙ עברית ∙ Italiano ∙ 한국어 ∙ فارسی ∙ Polski ∙ русский язы

Jan 9, 2023

Introduction to beginners learn to go

For-learning-Go-Tutorial 准备写一本Go的书针对初学者快速入门开发和使用go! 学习Go语言需要去了解Go的特性,然后在深入的去实践,如果你想使用Go语言写出Go味道的程序,那么你就需要付出努力去实践了! 先来了解下Go语言为何创造出来的历史吧,Go 语言是由谷歌公司在 20

Dec 25, 2022

Learn what sync.Cond is

Overview This repo is not a library. It is a reference implementation of "hint" for the programmers who are trying to understand how sync.Cond works,

Nov 20, 2022

a simple shitty project for learn more about websockets

video-transmission A simple shitty project for learn more about websockets. For run this you only need to have docker in your computer and then execut

Mar 29, 2022

simpleChatInGo - This is a simple chat that i made for fun asnd learn more about websocket

simpleChatInGo - This is a simple chat that i made for fun asnd learn more about websocket

simpleChatInGo This is a simple chat that i made for fun asnd learn more about websocket deploy For deploy this you only need to run the command : $ d

Sep 21, 2022

My old liquidation bot - doesn't compile, just learn from it

Open sourced liquidation bot So this is my liquidation bot from fall 2020 - its completely outdated and I removed my private key, relevant addrs, so y

Dec 22, 2022

A repository for the X-Team community to collaborate and learn solutions to most coding challenges to help prepare for their interviews.

A repository for the X-Team community to collaborate and learn solutions to most coding challenges to help prepare for their interviews.

Community Coding Challenge Handbook This repository focuses on helping X-Teamers and community members to thrive through coding challenges offering so

Sep 6, 2022

Building a shoe store with golang to learn more about this language :)

shoestore-go Building a shoe store with golang to learn more about this language :) TODO Create a basic webpage with the pages: home : to show homepag

Jan 24, 2022

This project used to learn golang and try to bypass AV

This project used to learn golang and try to bypass AV

sucksAV This project used to learn golang and try to bypass AV 描述 基于Golang开发的BypassAV,采取的shellcode分离技术,将shellcode注入到图片中,通过加载器进行加载,使用Golang动态加载技术 需要使用第

Nov 19, 2022

A very simple rate limiter in go, made as a learning project to learn go and rate limiting patterns!

A very simple rate limiter in go, made as a learning project to learn go and rate limiting patterns!

rate-limiter-go A very simple rate limiter in go, made as a learning project to learn go and rate limiting patterns! Demo: Running the project: To exe

Jun 1, 2022
Introduction to beginners learn to go

For-learning-Go-Tutorial 准备写一本Go的书针对初学者快速入门开发和使用go! 学习Go语言需要去了解Go的特性,然后在深入的去实践,如果你想使用Go语言写出Go味道的程序,那么你就需要付出努力去实践了! 先来了解下Go语言为何创造出来的历史吧,Go 语言是由谷歌公司在 20

Dec 25, 2022
Building a shoe store with golang to learn more about this language :)

shoestore-go Building a shoe store with golang to learn more about this language :) TODO Create a basic webpage with the pages: home : to show homepag

Jan 24, 2022
The purpose of this project is to learn about go-swagger.

learn-go-swagger The purpose of this project is to learn about go-swagger. Requirements Go go-swagger Setup Run ./scripts/gen-swagger to generate swag

Nov 20, 2021
A repository for showcasing my knowledge of the Google Go (2009) programming language, and continuing to learn the language.

Learning Google Golang (programming language) Not to be confused with the Go! programming language by Francis McCabe I don't know very much about the

Nov 6, 2022
A repository for showcasing my knowledge of the Go! (2003) programming language, and continuing to learn the language.
A repository for showcasing my knowledge of the Go! (2003) programming language, and continuing to learn the language.

Learning Go! (programming language) Not to be confused with Google Golang (2009) I don't know too much about the Go! programming language, but I know

Oct 22, 2022
A series of small code snipppets & exercises to learn Go.

Learning-Go A series of small code snipppets & exercises to learn Go. WARNING: During this excercise you will be learning along with me, I am not your

Dec 18, 2021
Learn the Go programming language (Golang) in this step-by-step tutorial course for beginners

Learn the Go programming language (Golang) in this step-by-step tutorial course for beginners. Go is an open source programming language designed at Google that makes it easy to build simple, reliable, and efficient software.

Dec 16, 2021
Learn Golang in-depth by solving 15 Quizzes, 10 Exercises and 4 Projects
Learn Golang in-depth by solving 15 Quizzes, 10 Exercises and 4 Projects

Modern Go (Golang) - The Complete Beginners Guide 2021 Learn Go (Golang) in-dept

Jan 1, 2023
At this example project, I'm trying to learn Golang with Clean structure and come up with a reusable

Learning Golang Language In Clean Structure At this example project, I'm trying to learn Golang with Clean structure and come up with a reusable, nice

Sep 25, 2022
Learn-Nakama - An example project template on how to set up and write custom logic in Nakama server

Nakama Project Template An example project template on how to set up and write c

Apr 18, 2022