Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go generate everything
Search
Alexey Palazhchenko
November 08, 2016
Programming
1
360
Go generate everything
Alexey Palazhchenko
November 08, 2016
Tweet
Share
More Decks by Alexey Palazhchenko
See All by Alexey Palazhchenko
Песнь Хорьков и Гоферов
aleksi
0
280
Fuzzy generics
aleksi
0
110
On Ferrets and Gophers
aleksi
0
210
How to Go Wrong with Concurrency
aleksi
2
710
Adding context to existing code
aleksi
1
99
Зачем и как написать свой database/sql драйвер
aleksi
1
120
Cooking gRPC
aleksi
1
750
Profiling and Optimizing Go Programs
aleksi
1
1.7k
Go: начало
aleksi
0
90
Other Decks in Programming
See All in Programming
Perl 5 OOP機構30年史 - Perl 5's OOP Mechanism over the past 30 years
moznion
0
390
Desafios e Lições Aprendidas na Migração de Monólitos para Microsserviços em Java
jessilyneh
2
150
Architecture Decision Record (ADR)
nearme_tech
PRO
1
690
Why Prism?
kddnewton
4
1.7k
Patched fetch did not work
quramy
4
410
The Shape of a Service Object
inem
0
530
LangChainの現在とv0.3にむけて
os1ma
4
940
Go1.23で入った errorsパッケージの小さなアプデ
kuro_kurorrr
2
400
開発を加速する共有Swift Package実践
elmetal
PRO
0
420
Rechartsで楽にゴリゴリにカスタマイズする!
10tera
1
170
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
0
130
Google Sign-inの移行から始めるCredential Manager活用
clockvoid
0
410
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
42
5.7k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
41
6.5k
YesSQL, Process and Tooling at Scale
rocio
167
14k
Designing the Hi-DPI Web
ddemaree
278
34k
Building Adaptive Systems
keathley
36
2.1k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Side Projects
sachag
451
42k
How to Think Like a Performance Engineer
csswizardry
16
960
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
26
1.9k
The Power of CSS Pseudo Elements
geoffreycrofte
71
5.3k
Ruby is Unlike a Banana
tanoku
96
11k
How to name files
jennybc
75
98k
Transcript
None
None
go generate everything
Зачем?
Зачем? • Парсеры, лексеры
Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы)
Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание
бинарных данных
Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание
бинарных данных • Bailerplate, автодополнение в редакторе
Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание
бинарных данных • Bailerplate, автодополнение в редакторе • Mocks
Зачем? • Парсеры, лексеры • Конвертация данные (Unicode-таблицы) • Встраивание
бинарных данных • Bailerplate, автодополнение в редакторе • Mocks • Generics?!
Как?
Как? • go/build
Как? • go/build • go/token, go/scanner
Как? • go/build • go/token, go/scanner • go/ast, go/parser
Как? • go/build • go/token, go/scanner • go/ast, go/parser •
go/constants, go/types
Как? • go/build • go/token, go/scanner • go/ast, go/parser •
go/constants, go/types • go/printer, go/format
Как проще?
Как проще? • text/template
Как проще? • text/template • golang.org/x/tools/go/buildutil
Как проще? • text/template • golang.org/x/tools/go/buildutil • golang.org/x/tools/go/ast/astutil
Как проще? • text/template • golang.org/x/tools/go/buildutil • golang.org/x/tools/go/ast/astutil • golang.org/x/tools/go/loader
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") }
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]] }
//go:generate -type Type $ go generate foo/bar/baz
Generics func NewQueue() *Queue { return &Queue{items: make([]T, 0)} }
func (q *Queue) Push(item T) {} func (q *Queue) Pop() T {}
gopkg.in/reform.v1 type Struct interface { String() string Values() []interface{} Pointers()
[]interface{} View() View }
Вопросы?
Сообщество 12 golang-ru.slack.com 4gophers.ru/slack gophers.slack.com meetup.com/Golang-Moscow meetup.com/GolangNSK meetup.com/Golang-Peter golangshow.com