SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
7.
DSL in Ruby
validates :name, presence: true
validate :name, presence: true
validates :name, presense: true
Which is correct?
8.
DSL in Ruby
validates :points, numericality: true
validates :points, numericality: { only: “integer” }
validates :points, numericality: { only_integer: true }
Which is correct?
9.
DSL in Ruby
• String/symbol + Hash everywhere
• lack of “Syntax Error”
• everything is void*
• anything is ok for ruby interpreter
• Need a lot of GOOD documentation
10.
DSL in Ruby
• String/symbol + Hash everywhere
• lack of “Syntax Error”
• everything is void*
• anything is ok for ruby interpreter
• Need a lot of GOOD documentation
• and memorization
17.
Configuration
• Self-referential Function
type option func(*Service)
func (s *Service) Config(opts ...option) {
for _, opt := range opts {
opt(s)
}
}
func LogLevel(level int) option {
return func(s *Service) {
s.ErrorLevel = level
}
}
http://commandcenter.blogspot.com.au/2014/01/self-referential-functions-and-design.html
18.
Struct Tag
type Person struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
MiddleName string `json:"middle_name,omitempty"`
}
19.
Struct Tag
• Anti-Pattern
• String-typing
• No compile time checking
• 6 month old bug in KKTIX production, no one noticed
• based on reflect
• slow
• Don’t use it as DSL
20.
Vanilla Go
• Sometimes it’s not enough
• We need to go deeper
22.
Error Handling in Go
• Extremely Verbose
• We already have 3 official error handling patterns
• https://blog.golang.org/errors-are-values
• checking error is fine. But I’m lazy to type
• Messy control flow
23.
Error Handler Generation
• go get github.com/poga/autoerror
• just a demo, don’t use it in production
24.
Auto Error
• Add error checking function
based on the name of error
variable
• Hide error checking from
control flow
25.
//go:generate autoerror -i simple.go -t AutoError -o test.go
type AutoError error
var e AutoError
var e2 AutoError
func Test() {
e = doSomething()
e2 = doSomething()
}
func doSomething() error {
return errors.New("an error")
}
func handleError2(e2 error) {
if e2 != nil {
panic(e)
}
}
func handleError(e error) {
if e != nil {
panic(e)
}
}
26.
//go:generate autoerror -i simple.go -t AutoError -o test.go
type AutoError error
var e AutoError
var e2 AutoError
func Test() {
e = doSomething()
e2 = doSomething()
}
func doSomething() error {
return errors.New("an error")
}
func handleError2(e2 error) {
if e2 != nil {
panic(e)
}
}
func handleError(e error) {
if e != nil {
panic(e)
}
}
27.
//go:generate autoerror -i simple.go -t AutoError -o test.go
type AutoError error
var e AutoError
var e2 AutoError
func Test() {
e = doSomething()
e2 = doSomething()
handleError2(e2)
}
func doSomething() error {
return errors.New("an error")
}
func handleError2(e2 error) {
if e2 != nil {
panic(e)
}
}
func handleError(e error) {
if e != nil {
panic(e)
}
}
28.
//go:generate autoerror -i simple.go -t AutoError -o test.go
type AutoError error
var e AutoError
var e2 AutoError
func Test() {
e = doSomething()
e2 = doSomething()
handleError2(e2)
}
func doSomething() error {
return errors.New("an error")
}
func handleError2(e2 error) {
if e2 != nil {
panic(e)
}
}
func handleError(e error) {
if e != nil {
panic(e)
}
}
29.
//go:generate autoerror -i simple.go -t AutoError -o test.go
type AutoError error
var e AutoError
var e2 AutoError
func Test() {
e = doSomething()
handleError(e)
e2 = doSomething()
handleError2(e2)
}
func doSomething() error {
return errors.New("an error")
}
func handleError2(e2 error) {
if e2 != nil {
panic(e)
}
}
func handleError(e error) {
if e != nil {
panic(e)
}
}
30.
What is Go Generate
• shell scripting in go
$ go generate
//go:generate echo 'hello from go generate'
hello from go generate
31.
go generate
• execute a ruby script
• integrate with code gen tools
• yacc, protocol buffer,… etc
//go:generate ruby gen.rb
//go:generate codecgen -o values.generated.go file1.go file2.go file3.go
32.
go generate
• go get won’t execute ‘go generate’ for you
• generate before publish