Обережно, книга «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 показують що у автора відсутній достатній практичний досвід.
Рекомендуйте книги в коментарях які вам сподобались
Останнім часом бачив пару книг-стартапів у яких піару в описі та коментарях до книги більше ніж насправді.
Тому очікую в коментарях ваші літературні рекомендації.
42 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів