🇺🇦 Go for two :)
1.18K subscribers
22 photos
3 files
184 links
Telegram channel about tricks and engineering practices in the Go programming language over a cup of coffee ☕️.

author: @a_soldatenko
personal blog: https://asoldatenko.org

#golang #go #kubernetes #debugging
加入频道
Note #56: FOSDEM 2020

Если вы вдруг решили тоже поехать на FOSDEM 2020 и загляните в Go dev room, то сможете встретить там меня с докладом ;) Буду рад пообщаться лично!

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

P.S. На всякий случай что такое FOSDEM и какие ещё есть аудитории, с докладами и расписание go dev room:
https://fosdem.org/2020/schedule/track/go/
Note #57: The state of Go on 02 02 2020

Сегодня Францеск и Maartje открыли Go Dev room на FOSDEM 2020, рассказали про то как обстоят дела в Go и какие изменения в языке/стандартной библиотеке были сделаны [1].

Slides: -> https://speakerdeck.com/campoy/the-state-of-go-2020

P.S. Кстати happy palindromic day! (02022020)
Note #58: The Zen of Go

По аналогии с Zen of Python, Dave Cheney представил The Zen of Go на GopherCon Israel 2020.

1. Each package fulfils a single purpose
2. Handle errors explicitly
3. Return early rather than nesting deeply
4. Leave concurrency to the caller
5. Before you launch a goroutine, know when it will stop
6. Avoid package level state
7. Simplicity matters
8. Write tests to lock in the behaviour of your package’s API
9. If you think it’s slow, first prove it with a benchmark
10. Moderation is a virtue
11. Maintainability counts

По ссылке есть описание каждого пункта -> https://the-zen-of-go.netlify.com/.

P.S. возможно добавить сюда https://github.com/andriisoldatenko/proverbs? или пусть живет отдельно.
Note #59: Релиз кандидат (RC1) для Go 1.14

Из наиболее значимого в go 1.14 внесли изменения в спецификацию языка, а именно, теперь разрешается встраивать интерфейсы с пересекающимися наборами методов.

Возвращаясь к реальной жизни давайте разберем пример типичного интерфейса:
package user

type Database interface {
GetUser(userID uint64) (model.User, error)
}

И допустим у меня есть несколько других пакетов, из которые я тоже хочу доставать информацию о пользователе, поэтому нам необходимо встроить интерфейс user.Database в hardware.Database и тоже самое для wallet.Database:
package hardware

type Database interface {
user.Database
SaveDevice(usertID uint64, device model.Device) error
}

package wallet

type Database interface {
user.Database
ReadWallet(userID uint64) (model.Wallet, error)
}

Ну и классика жанра, прилетает задача где нужно создать интерфейс shopping.Database который должен в себе содержать методы hardware.Database и wallet.Database:
package shopping

type Database interface {
wallet.Database
hardware.Database
Buy(userID uint64, deviceID uint64) error
}
И в go версии меньше чем go 1.14 мы получим ошибку:
Duplicate method GetUser(userID uint64) (model.User, error)
Если запустить go1.14rc1 run main.go то все будет ок 🎉

P.S. эта проблема была еще озвучена Алоном Донованом в 2013 году!!! [1]

Links:
[1] spec: allow embedding overlapping interfaces https://github.com/golang/go/issues/6977
[2] Proposal https://github.com/golang/proposal/blob/master/design/6977-overlapping-interfaces.md
Note #60: GoWeekly and FOSDEM

Как я уже писал в https://yangx.top/golang_for_two/82 в этом году я выступал на FOSDEM 2020 в потоке Go, кстати это был мой первый FOSDEM =).
Видео моего выступления с FOSDEM попало в рассылку GoWeekly 🎉

https://golangweekly.com/issues/298

P.S.
[1] slides: bit.ly/adv_debug_goF0SD3M
[2] video: https://www.youtube.com/watch?v=2kjmLQY8RJk
Note #61 govalidate 🌳

TIL: Если запустить govalidate, то можно убедиться, что вы используете не последнюю версию Go 😜

До:
$ govalidate
[✗] Go (go1.13)
Your current Go version (go1.13) is old.
Current Go versions are go1.14, go1.13.8, .
Visit https://golang.org/dl/ for a new version.
[✔️] Checking if $PATH contains "/Users/andrii/workspace/bin"
[✔️] Checking gcc for CGO support
[✔️] Vim Go plugin

после upgrade go:
$ govalidate
[✔️] Go (go1.14)
[✔️] Checking if $PATH contains "/Users/andrii/workspace/bin"
[✔️] Checking gcc for CGO support
[✔️] Vim Go plugin

P.S. thanks Jaana Dogan @rakyll for govalidate
P.P.S $ go get -u github.com/rakyll/govalidate
Note #62 GopherCon Russia 2020

Мои старые друзья 28 марта проводят GopherCon Russia 2020! В этому году у меня не получается поехать :(

Но! У меня есть 1 билет, который я подарю тому, кто первый напишет в чате канала(кнопка discuss), как придумали название известной консольной утилиты “grep”?

Удачи :)

