Slide 1

Slide 1 text

pp and reflect Go Conference 2015 summer Takashi Kokubun

Slide 2

Slide 2 text

Who is k0kubun? • Twitter, GitHub: @k0kubun • Cookpad • Rubyist

Slide 3

Slide 3 text

k0kubun/pp Colored Pretty Printer https://github.com/k0kubun/pp

Slide 4

Slide 4 text

k0kubun/pp • Prettily print any complex data structures • Simple APIs like “fmt” import "github.com/k0kubun/pp" for _, tweet := range tweets { pp.Println(tweet) }

Slide 5

Slide 5 text

k0kubun/pp • Prettily print any complex data structures • Simple APIs like “fmt”

Slide 6

Slide 6 text

k0kubun/pp ͷෆศͳॴ • ᶃ import͢ΔURL͕ࢥ͍ग़ͤͳ͍ • ᶄ import͠௚͢ͷ͕ΊΜͲ͍͘͞

Slide 7

Slide 7 text

import͢ΔURL͕ࢥ͍ग़ͤͳ͍ Ϣʔβʔͷෆຬᶃ

Slide 8

Slide 8 text

import͢ΔURL͕ࢥ͍ग़ͤͳ͍ import "github.com/○○○/pp" ↑ ͜ͷਓ୭͚ͩͬ…

Slide 9

Slide 9 text

import͢ΔURL͕ࢥ͍ग़ͤͳ͍ ppͷcontributorͷํ

Slide 10

Slide 10 text

import͢ΔURL͕ࢥ͍ग़ͤͳ͍ ձࣾͷઌഐ ͍͍ͪͪιʔείʔυʹ k0kubun͞Μͷ໊લॻ͖ͨ͘ͳ͍Ͱ͢Ͷ…

Slide 11

Slide 11 text

go-pp/ppͱ͍͏forkΛimport import “github.com/go-pp/pp" or import “gopkg.in/pp.v2” ղܾํ๏ɿ

Slide 12

Slide 12 text

import͠௚͢ͷ͕ΊΜͲ͍͘͞ Ϣʔβʔͷෆຬᶄ

Slide 13

Slide 13 text

import͠௚͢ͷ͕ΊΜͲ͍͘͞ import "github.com/k0kubun/pp" ↑ pp.Println() Λॻ͍ͨΓফͨ͠Γ͢ Δͨͼʹ௥Ճ͠௚͢ඞཁ͕͋Δ

Slide 14

Slide 14 text

ؔ਺Λϥοϓͯ͠gitignore import p "github.com/k0kubun/pp" func pp(a ...interface{}) { p.Println(a...) } • ʮ,*ʯΛgitignoreͯ͠ΔͳΒʮ,.goʯͱ͔ • ࢖ͬͯͳͯ͘΋importফ͞ͳͯ͘ࡁΉ ղܾํ๏ɿ

Slide 15

Slide 15 text

package “reflect” Standard library for reflection k0kubun/pp is powered by “reflect”

Slide 16

Slide 16 text

What’s the usage of reflect? • ஋ͷϝλ৘ใΛಡΉ • ppͩͱstructͷશfieldྻڍ • encoding/jsonͩͱstructͷfieldͷλά • ϝλϓϩάϥϛϯά

Slide 17

Slide 17 text

ϝλϓϩάϥϛϯάͷಛ௃ • εϚʔτͳॻ͖ํͰίʔυͷߦ਺ΛݮΒͤΔ • ॻָ͍͍ͯͯ͠ • ੩తղੳ͕೉͘͠ɺಡΈʹ͘͘ͳΔ • झຯҎ֎Ͱ࢖Θͳ͍ͷ͕ແ೉

Slide 18

Slide 18 text

reflectͰͰ͖Δͷ͸࣍ͷ͏ͪͲΕʁ Go ϝλϓϩάϥϛϯάΫΠζ

Slide 19

Slide 19 text

reflectͰͰ͖Δͷ͸࣍ͷ͏ͪͲΕʁ ૢ࡞ ճ౴ ؔ਺ఆٛ ؔ਺ݺͼग़͠ ϝιουఆٛ ϝιουݺͼग़͠ ೚ҙͷܕͷOFX ˕ɿstringͰ໊લΛࢦఆՄɹ˓ɿreflect.Value͔ΒՄೳɹ×ɿແཧ ˕ɺ˓ɺ× ώϯτ: Ruby͸શ෦˕

Slide 20

Slide 20 text

reflectͰͰ͖Δͷ͸࣍ͷ͏ͪͲΕʁ ૢ࡞ ճ౴ ؔ਺ఆٛ ˓ ؔ਺ݺͼग़͠ ˓ ϝιουఆٛ º ϝιουݺͼग़͠ ˕ ೚ҙͷܕͷOFX ˓ ˕ɿstringͰ໊લΛࢦఆՄɹ˓ɿreflect.Value͔ΒՄೳɹ×ɿແཧ ϝλϓϩՄ

Slide 21

Slide 21 text

reflectʹΑΔؔ਺ఆٛ • ೚ҙͷγάωνϟͷؔ਺Λ࡞ΕΔ var f func(int, int) int v := reflect.MakeFunc( reflect.TypeOf(f), func(in []reflect.Value) []reflect.Value { return []reflect.Value{in[0]} }, ) reflect.ValueOf(&f).Elem().Set(v)

Slide 22

Slide 22 text

reflectʹΑΔؔ਺ݺͼग़͠ • ೚ҙͷγάωνϟͷؔ਺Λݺͼग़ͤΔ f := func(a int, b int) int { return a + b } v := reflect.ValueOf(f) in := []reflect.Value{} for i := 0; i < v.Type().NumIn(); i++ { in = append(in, reflect.ValueOf(1)) } v.Call(in)

Slide 23

Slide 23 text

reflectʹΑΔϝιουఆٛ • ී௨ʹແཧ

Slide 24

Slide 24 text

reflectʹΑΔϝιουݺͼग़͠ • stringͰ໊લΛࢦఆͯ͠ϝιουΛݺͼग़ͤΔ type Hoge struct{} func (h Hoge) Foo() { print("foo") } func (h Hoge) Bar() { print("bar") } h := new(Hoge) for _, name := range []string{"Foo", "Bar"} { v := reflect.ValueOf(h) v.MethodByName(name).Call([]reflect.Value{}) }

Slide 25

Slide 25 text

reflectʹΑΔnew • ೚ҙͷܕͷ஋ΛॳظԽͨ͠΋ͷΛ࡞ΕΔ t := reflect.TypeOf(a) reflect.New(t)

Slide 26

Slide 26 text

·ͱΊ • k0kubun/pp࢖ͬͯԼ͍͞ • pp.Println() Λϥοϓͯ͠gitignore͓ͯ͘͠ • reflect࢖͏ͱϝλϓϩͰ͖Δ • stringͰࢦఆͰ͖Δͷ͸ϝιουݺͼग़͠ͷΈ