Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

go generate everything

Slide 4

Slide 4 text

Зачем?

Slide 5

Slide 5 text

Зачем? • Парсеры, лексеры

Slide 6

Slide 6 text

Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы)

Slide 7

Slide 7 text

Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание бинарных данных

Slide 8

Slide 8 text

Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание бинарных данных • Bailerplate, автодополнение в редакторе

Slide 9

Slide 9 text

Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание бинарных данных • Bailerplate, автодополнение в редакторе • Mocks

Slide 10

Slide 10 text

Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание бинарных данных • Bailerplate, автодополнение в редакторе • Mocks • Generics?!

Slide 11

Slide 11 text

Как?

Slide 12

Slide 12 text

Как? • go/build

Slide 13

Slide 13 text

Как? • go/build • go/token, go/scanner

Slide 14

Slide 14 text

Как? • go/build • go/token, go/scanner • go/ast, go/parser

Slide 15

Slide 15 text

Как? • go/build • go/token, go/scanner • go/ast, go/parser • go/constants, go/types

Slide 16

Slide 16 text

Как? • go/build • go/token, go/scanner • go/ast, go/parser • go/constants, go/types • go/printer, go/format

Slide 17

Slide 17 text

Как проще?

Slide 18

Slide 18 text

Как проще? • text/template

Slide 19

Slide 19 text

Как проще? • text/template • golang.org/x/tools/go/buildutil

Slide 20

Slide 20 text

Как проще? • text/template • golang.org/x/tools/go/buildutil • golang.org/x/tools/go/ast/astutil

Slide 21

Slide 21 text

Как проще? • text/template • golang.org/x/tools/go/buildutil • golang.org/x/tools/go/ast/astutil • golang.org/x/tools/go/loader

Slide 22

Slide 22 text

github.com/josharian/impl $ impl 'c *Connected' events.Event func (c *Connected) String() string { panic("not implemented") } func (c *Connected) Type() string { panic("not implemented") }

Slide 23

Slide 23 text

golang.org/x/tools/cmd/stringer $ stringer -type Type func (i Type) String() string { i -= 1 if i < 0 || i >= Type(len(_index)-1) { return fmt.Sprintf("Type(%d)", i+1) } return _name[_index[i]:_index[i+1]] }

Slide 24

Slide 24 text

//go:generate -type Type $ go generate foo/bar/baz

Slide 25

Slide 25 text

Generics func NewQueue() *Queue { return &Queue{items: make([]T, 0)} } func (q *Queue) Push(item T) {} func (q *Queue) Pop() T {}

Slide 26

Slide 26 text

gopkg.in/reform.v1 type Struct interface { String() string Values() []interface{} Pointers() []interface{} View() View }

Slide 27

Slide 27 text

Вопросы?

Slide 28

Slide 28 text

Сообщество 12 golang-ru.slack.com 4gophers.ru/slack gophers.slack.com meetup.com/Golang-Moscow meetup.com/GolangNSK meetup.com/Golang-Peter golangshow.com