Обережно, книга «Mastering Go» з помилками

Мова програмування Go набирає популярності в Україні, про це каже збільшення вакансій з Go, а також винагороди які заробляють Go-розробники і Go-розробниці згідно зарлатного опитування 2020 року в Україні серед розробників.

В США Go-розробники і Go-розробниці також гідно заробляють згідно Stack Overflow Developer Survey 2020.

Буде чесно зауважити, що і в Україні, і в США, тільки Scala-розробники заробляють більше ніж Go.

Go — мова програмування з низьким порогом знань для входу, це її особливість, на Go можна розробляти високонавантажені проекти і Go production ready проекти.

Звісно це призводить до того, що на Go портують різні клієнти, для своїх БД, спеціалісти без достатньої кваліфікації з Go.
Так офіційний Go клієнт до ClickHouse був настільки повільним, що використовували github.com/kshvakov/clickhouse-go.
Схожа ситуація з Elasticsearch де офіційний клієнт також пасе задніх бо комфортніше користуватись github.com/olivere/elastic.

Ось ми і прийшли до того, що спеціалісти без достатньої кваліфікації з Go починають писати книжки.

Mastering Go

Сама книга Mastering Go вже публікується в другій редакції і доступна за $40 на сайті Packt, та навіть перекладена на інші мови.

Хто читає перші сторінки книжки то знає, що перед використанням прикладів коду з книжки, треба отримати дозвіл у редакції, цього разу приклади коду доступні у відкритому доступі на GitHub з ліцензією MIT, отже можемо сміло використовувати і без дозволу.

Mastering Go та помилки з sync.WaitGroup

Коли є досвід з Go то книжки читати нудно, бо багато повторень, але часом таке бажання є і коли дивлюсь книгу то починаю саме з горутин та синхронізації, і цього разу знайшов помилки про які захотів написати.

package main

import (
	"fmt"
	"sync"
)

var m sync.Mutex

func function() {
	m.Lock()
	fmt.Println("Locked!")
}

func main() {
	var w sync.WaitGroup

	go func() {
		defer w.Done()
		function()
	}()
	w.Add(1)

	go func() {
		defer w.Done()
		function()
	}()
	w.Add(1)

	w.Wait()
}

код взятий з Mastering-Go-Second-Edition/ch10/forgetMutex.go
в цьому прикладі коду є помилка яку описує сам автор, це forget mutex, але звісно є ще:

go func() {
	defer w.Done()
	// ...
}()
w.Add(1)

в такому прикладі коду w.Done() може виконатись перед w.Add(1) і буде паніка:

panic: sync: negative WaitGroup counter

Друга помилка також з WaitGroup:

go func() {
	waitGroup.Add(1)
	defer waitGroup.Done()
	// ...
}()

waitGroup.Wait()

повний приклад доступний на Mastering-Go-Second-Edition/ch10/rwMutex.go
цього разу waitGroup.Wait() може виконатись до дії яку запланували в горутині.

Помилки в книгах трапляються, як і усюди, але подібні помилки в книгах про Go показують що у автора відсутній достатній практичний досвід.

Рекомендуйте книги в коментарях які вам сподобались

Останнім часом бачив пару книг-стартапів у яких піару в описі та коментарях до книги більше ніж насправді.
Тому очікую в коментарях ваші літературні рекомендації.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

В Україні Go спільнота росте тому треба книжки критикувати і статті писати і бібліотеки

Так, дійсно, Packt не є взірцем))), але ми ж не маємо на увазі, що їх книги та відео є єдиним доступним джерелом знань...?!?
Вцілому, звісно, краще читати рідну документацію та видання більш авторитетних «митців»), але якщо людина тільки починає свій шлях в програмуванні, то суха інфа із доків може не зайти...
На сьогодні крім Head First Go та Mastering Go є, на жаль, не так вже й багато свіжих та доступних книг...
Тому кожне нове видання, я розцінюю, як гарну та позитивну подію... навіть коли із недоліками;))
Head First Go від O`Reilly, як на мене, більше довіднік по Go..
В Packt же більше розкрите саме використання Go (TCP/IP, IPv4/6, Docker, ML, gRPC, etc)... і хай це не повноцінна практика, але для розширення кругозору початківців — норм...
P.S. Зараз дочитую «Terraform Up & Running» O`Reilly 2019р. — і вона вже «підстаркувата»)), чекаю на «Terraform in Action» від Manning, має вийти аж весною 2021р. і не відомо, чи буде достатньо актуальною на той час... Думаю над програмою раннього доступу MEAP ;))

Я пробую воспроизвести описаную ошибку panic: sync: negative WaitGroup counter и не выходит. Не совсем понимаю как главная горутина будет выполняться позже чем та что создана через литерал. Спасибо

Запусти 1 000 000 разів і вдасться

А ще дякую що піддав сумніву і написав, бо зазвичай соромляться

Что я делаю не так?
for i in {1..1000000}; do go run wgerror.go; done | grep "panic: sync: negative WaitGroup counter"
play.golang.org/p/rIWlOzpiH85
При таком запуске и коде, ошибки нет

package main

import (
	"sync"
)