P.S. подробности и регистрация на сайте: https://www.gophercon-russia.ru/
Note #63 A new Go API for Protocol Buffers

В официальном #golang блоге появилась статья про новый Go API для Protocol Buffers.

Рекомендую почитать! ->

https://blog.golang.org/a-new-go-api-for-protocol-buffers
Note #64 New net/url.URL.Redacted method in go 1.15

В Go1.15 появится удобный метод net/url.URL.Redacted [1], по сути, похож на url.URL.String(), только заменяет пароли на xxxxxxx, будет удобно для логирования:

package main

import (
"fmt"
"net/url"
)

func main() {
u := &url.URL{
Scheme: "https",
User: url.UserPassword("user", "password"),
Host: "example.com",
Path: "foo/bar",
}
fmt.Println(u.Redacted())
u.User = url.UserPassword("me", "newerPassword")
fmt.Println(u.Redacted())
}
// gotip run main.go
// https://user:[email protected]/foo/bar
// https://me:[email protected]/foo/bar



Links:
[1] https://go-review.googlesource.com/c/go/+/207082/
Note #65: новые темплейты в Go плайграунде!

* тесты
* поддержка нескольких файлов включая go.mod!
* можно напечатать картинку

https://play.golang.org
Note #66: Go плайграунд теперь исполняет код в multi-threaded linux контейнере

Если у вас есть необходимость в демонстрации многопоточного кода на Go, который использует несколько горутин и которые, в свою очередь, используют один поток (thread) операционной системы или несколько потоков (threads), которые используют разные ядра. В общем теперь можно изучать go параллелизм в плайграунде 🙌

package main

import (
"fmt"
"runtime"
)

func main() {
fmt.Printf("GOOS[%s] GOARCH[%s] GOMAXPROCS[%d] NumCPU[%d]", runtime.GOOS, runtime.GOARCH, runtime.GOMAXPROCS(0), runtime.NumCPU())
}
// OOS[linux] GOARCH[amd64] GOMAXPROCS[8] NumCPU[8]


P.S. объяснение от Брэда Фицпатрика:
Это стало возможным после того, как удалили поддержку Native Client (GOOS=nacl) в Go 1.14, и теперь go плайграунд запускается с помощью gVisor.
https://github.com/golang/go/issues/25224
https://github.com/golang/playground/commit/4d362417fd14b0b8349150cb28c3e8f2e756932e
Note #67 What's coming in Go 1.15

Daniel Martí aka @mvdan_ недавно выступал на онлайн конференции "Go Remote Fest" с докладом: "What's coming in Go 1.15"!

Слайды его доклада можно найти по ссылке [1] или

Top 5 изменений:
- slightly smaller binaries (0.2% но все же =)
- new linker (еще WIP но можно ужно читать/смотреть [2]
- embed tzdata with time/tzdata https://github.com/golang/go/issues/38017
- add testing.TB.TempDir https://github.com/golang/go/issues/35998
- add testing.T.Deadline https://github.com/golang/go/issues/28135

Links:
- [1] https://docs.google.com/presentation/d/1veyF0y6Ynr6AFzd9gXi4foaURlgbMxM-tmB4StDrdAM/edit#slide=id.g840eaeb4b4_0_99
- [2] https://docs.google.com/document/d/1D13QhciikbdLtaI67U6Ble5d_1nsI4befEd6_k1z91U/view
Note #68: The Rules of Optimization Club

1. You do not optimize.
2. You do not optimize, without measuring first.
3. When the performance is not bound by the code, but by external factors, the optimization is over.
4. Only optimize code that already has full unit test coverage.
5. One factor at a time.
6. No unresolved bugs, no schedule pressure.
7. Testing will go on as long as it has to.
8. If this is your first night at Optimization Club, you have to write a test case.

from https://wiki.c2.com/?RulesOfOptimizationClub
Note #69: Debugging concurrency programs in Go

Slides of my talk: "Debugging concurrency programs in Go" from @GoWayFest

https://bit.ly/2C0vJOG
TIL: go get -x

If you need to run go get with debug info, it can surprise you because there is no -v or —verbose flag.
But we can run -x to show debug info TBH print the commands get eXecutes:

go get -x -u github.com/gliderlabs/ssh


P.S. -x also works with go mod.
Note #71 The seven rules of a great Git commit message

1. Separate subject from body with a blank line
2. Limit the subject line to 50 characters
3. Capitalize the subject line
4. Do not end the subject line with a period
5. Use the imperative mood in the subject line
6. Wrap the body at 72 characters
7. Use the body to explain what and why vs. how

https://chris.beams.io/posts/git-commit/
Note #72 TestMain in Go 1.15 testing package no longer calls os.Exit

tl;dr
- Go1.15 has been released
- Changed the implementation of the testing package so that TestMain no longer calls os.Exit
- It is realized by changing the implementation of testing.M and modifying the template of the main function generated by go test.

Found interesting article with great examples of changes between 1.14 and 1.15 -> https://qiita.com/hgsgtk/items/40e63150affed01f6573

TIP: right click translate into English.