Size: a a a

Go на двоих

2019 February 05
Go на двоих
🔖 О чем канал?

3 года назад попался мне проект prometheus, и вот пытался я его запустить все дела. Как обычно, начинаешь устанавливать, проходить всякий getting-started, потом … часа через 2 ты уже дебажишь исходный код и пытаешься отправить свой патч на Github.
Так я узнал про язык программирования Go! На этой приятной ноте, предлагаю Вам подписаться на мой канал чтобы быть в курсе того над чем я работаю и прочитать что-то интересное (не ссылку и не копипаст) о новом, но довольно популярном языке программирования Go за чашечкой кофе  :)

P.S. В комментариях можно поделиться своей историей, о том как Вы начали писать на Go и почему?
P.P.S. Лого канала взял у жены Rob Pike  -> Renee French https://www.instagram.com/reneefrench/ :)
источник
Go на двоих
🐛Дебажим код написанный на Go


Да код на Go можно и нужно дебажить. Часто сталкиваюсь в разных командах, как разработчики, до сих пор в 2019 году! дебажат принтами :)

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


Установить можно так: go get -u github.com/go-delve/delve/cmd/dlv
Чаще всего я использую dlv debug <имя пакета>.

dlv debug github.com/andriisoldatenko/go-blog

Либо

dlv debug main.go
(dlv) breakpoint main.go:1
(dlv) continue

После того как установили breakpoint, можно нажать continue и программа остановится там где нужно и так далее. Также есть shortcuts (b, c, l и так далее).
источник
2019 February 13
Go на двоих
🔨 Note #3 Настраиваем дебаггер

Сегодня наткнулся на то, что print в режиме дебаггера, не показывает длинные строки.

> main.main() ./main.go:7 (PC: 0x10b08d4)
    2:
    3:  import "fmt"
    4:
    5:  func main() {
    6:    v1 := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
=>   7:    fmt.Println(v1)
    8:  }
(dlv) p v1
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...+2 more"

(dlv) config -list
aliases            map
substitute-path    
max-string-len     <not defined>
max-array-values   <not defined>
show-location-expr false

(dlv) config max-string-len 1000
(dlv) p v1
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

✅ Теперь можно напечатать длинную строку.
источник
2019 March 24
Go на двоих
Writing and Optimizing Go code

This document outlines best practices for writing high-performance Go code.

https://github.com/dgryski/go-perfbook/blob/master/performance.md
источник
2019 March 29
Go на двоих
Свежие статьи:
- Go 2018 Survey Results https://blog.golang.org/survey2018-results
- Debugging what you deploy in Go 1.12 https://blog.golang.org/debugging-what-you-deploy (от https://twitter.com/Dr2chase)
источник
2019 April 05
Go на двоих
Вот как нужно делать программу для конференции!
GoCon Canada -> https://play.golang.org/p/dSlNFqsiKKl
источник
2019 April 16
Go на двоих
Наверное одна из самых лучших статей, которые попадались мне на тему как писать хороший Git Commit Message https://chris.beams.io/posts/git-commit/
источник
2019 June 26
Go на двоих
источник
2019 June 27
Go на двоих
Чистый код только в контексте Го https://github.com/Pungyeon/clean-go-article
источник
2019 July 04
Go на двоих
COME ON SHOW US THE REGULAR EXPRESSION
или как Cloudflare обещает показать регулярное выражение ...
https://blog.cloudflare.com/cloudflare-outage/
источник
Go на двоих
Ответ очевидный :)
источник
Go на двоих
Брайн Керниган рассказывает как придумали название "grep" ->
eсли кратко то:
g/re/p
если догадались почему именно так, либо можно посмотреть видос:
https://www.youtube.com/watch?v=NTfOnGZUZDk
источник
2019 July 05
Go на двоих
Монстры внутри sync.Locker
GoGoConf 2019: Roberto Clapis
https://www.youtube.com/watch?v=ok4NEfqAXb0
источник
2019 July 09
Go на двоих
Note #4 Дебажим приложение на Go в докере 🐳

Итак нам понадобится:
- прямые руки и тазик с предустановленным докером

$ cat Dockerfile
FROM golang:1.13

WORKDIR /go/src/app
COPY . .

RUN go get -u github.com/go-delve/delve/cmd/dlv

CMD ["app"]


$ docker build -t my-golang-app .

# Это всего лишь один из вариантов, иногда нужно вместо bash сразу dlv запускать и так далее
$ docker run -it --rm my-golang-app bash

$ root@03c1977b1063:/go/src/app# dlv main.go
Error: unknown command "main.go" for "dlv"
Run 'dlv --help' for usage.
root@03c1977b1063:/go/src/app# dlv debug main.go
could not launch process: fork/exec /go/src/app/__debug_bin: operation not permitted

OOps...

Итак добавим параметры:

$ docker run -it --rm --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE my-golang-app bash