var m sync.Mutex

func function() {
	m.Lock()
	// fmt.Println("Locked!")
	m.Unlock()
}

func main() {
	for i := 0; i < 1000000; i++ {
		go many()
	}
}

func many() {
	var w sync.WaitGroup

	go func() {
		defer w.Done()
		function()
	}()
	w.Add(1)

	go func() {
		defer w.Done()
		function()
	}()
	w.Add(1)

	w.Wait()
}

Это совершенно другой код. Если вынести из главной горутины то планировщик по другому может их распределить. А если как у автора то ошибки быть не может. У главной горутины будет приоритет в таком варианте, если нет синхронизации сразу после вызова тех двух горутин то код выполнится до wg.Wait() и только потом планировщик полезет в очереди за ждущими горутинами. Правильно?

В такому варіанті також буде паніка

func main() {
	for i := 0; i < 1000000; i++ {
		many()
	}
}

Приклади коду мають працювати коректно в головній горутині та в другорядних

Это все равно другой код :) Код должен работать корректно так как он представлен. Поинтересуйтесь работой планировщика.

Взяв приклад з книжки, виправив помилку яку описував автор, запустив новий приклад 1 000 000 разів і в терміналі отримав повідомлення про паніку.

А как запускали? Хочу проверить почему у меня нет ошибки.

Я запускаю локально, але в playground також видає паніку

Частіше саме так і буває)))))

Ви можете написати автору — у нього є контакти на сайті (див. github профіль), а ще — github issues.
Також Packt запрошує волонтерів-ревьюверів до співпраці.

Якщо так дивитись то краще вкладати в Black Hat Go, там хоч є історія змін

Якщо підтвердять то ще пошукаю

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

Книги печатают не для знаний, а на продажу. Покупают и ладно.

IMHO: Якби в Україні було подібне видавництво, цим можна було б пишатися. Так, можливо, це не Manning, не O’Reilly, не Apress, але вони випускають доволі багато книжок, розвиваються, випускають нові продукти. Майже щодня надають одну книжку безкоштовно.
Автори теж різні, з нашої країни теж.

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

Они Индию этим издательством дискредитируют на много лет вперед, «пишатися» тут совершенно нечем.

именно. При том что там есть хорошие специалисти и есть кому написать книжку но они все в менингах да орейли

Початківцям складно побачити на скільки книжка бракована, тому й далі будуть читати Packt

Подумаю над темою на DOU, щоб порівняти видавництва, які можна читати, а які варто оминати

ну вот про то что пакт = дичь стоит донести

Щиро заздрю натхненню;))

Я знаю в тебе є книжки які хочеш порекомендувати ще

Але ти вже рекомендував книгу Mastering Go раніше

Так... і зараз рекомендую...
Вважаю кращою на зараз для початківців... не зважаючи на недоліки...

Як початківець починав з The Go Programming Language але звісно читаючи вперше помилки пропускав, якщо такі були github.com/adonovan/gopl.io

Раніше читав пару книжок з серії «Head First», для Go також є Head First Go та github.com/headfirstgo, але також читав коментарі що занадто розжована

Цілком можливо що «Head First Go» буде краще для початківців, читав її?

«Head First Go» я б рекомендував для розуміння самої мови, а «Mastering Go» — тут більше розуміння для чого, як саме і з чим вона використовується... якось так;)))

А взагалі-то є t.me/goproglib
та t.me/golanglibrary
Там на різні смаки є;))

Жалко только нет полного описания работы планировщика. Хотя GC хорошо описан.

“BLACK HAT GO” 2020 by Tom Steele, Chris Patten, and Dan Kottmann.

Black Hat Go і приклади коду теж доступні на github.com/blackhat-go/bhg

Буду дивитись

Дивись, не пропусти нічого... ;))

Знову шукав «sync» але поки знайшов тільки мінорні:

func parse(filename string) (map[string]string, error) {
	records := make(map[string]string)
	fh, err := os.Open(filename)
	if err != nil {
		return records, err
	}
	defer fh.Close()

	// ...
}

func main() {
	var recordLock sync.RWMutex

	records, err := parse("proxy.config")
	if err != nil {
		log.Fatalf("Error processing configuration file: %s\n", err.Error())
	}

	// ...
}
Але тематика книжки сподобалась, буду читати

Я теж бачу в текстах московизми, але насправді московити запозичили багато українських слів: «творожники» замінили українським словом «сирники», назву «Росія» взяли з нашої назви Русь і таких прикладів достатньо.

Справа не в русизмі, а в тому що сей русизм порушує благозвучність української і фактично змушує почути суржик. Є досить багато чого з російської та української, що вільно мігрують поміж мовами. Але ж не наголос. Наголос важливий для розуміння не лише патерну слова, але й патерну інтонації. Наголос на перший склад визначає простий та грубий патерн, без зайвих зв′язків з іншими словами. Сміло — це те, про що потім казатимуть «слабоуміє і отваґа». Щось на кшталт «борзо».

Мне очень понравилась вот эта книга: opac.lpnu.ua/bib/60115
Правда читал я ее лет в 12, так что впечатления могут быть смазаны

Підписатись на коментарі