don't use reflect - go 1.7 release party 2016

45
Don’t Use reflect Go 1.7 Release Party Aug 8, 2016 Daisuke Maki @lestrrat

Upload: lestrrat

Post on 11-Jan-2017

1.343 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Don't Use Reflect - Go 1.7 release party 2016

Don’t Use reflect

Go 1.7 Release Party Aug 8, 2016

Daisuke Maki @lestrrat

Page 2: Don't Use Reflect - Go 1.7 release party 2016

Don’t Use reflect

Go 1.7 Release Party Aug 8, 2016

Daisuke Maki @lestrrat

Page 3: Don't Use Reflect - Go 1.7 release party 2016

Don’t Use reflect

Go 1.7 Release Party Aug 8, 2016

Daisuke Maki @lestrrat

Page 4: Don't Use Reflect - Go 1.7 release party 2016

New Go Book!

Page 5: Don't Use Reflect - Go 1.7 release party 2016
Page 6: Don't Use Reflect - Go 1.7 release party 2016

無念!

Page 7: Don't Use Reflect - Go 1.7 release party 2016

Reflect

Page 8: Don't Use Reflect - Go 1.7 release party 2016

Dynamically Change Behavior

Page 9: Don't Use Reflect - Go 1.7 release party 2016

All the cool kids are doing it

Page 10: Don't Use Reflect - Go 1.7 release party 2016

… in Go?

Page 11: Don't Use Reflect - Go 1.7 release party 2016

Performance

Page 12: Don't Use Reflect - Go 1.7 release party 2016

From The Book

Page 13: Don't Use Reflect - Go 1.7 release party 2016
Page 14: Don't Use Reflect - Go 1.7 release party 2016

Line Noise

Page 15: Don't Use Reflect - Go 1.7 release party 2016

@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{ @p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord ($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&& close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print

Page 16: Don't Use Reflect - Go 1.7 release party 2016
Page 17: Don't Use Reflect - Go 1.7 release party 2016

Line Noise

in Go?

Page 18: Don't Use Reflect - Go 1.7 release party 2016

reflect.TypeOf((*Maybe)(nil)).Elem()

Page 19: Don't Use Reflect - Go 1.7 release party 2016

reflect.TypeOf((*Maybe)(nil)).Elem()WTF

Page 20: Don't Use Reflect - Go 1.7 release party 2016

reflect.TypeOf((*Maybe)(nil)).Elem()

Page 21: Don't Use Reflect - Go 1.7 release party 2016

reflect.TypeOf((*Maybe)(nil)).Elem()

pointer to nil “Maybe”

Page 22: Don't Use Reflect - Go 1.7 release party 2016

reflect.TypeOf((*Maybe)(nil)).Elem()

Page 23: Don't Use Reflect - Go 1.7 release party 2016

reflect.TypeOf((*Maybe)(nil)).Elem()

Dereference the pointer reflect.Type

Page 24: Don't Use Reflect - Go 1.7 release party 2016

It’s an Interface Type!

Page 25: Don't Use Reflect - Go 1.7 release party 2016

stringer = reflect. TypeOf((*Stringer)(nil)).Elem() if rv.Implements(stringer) { …}

Check If A Value Implements An Interface

Page 26: Don't Use Reflect - Go 1.7 release party 2016

• reflect.Type/Value usually requires a value to create

• But if you don’t want to create a variable just to create an interface reflect.Type…

• Create a nil pointer, then dereference it!

reflect.TypeOf((*Maybe)(nil)).Elem()

Page 27: Don't Use Reflect - Go 1.7 release party 2016

Why Use reflect?

Page 28: Don't Use Reflect - Go 1.7 release party 2016

意訳「そこにreflectがあるから」

Page 29: Don't Use Reflect - Go 1.7 release party 2016

Sometimes, you just have to

Page 30: Don't Use Reflect - Go 1.7 release party 2016

Otherwise, DON’T

Page 31: Don't Use Reflect - Go 1.7 release party 2016

New in Go1.7

Page 32: Don't Use Reflect - Go 1.7 release party 2016

禁句

Page 33: Don't Use Reflect - Go 1.7 release party 2016

「この機能、誰が嬉しいんだ?」

Page 34: Don't Use Reflect - Go 1.7 release party 2016

rv := reflect.ValueOf(…) fv := rv.Field(1<<63-1) // 1.7 PANICs if fv == reflect.Value{} { // <1.6 silently returns zero value }

Bug Fix

Page 35: Don't Use Reflect - Go 1.7 release party 2016

rv := reflect.ValueOf(…) fv := rv.Field(1<<63-1) // 1.7 PANICs if fv == reflect.Value{} { // <1.6 silently returns zero value }

Bug Fix

Page 36: Don't Use Reflect - Go 1.7 release party 2016

rv := reflect.ValueOf(…) fv := rv.Field(1<<63-1) // 1.7 PANICs if fv == reflect.Value{} { // <1.6 silently returns zero value }

Bug Fix

Page 37: Don't Use Reflect - Go 1.7 release party 2016

type Foo struct { foo int // not exported }

Bug? Fix

Page 38: Don't Use Reflect - Go 1.7 release party 2016

_, ok := reflect. TypeOf(Foo{}). MethodByName(“foo”)

fmt.Printf(“ok = %t\n”)

Bug? Fix

Page 39: Don't Use Reflect - Go 1.7 release party 2016

_, ok := reflect. TypeOf(Foo{}). MethodByName(“foo”)

fmt.Printf(“ok = %t\n”)

Bug? Fix

// go1.6 -> true

Page 40: Don't Use Reflect - Go 1.7 release party 2016

_, ok := reflect. TypeOf(Foo{}). MethodByName(“foo”)

fmt.Printf(“ok = %t\n”)

Bug? Fix

// go1.7 -> false

Page 41: Don't Use Reflect - Go 1.7 release party 2016

// struct { Foo int; Bar string } typ := reflect.StructOf([]reflect.StructField{ reflect.StructField{ Name: “Foo”, Type: reflect.Int}, reflect.StructField{ Name: “Bar”, Type: reflect.String}, })

Dynamically Declare Anonymous Structs

Page 42: Don't Use Reflect - Go 1.7 release party 2016

rv := reflect.New(typ) // v.Foo = 100 fv := rv.Elem(). FieldByName(“Foo”). Set(reflect.ValueOf(100)) // &struct { Foo int; Bar string }{Foo:100, Bar:""} fmt.Printf(“%#v\n”, rv.Interface())

Dynamically Declare Anonymous Structs

Page 43: Don't Use Reflect - Go 1.7 release party 2016

field := fv.FieldByName(“Foo”) field.Tag.Get(“json”) // string field.Tag.Lookup(“json”) // string, bool

Can Tell Difference Between empty tag and non-existing tag

Page 44: Don't Use Reflect - Go 1.7 release party 2016

Happy hacking with Go1.7

Page 45: Don't Use Reflect - Go 1.7 release party 2016

…and Don’t Use reflect! :D