Slide 1

Slide 1 text

ࢲୡ͸ modernize package ʹ ເΛݟΔ͔ feat. go/analysis, go/ast Go Conference 2025 (2025/09/28) Kaoru Muta / mentos

Slide 2

Slide 2 text

ࣗݾ঺հ 2 Kaoru Muta ໂా ܆ (ϝϯτε) ੜ·ΕҭͪେࡕͰࠓ΋େࡕʹ͍·͢ 🐯 גࣜձࣾBuySell Technologies ͰόοΫΤϯυ୲౰ ϒϩϯζεϙϯαʔͱͯ͠ڠࢍͯ͠ΔΑʂ ങऔɾࠪఆ ങऔछผʹԠͨ͡࠷దͳγεςϜߏங Visit -๚໰ങऔ- Store -ళฮങऔ- ങऔ ϦϢʔεϓϥοτϑΥʔϜCosmos ࣗࣾ։ൃͷϦϢʔεಛԽۀ຿جװγεςϜͰ͋ΓαʔϏε܈ͷू߹ମ @m_t_tion1

Slide 3

Slide 3 text

͏Θͬɾɾɾࢲୡͷ Go version ݹ͗͢ɾɾɾʁ 3 ͱࢥͬͨܦݧ͸͋Γ·͔͢ʁ ձ৔ͷօ༷ͥͻڍखͰ✋

Slide 4

Slide 4 text

ͥͻ version Λ͋͛·͠ΐ͏ 4 Go ͸جຊతʹޙํޓ׵ੑ͕ όʔδϣϯؒͰ୲อ͞Ε͍ͯΔ

Slide 5

Slide 5 text

͏Θͬɾɾɾࢲୡͷ Go ͷه๏ ݹ͗͢ɾɾɾʁ 5 ͱࢥͬͨܦݧ͸͋Γ·͔͢ʁ ձ৔ͷօ༷ͥͻڍखͰ✋

Slide 6

Slide 6 text

࠷৽ͷه๏Λਵ࣌औΓೖΕΔͱ ॻ͖ํ͕ࢄΒ͹ͬͯ͘Δͷ͕ एׯؾʹͳΔ (࢓ํͳ͍) 6 γϡοͱ౷ҰͰ͖Ε͹ͱաڈʹເݟͨΓ (ࠔͬͯ͸ͳ͍ΜͰ͚͢ͲͶ)

Slide 7

Slide 7 text

ͦΜͳ࣌ʹ modernize package Λ࢖͑͹ ເΛݟΕΔ͔΋͠Εͳ͍ 7 ҆શʹ͔ͭத਎Λཧղ͠ͳ͕Β ࢖͓͏ʂͱ͍͏ൃදͰ͢

Slide 8

Slide 8 text

modernize package ͱ͸ ● gopls ʹೖ͍ͬͯΔ (2025/9 ࣌఺Ͱ͸ v0.2.0) ● go run ίϚϯυͰ࣮ߦͰ͖Δ ○ -fix Ͱɺ࠷৽ͷ Go ͰऔΓೖΕΒΕͨه๏Λద༻ͯ͘͠ΕΔ 8

Slide 9

Slide 9 text

modernize package ͱ͸ 9 forvar (Go 1.22 ~) waitgroup (Go 1.25 ~) ଞʹ΋ɺefaceany (interface{} → any) ͳͲɺෳ਺ͷέʔεʹରԠ

Slide 10

Slide 10 text

†ࠇຐज़†Ͱ͸ɾɾɾʁ 10

Slide 11

Slide 11 text

಺෦࣮૷ݟΔͧʂ 11 ࠓճ͸ forvar ͷ࣮૷Λ Έ͍͖ͯ·͢

Slide 12

Slide 12 text

લఏ஌ࣝ - go/ast 12 Go ιʔείʔυͷந৅ߏจ໦ (AST) Λදݱ͢ΔͨΊͷύοέʔδ #1. Node AST ͷ֤ཁૉ (ex. จɾࣜɾม਺) จͷ AST Node Λ Stmt interface Ͱѻ͏ #2. Token ࣈ۟ͷ࠷খཁૉ (ex. ԋࢉࢠɾϦςϥϧ)

Slide 13

Slide 13 text

લఏ஌ࣝ - go/analysis 13 Go Ͱ੩తղੳΛ࣮૷͢ΔͨΊͷϑϨʔϜϫʔΫ #1. Analyzer ίʔυͷղੳΛߦ͏ղੳثͷ࣮ମ #2. Pass ύοέʔδͷղੳ৘ใΛ٧Ίͨ΋ͷ

Slide 14

Slide 14 text

લఏ஌ࣝ - go/analysis 14 Go Ͱ੩తղੳΛ࣮૷͢ΔͨΊͷϑϨʔϜϫʔΫ #3. Diagnostic Analyzer ͕ग़ྗ͢Δࢦఠࣄ߲ #4. SuggestedFix Diagnostic ʹରͯ͠ͷमਖ਼Ҋ (CLI Ͱ -fix option Ͱमਖ਼Λద༻Ͱ͖Δ)

Slide 15

Slide 15 text

forvar - Analyzer ͷఆٛ 15

Slide 16

Slide 16 text

forvar - Analyzer ͷఆٛ 16 ղੳ͢Δ্Ͱ࣮ߦ͕ඞཁͳ લॲཧͷAnalyzerͷఆٛ

Slide 17

Slide 17 text

forvar - Analyzer ͷఆٛ 17 ࣮ࡍͷղੳॲཧΛهड़

Slide 18

Slide 18 text

