Slide 1

Slide 1 text

ੲͷGo, ࠓͷGo ~ ൺֱ, ιʔτฤ ~ Shoichi Kaji

Slide 2

Slide 2 text

ൺֱ, ιʔτؔ࿈ͷมߋ • go1.18 generics • go1.20 time.Compare • go1.21 slices package, cmp package • go1.22 cmp.Or

Slide 3

Slide 3 text

time.Compare • time.Timeʹ͸࣌ࠁ͕"લ"͔൱͔Λฦ͢Beforeϝιου͕͋Δ: func (t Time) Before(t2 Time) bool • go1.20ͰCompareϝιου͕௥Ճ͞Εͨ: func (t Time) Compare(t2 Time) int • t͕t2ΑΓ"લ"ͳΒ: -1 t͕t2ͱ"౳͍͠"ͳΒ: 0 t͕t2ΑΓ"ޙΖ"ͳΒ: +1

Slide 4

Slide 4 text

time.Compare • ࠓ·Ͱt͕t2 "Ҏલ"Λ͍ࣔͨ͠ͱ͖ t.Before(t2) || t.Equal(t2) ͋ ͱॻ͔ͳ͚Ε͹͍͚ͳ͔ͬͨͱ͜Ζ t.Compare(t2) <= 0 ͋ ͱॻ͚ΔΑ͏ʹͳͬͨ 👍

Slide 5

Slide 5 text

slices.Sort/SortFunc • sort packageʹSlice,Sortؔ਺͕ఆٛ͞Ε͍ͯΔ: func Slice(x any, less func(i, j int) bool) func Sort(x Interface) • εϥΠεͷιʔτ͸্هͷͲͪΒ͔Λ࢖͏ͷ͕Ұൠతͩͬͨ • Slice: εϥΠεΛanyͰड͚औ͍ͬͯΔ 🥲 • Sort: sort.InterfaceΛຬͨ͢ɺLen, Less, Swapϝιου Λ࣮૷ͨ͠ܕΛΘ͟Θ͟࡞Βͳ͍ͱ͍͚ͳ͍ 🥲

Slide 6

Slide 6 text

slices.Sort/SortFunc • go1.21Ͱೖͬͨslices packageʹgenericsΛ࢖ͬͨε ϥΠεͷιʔτؔ਺͕ఆٛ͞Ε͍ͯΔ func Sort[S ~[]E, E cmp.Ordered](x S) func SortFunc[S ~[]E, E any](x S, compare func(a, b E) int) • ܕ͕͍ͭͨঢ়ଶͰεϥΠεΛड͚औΔ 😊 • ιʔτ৚݅Λࣔ͢Ҿ਺ͷؔ਺͕ɺless͔ΒcompareʹมΘ͍ͬͯΔ ͜ͱʹ΋஫໨͍ͨ͠ • ࠓޙ͸sort.Sort/SliceͰ͸ͳͪ͘͜ΒΛ࢖͏ͱΑͦ͞͏

Slide 7

Slide 7 text

ෳ਺ͷιʔτ৚݅ • ෳ਺ͷιʔτ৚݅compare1,2,3Λ૊Έ߹Θͤෳࡶ ͳιʔτ৚݅Λॻ͘͜ͱ͕͋Δ: • compare := func(e1, e2 E) int { if c := compare1(e1, e2); c != 0 { return c } if c := compare2(e1, e2); c != 0 { return c } return compare3(e1, e2) }

Slide 8

Slide 8 text

ෳ਺ͷιʔτ৚݅ • go1.21Ͱcmp.Or͕ಋೖ͞Εͨɻ͜Ε͸ෳ਺ͷҾ਺Λड͚औΓɺड͚औͬͨҾ਺ ͷதͰ࠷ॳʹzeroͰͳ͔ͬͨҾ਺Λฦؔ͢਺Ͱ͋Δɻ • ͜ΕΛ࢖͏ͱઌ΄Ͳͷcompare͸؆ܿʹॻ͚Δ 👍 • ͨͩ͠cmp.Or͸΋ͪΖΜ୹བྷతͰ͸ͳ͍ɻ ͕ͦ͜ॏཁͳͱ͖͸Ҏલͷॻ͖ํΛ͢΂͖ɻ compare := func(e1, e2 E) int { return cmp.Or( compare1(e1, e2), compare2(e1, e2), compare3(e1, e2), ) }

Slide 9

Slide 9 text

·ͱΊ • time.Compare͕ಋೖ͞ΕͨΓɺslices.SortFunc͕CompareΛ ཁٻ͍ͯ͠Δ͜ͱΛݟΔʹɺ "ൺֱ"ϝιου/ؔ਺͸Compare͕ελϯμʔυʹͳ͍͖ͬͯͦ ͏ɻࣗ෼Ͱ࡞ͬͨܕʹൺֱϝιουΛੜ΍͍ͨ͠ͱ͖΋ɺ Compare(e2 E) intΛ༻ҙ͢ΔͱΑͦ͞͏ɻ • sort.Sort/SlicesͰ͸ͳ͘ɺslices.Sort/SortFuncΛ࢖͏ͱΑ͍ɻ • ෳ਺ͷιʔτ৚݅͸cmp.OrΛ࢖ͬͯ؆ܿʹॻ͚ΔΑ͏ʹͳͬ ͨɻ