И вуаля 🎉
$ root@7dc3a7e8b3fc:/go/src/app# dlv debug main.go
Type 'help' for list of commands.
(dlv)

P.S. опять же этот же трюк можно использовать с docker-compose/ либо с multi-stage билдами. Если интересно как дебажить multi-stage билды на Го просьба поставить “+” в комментариях или кинуть помидором 🍅.
источник
2019 July 14
Go на двоих
Note #5 Дебажим приложения в multi-stage докере 🐳

Давайте представим, что на проде у вас есть микросервис, каждый из которых живет в своем Dockerfile и естественно, как у всех взрослых дядь - это multi-stage Dockerfile. Более подробно о multi-stage можно прочитать в доках ( https://docs.docker.com/develop/develop-images/multistage-build/), если лень - то этопросто Dockerfile у которого есть 2 FROM ключевых слова и в мы что-то копируем из одного в другой слой.

Итак приступим 🐎:
docker build -t goapp:latest .
Sending build context to Docker daemon  22.53kB
Step 1/7 : FROM golang AS builder
...
Successfully tagged goapp:latest


Каждый день нам нужно разрабатывать и дебажить это приложение: внимательный читатель может предложить установить дебаггер внутри одного из слоев. Итак добавим что-то вроде:


--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,5 @@
FROM golang AS builder
+RUN go get -u github.com/go-delve/delve/cmd/dlv
ADD . /src
RUN cd /src && go build -o goapp


И затем запустим что-то вроде этого:

➜  debug-multi-stage-docker-and-go docker run -it --entrypoint=dlv goapp
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"dlv\": executable file not found in $PATH": unknown.


И вот незадача, та же история будет если у вас docker-compose для локальной разработки или что-то еще. Как быть)
Есть замечательный флаг --target у docker build!

docker build --target builder -t goapp:latest .
docker run -it goapp sh
# dlv debug main.go
could not launch process: fork/exec /src/__debug_bin: operation not permitted

А как пофиксить это ☝️, читай мой прошлый пост https://t.me/golang_for_two/20 )

И Вуаля! Огромный Плюс ⚡️ данного подхода лично для меня, отсутствие Dockerfile-dev и вариантов.

P.S. Если же у тебя docker-compose, то в своем docker-compose.override.yml можно написать так:
version: "3.4"
services:
 app:
   image: goapp:dev
   build:
     context: .
     dockerfile: Dockerfile
     target: builder

🎉💥🎉
источник
2019 July 17
Go на двоих
Note #6 Дебажим тесты 🐛🔥

Итак, часто нужно запустить 1 тест да еще и в режиме отладки, например, когда вы написали тест который повторяет баг. Все очень просто (хотя из доков не особо очевидно):

dlv test -- -test.run NameOfYourTest/PartOfTheName* (по сути тоже самое что и go test -run)

Или живой пример:

➜  debug_test dlv test -- -test.run TestFibonacciBig
(dlv) b main_test.go:6
Breakpoint 1 set at 0x115887f for github.com/andriisoldatenko/debug_test.TestFibonacciBig() ./main_test.go:6
(dlv) c
> github.com/andriisoldatenko/debug_test.TestFibonacciBig() ./main_test.go:6 (hits goroutine(17):1 total:1) (PC: 0x115887f)
    1:  package main
    2:
    3:  import "testing"
    4:
    5:  func TestFibonacciBig(t *testing.T) {
=>   6:    var want int64 = 55
    7:    got := FibonacciBig(10)
    8:    if got.Int64() != want {
    9:      t.Errorf("Invalid Fibonacci value for N: %d, got: %d, want: %d", 10, got.Int64(), want)
   10:    }
   11:  }
(dlv)

Также можно запустить с -v (помним о go test -v):

➜  debug_test dlv test -- -test.v -test.run TestFibonacciBig
(dlv) c
=== RUN   TestFibonacciBig
--- PASS: TestFibonacciBig (0.00s)
PASS
источник
2019 July 24
Go на двоих
Designing Go code with interface chaining vs requiring deps.

https://gist.github.com/joncalhoun/0cd99c9082d2ba210c5169082038a420

Note: этот gist от создателя https://gophercises.com/, он написал в твиттере: времени нет писать 2 статьи - ловите код :)
источник
Go на двоих
Буду выступать на Kyiv Go Meetup 30 July 2019 вместе с @Ychumakov

https://www.meetup.com/uagolang/events/263393813/
источник
Go на двоих
В одном из недавних постов я писал, что люди требуют крови!: https://t.me/golang_for_two/16

CloudFlare написал long read на эту тему, что пошло не так -> https://new.blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019

Но самое интересно, там есть Gif в которой тестируют RegExp и Go комюнити в лице Nate Fintch прикинул, что можно написать так:

// Equivalent normal code is worst case len(s)+1 steps:
if !strings.HasSuffix(s, ";") {
   return false
}
if !strings.Contains(s, "=") {
   return false
}
источник
Go на двоих
Памятка Go разработчку про regexp!
источник