18 ΍͍ͬͯΔ͜ͱ #1. Go version ͷ࠷খཁ݅Λ֬ೝ #2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ #3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑

Slide 19

Slide 19 text

19 ΍͍ͬͯΔ͜ͱ #1. Go version ͷ࠷খཁ݅Λ֬ೝ #2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ #3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑

Slide 20

Slide 20 text

#1. Go version ͷ࠷খཁ݅Λ֬ೝ 20

Slide 21

Slide 21 text

#1. Go version ͷ࠷খཁ݅Λ֬ೝ 21 ࣗಈੜ੒ϑΝΠϧ͔Ͳ͏͔Λݕग़ ΋ͦ͠͏ͩͬͨ৔߹ແࢹ͢Δ

Slide 22

Slide 22 text

#1. Go version ͷ࠷খཁ݅Λ֬ೝ 22 લॲཧͰ࣮ߦͨ͠inspect.Analyzer ͷ ղੳ݁ՌΛड͚औΔ

Slide 23

Slide 23 text

#1. Go version ͷ࠷খཁ݅Λ֬ೝ 23 ࠷খཁ͕݅ Go 1.22 ͷϑΝΠϧΛ Ұͭͣͭ૸͍ࠪͯ͘͠

Slide 24

Slide 24 text

#1. Go version ͷ࠷খཁ݅Λ֬ೝ 24 ର৅ͷϑΝΠϧ಺ʹଘࡏ͢Δ for range จ ͷ stmt ΛҰͭͣͭ૸ࠪ

Slide 25

Slide 25 text

25 ΍͍ͬͯΔ͜ͱ #1. Go version ͷ࠷খཁ݅Λ֬ೝ #2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ #3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑

Slide 26

Slide 26 text

#2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ 26

Slide 27

Slide 27 text

ϊʔυ Λ for range จͱͯ͠ղऍ ϧʔϓม਺Λએݴ͍ͯ͠Δ΋ͷ͕ ର৅ (ex. `for k, v := range m`) #2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ 27

Slide 28

Slide 28 text

#2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ 28 ϧʔϓͷதͰɺม਺Λಉ໊Ͱ ࠶એݴ͍ͯ͠Δ͔ͷ൑ఆΛߦ͏ؔ਺ (ex. k := k)

Slide 29

Slide 29 text

#2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ 29 ● ࠨ߲ͱӈ߲͕౳͍͠ ● ϧʔϓม਺ͱࠨ߲͕౳͍͠ ৔߹Ҏ֎͸আ֎

Slide 30

Slide 30 text

30 ΍͍ͬͯΔ͜ͱ #1. Go version ͷ࠷খཁ݅Λ֬ೝ #2. for range Λ࢖͍ͬͯΔՕॴͷݕग़ #3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑

Slide 31

Slide 31 text

#3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑ 31

Slide 32

Slide 32 text

#3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑ 32 for range ϧʔϓΛ1ߦͣͭ૸ࠪ ͦͷ͏ͪɺ৚݅ʹҰகͨ͠΋ͷΛ ॻ͖׵͑Δ

Slide 33

Slide 33 text

#3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑ 33 ● ࣜϊʔυʹม׵ ● ԋࢉࢠ͕ʮ:=ʯ ● ࠨ߲ͱӈ߲͕౳͍͠ ● ϧʔϓม਺Λ࠶એݴ͍ͯ͠Δ

Slide 34

Slide 34 text

#3. ৚݅ʹҰகͨ͠ՕॴΛॻ͖׵͑ 34 ● Diagnostic ʹղੳ݁ՌΛηοτ ● SuggestedFix ʹ͸ɺ for range Ͱม਺࠶એ ݴͷՕॴΛ࡟আ͢Δमਖ਼ҊΛηοτ

Slide 35

Slide 35 text

࢖͏ʹ͋ͨͬͯͷݸਓͷҙݟ & ཹҙ͢΂͖఺ ● modernize ͸Թ౓ײߴ͘ɺ࠷৽ͷมߋʹ௥ैͯ͘͠Ε͍ͯΔ༷ࢠ ○ waitgroup.Go ͕ Go 1.25 ʹ approve ͞Εͨ͜ͱΛड͚ͯ ଈ࠲ʹରԠ͍ͯ͠Δ: https://github.com/golang/go/issues/73059 ● ੜ੒AIʹίʔυΛॻ͔ͤΔ؍఺ ○ ੲͷόʔδϣϯͰॻ͍ͯ͘Δ৔߹ʹରԠ͕ඞཁ͔΋ ○ CI Ͱ modernize -test Λ࣮ߦͯ͠ɺࣦഊΛݩʹमਖ਼ͤ͞Δɾɾʁ ● େલఏɺ͋͘·Ͱ beta Ͱ͋Γɺissue ΋͕͍͋ͬͯΔ ○ https://github.com/golang/go/issues/75358 : ࣮ߦ࣌ʹ panic 35

Slide 36

Slide 36 text

ເʹ͏ͭͭΛൈ͔͞ͳ͍ ఔ౓ʹ࢖ͬͯΈΔͷ͕Αͦ͞͏ 36 ਖ਼͍͠มߋ͔͸֤ʑ͕ ݟۃΊ·͠ΐ͏

Slide 37

Slide 37 text

ࢀߟจݙ ● https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/ modernize ● https://pkg.go.dev/golang.org/x/tools/go/analysis ● https://pkg.go.dev/golang.org/x/tools/go/ast/inspector ● https://zenn.dev/hsaki/books/golang-static-analysis ● https://zenn.dev/urakawa_jinsei/articles/3efa94ac6d16e7 37

Slide 38

Slide 38 text

Thank You! 38