Share
Embed
詳解 "Fixing For Loops in Go 1.22" 自作linterをgolangci-lintへコントリビュートした話 @ GoConference2024
Go Conference2024の登壇資料です。
- https://karamaru-alpha.com/posts/gocon2024
- https://gocon.jp/2024/sessions/14
- https://github.com/karamaru-alpha/copyloopvar
karamaru
June 08, 2024
Transcript
88 slides
-
ΞδΣϯμجຊใඈ͠·͢ʂ😇 ϧʔϓมϝϞϦڞ༗ͷ͓͞Β͍ TLJQ 'JYJOH'PS-PPQTJO(PzʹࢸΔ·ͰͷٞʙϓϩϙʔβϧΛಡΉ TLJQ MPPQWBSύοέʔδͷ෦࣮ΛಡΉ N
Τεέʔϓղੳͱϧʔϓͷؔ࿈ੑΛಥ͖ࢭΊΔ N पลπʔϧͱLBSBNBSVBMQIBDPQZMPPQWBSͷհ T ˏLBSBNBSV@BMQIBʹ4QFBLFS%FDL͋Γ·͢ʂ -
EJTVDVTTJPOTຊจ ҙ༁ ΠςϨʔγϣϯຖʹมΛ҉తʹ࠶ఆٛ͢ΔηϚϯςΟΫεมߋʹ͍ͭͯҙݟΛืΓ͍ͨ ɾ-FUT&ODSZQUͰͷόάΛؚΊͯɺݱࡏͷϧʔϓଟ͘ͷଛΛ༩͑ΔηϚϯςΟΫεͰ͋Δ ޙํޓੑΛେʹ͖͕ͯͨ͠ຊ݅ྫ֎ʹ͢Δ ɾ֤ύοέʔδͷHPNPEͷHPόʔδϣϯʹج͍ͮͯηϚϯςΟΫεΛมߋ͢Δ͜ͱͰޓੑΛ୲อ༧ఆ ɾ$GPSFBDIͰಉ༷ͷΞοϓσʔτ͕͕͋ͬͨͦͷഎܠΛΓ͍ͨ ϓϩϙʔβϧΛ͏ ΠϝʔδҎԼ CFGPSF
GPSWSBOHF\ GNU1SJOUMO W ^ BGUFS GPSWSBOHF\ @WW GNU1SJOUMO @W ^ IUUQTHJUIVCDPNHPMBOHHPEJTDVTTJPOT -
EJTVDVTTJPOTରҙݟɾݒ೦ͱͦΕʹର͢Δճ ҙ༁ ɾಉ͡ίʔυย͕ҟͳΔڍಈΛ͢ΔͷࠞཚΛট͘ͷͰͳ͍͔ʁ HPNPEͰཧ͞ΕΔଟ͘ͷ߹όάΛमਖ਼͢Δํʹ͔͠࡞༻͠ͳ͍ͨΊͳ͍ ɾ੩తղੳͰݕग़͢Ε͍͍ͷͰʁ શͯͷέʔεΛաෆͳ͘ݕग़͢ΔͷෆՄೳʹ͍ۙͷͰ٫Լ ɾϧʔϓมͷΫϩʔδϟΩϟϓνϟΛίϯύΠϧΤϥʔʹ͢ΔͷͲ͏͔ʁ શͯͷϧʔϓมͷΩϟϓνϟ͕όάΛੜΈग़͢Θ͚Ͱͳ͍ޙํޓੑ͕େ͖͘յΕΔͷͰ٫Լ ϓϩϙʔβϧΛ͏ IUUQTHJUIVCDPNHPMBOHHPEJTDVTTJPOTEJTDVTTJPODPNNFOU
IUUQTHJUIVCDPNHPMBOHHPEJTDVTTJPOTEJTDVTTJPODPNNFOU -
$ʹ͓͚ΔGPSFBDIͷΞοϓσʔτʹ͍ͭͯ ҙ༁ $νʔϜͷײ ɾ$ͰɺGPSFBDIͰϧʔϓม͕ΠςϨʔγϣϯຖʹ࡞͞ΕΔΑ͏ʹΞοϓσʔτ͞Εͨ ɾ৽͍͠ϢʔβʔʹτϦοΩʔͳڍಈΛઆ໌Λ͢ΔΑΓɺӨڹΛड͚ΔগͷطଘϢʔβʔͷཧղΛಘΔํ͕ͣͬͱ؆୯ͩͱஅͨ͠ ɾΒٞ͘͞Ε͔ͯΒͷηϚϯςΟΫεมߋ͕ͩͬͨɺ݁Ռഥࢠൈ͚͢Δ΄Ͳ্ख͘ߦͬͨ GPSจ͕ͦͷ··ͳͷͳͥʁ ɾͪͳΈʹɺGPSจ$$ ͱͷฒΈΛଗ͑ΔͨΊʹΞοϓσʔτ͠ͳ͔ͬͨ ɾࠓ͜ͷΛٞ͢Δͱͨ͠ΒGPSFBDIGPSͷ྆ํΛߋ৽͢Δئ͕ڧ͘ͳ͍͔ͬͯͨͶ
WFSTJPOཧʹ͍ͭͯ ɾ࣌-BOH7FSTJPO͕ଘࡏ͠ͳ͔ͬͨӨڹͰηϚϯςΟΫεมߋʹ৻ॏͩͬͨ HPNPEHP۟ʹ૬ɻηϚϯςΟΫεΛϚοϐϯά ϓϩϙʔβϧΛ͏ IUUQTHJUIVCDPNHPMBOHHPEJTDVTTJPOTEJTDVTTJPODPNNFOU -
l'JYJOH'PS-PPQTJO(PzʹࢸΔ·ͰͷٞʙϓϩϙʔβϧΛಡΉɹཁ ϓϩϙʔβϧΛ͏ ɾ(P͔ΒϧʔϓมΠςϨʔγϣϯຖʹΠϯελϯε͕࡞͞ΕΔΑ͏ʹ ɾSTDࢯ͕ىථͨ͠EJTTDVTTJPOT͕ൃͷٞ ɹɾϧʔϓมʹରͯ͠҉తͳ࠶ఆٛΛߦ͏͜ͱʹ͍ͭͯͷҙݟऩू ɹɾଟ͘ߠఆత ɹɾ$ʹ͓͚ΔGPSFBDIͷηϚϯςΟΫεมߋޭྫՃຯͯ͠Ξοϓσʔτʹ౿Έͬͨ ۩ମతʹͲͷஈ֊Ͱϧʔϓมͷ҉తͳ࠶એݴ͕ߦΘΕ͍ͯΔͷ͔Γ͍ͨ ίϯύΠϥͷதΛݟͯΈΑ͏ষଓ͘ʜ l҉తͳ࠶ఆٛzͷΠϝʔδ
CFGPSF GPSWSBOHF\ GNU1SJOUMO W ^ BGUFS GPSWSBOHF\ @WW GNU1SJOUMO @W ^ -
$PNQJMFSͷ͓ࣄͬ͘͟Γ MPPQWBSύοέʔδͷ෦࣮ΛಡΉ TSDDNEDPNQJMF3&"%.&NE ɾTSDDNEDPNQJMFJOUFSOBMTZOUBY ɾTSDDNEDPNQJMFJOUFSOBMUZQFT ɾTSDDNEDPNQJMFJOUFSOBMJS ɾTSDDNEDPNQJMFJOUFSOBMEFBEDPEF ɾTSDDNEDPNQJMFJOUFSOBMJOMJOF ɾTSDDNEDPNQJMFJOUFSOBMEFWJSUVBMJ[F ɾTSDDNEDPNQJMFJOUFSOBMFTDBQF
ɾTSDDNEDPNQJMFJOUFSOBMTTB ɾTSDDNEDPNQJMFJOUFSOBMTTBHFO ɾTSDDNEJOUFSOBMPCK தؒදݱ *3 ࡞ ɾߏจղੳ ɾܕνΣοΫ ɾதؒදݱ *3 ม ϛουΤϯυ࠷దԽ ɾσουίʔυআ ɾΠϯϥΠϯԽ ɾԾԽղআ ɾΤεέʔϓղੳ 44"ܗࣜม ɾ੩త୯Ұೖܗࣜʹม ػցޠม ɾ֤ڥͷϚγϯޠʹม ຊXBMLͳͲଞ৭ʑͬͯΔ͚Ͳলུ -
$PNQJMFSͷ͓ࣄ(PͰ͜͜ʹΞοϓσʔτ͕ೖͬͨ🙆 TSDDNEDPNQJMFJOUFSOBMHDNBJOHP MPPQWBS'PS$BQUVSF͕*3ϊʔυΛॻ͖͍͑ͯͦ͏ʂ ͜͜ΛಡΊউͪʂ ϑϥά MPPQWBSύοέʔδͷ෦࣮ΛಡΉ தؒදݱ *3 ࡞ ɾࣈ۟ղੳ
ɾܕνΣοΫ ɾ*3 தؒදݱ ม ϛουΤϯυ࠷దԽ ɾσουίʔυআ ɾΠϯϥΠϯԽ ɾԾԽղআ ɾϧʔϓมͷ҉తͳ࠶ఆٛ ɾΤεέʔϓղੳ 44"ม ɾ੩త୯Ұೖܗࣜʹม ػցޠม ɾ֤ڥͷϚγϯޠʹม -
MPPQWBSύοέʔδͷ෦࣮ΛಡΉ·ͱΊ MPPQWBSύοέʔδͷ෦࣮ΛಡΉ MPPQWBSύοέʔδʹ͍ͭͯ ɾ(P͔Βϧʔϓมͷ҉తͳ࠶એݴ͕ߦΘΕΔΑ͏ʹͳͬͨ ɾϧʔϓม҉తͳ࠶એݴͷ݅ΞυϨεऔಘPSΫϩʔδϟΩϟϓνϟ͞Εͨ࣌Ͱ͋Δ ɾϛουΤϯυ࠷దԽͷMPPQWBSύοέʔδ͕ɺதؒදݱ *3 ϊʔυΛॻ͖͑Δ͜ͱͰͦΕΛ࣮ݱ͍ͯ͠Δ ࣍ճ༧ࠂ ɾ҉తͳϧʔϓมͷ࠶એݴ͕ߦΘΕ͍ͯΔʹ͔͔ΘΒͣ
ɹ֤ΠςϨʔγϣϯʹ͓͚ΔϧʔϓมͷΞυϨε͕ಉ͜͡ͱ͋ΕҟͳΔ͜ͱ͋Δ QSJOUMOGNU1SJOUMO ɾϧʔϓͷڍಈͷҧ͍Τεέʔϓղੳʹݤ͕͋Γͦ͏ l҉తͳ࠶ఆٛzͷΠϝʔδ CFGPSF GPSWSBOHF\ GNU1SJOUMO W ^ BGUFS GPSWSBOHF\ @WW GNU1SJOUMO @W ^ -
ώʔϓͱελοΫͱ ώʔϓͱελοΫɺΤεέʔϓղੳ IUUQTTQFBLFSEFDLDPNZNPUPOHQPPNFNPSZNBOBHFNFOUJOHP ελοΫ ɾ֤HPSPVUJOF͕ཧ͢ΔϝϞϦྖҬ αΠζ͕ಈతʹ৳ॖ ɾϨΩγΧϧείʔϓͷ ϥΠϑαΠΫϧΛ੩తʹ༧ଌͰ͖Δ σʔλΛѻ͏
ϩʔΧϧมͳͲ ɾ-*'0ͰׂΓͯͱղ์͕ߴ ώʔϓ ɾओʹϨΩγΧϧείʔϓ֎ͷ ϥΠϑαΠΫϧΛ༧ଌͰ͖ͳ͍ σʔλΛѻ͏ άϩʔόϧมͳͲ ɾׂΓͯͱղ์͕͍ɻ($ʹআΛͤΔඞཁ͕͋Δɻ ͳΔ͘ελοΫΛ༻͢Δ ώʔϓʹୀආ͞Εͳ͍ Α͏ʹ͍ͨ͠ -
ΞηϯϒϦΛݟͯΈΔɹTUFQελοΫϙΠϯλ 41 ΛόΠτݮΒ͢ ελοΫϙΠϯλ 41 Εͨ͢͡ ͨͬ͘͢ ॳظελοΫϙΠϯλ 41
ελοΫϙΠϯλ 41 ͱ ɾલఏελοΫྖҬΞυϨεͷߴ͍Ґஔ͔Β༻͞ΕΔ ɾͲ͜ͷΞυϨε·ͰελοΫ͕٧·͍ͬͯΔ͔Λࣔ͢ τοϓΞυϨεϙΠϯλ ώʔϓͱελοΫɺΤεέʔϓղੳ -
ΞηϯϒϦΛݟͯΈΔɹTUFQελοΫߋ৽ ελοΫϙΠϯλ 41 Εͨ͢͡ ͨͬ͘͢ "9 ΠςϨʔλ ɾΠςϨʔλΛελοΫʹੵΉ ɾมΛελοΫʹੵΉ
ΠςϨʔλ มW ώʔϓͱελοΫɺΤεέʔϓղੳ -
ΞηϯϒϦΛݟͯΈΔɹTUFQมWͷϙΠϯλग़ྗ ελοΫϙΠϯλ 41 Εͨ͢͡ ͨͬ͘͢ "9มW ɾมYΛϩʔυ ɾͦͷΞυϨεΛग़ྗ
ΠςϨʔλ มW QSJOUQPJOUFS ώʔϓͱελοΫɺΤεέʔϓղੳ -
ΞηϯϒϦΛݟͯΈΔɹTUFQΠςϨʔλͷΠϯΫϦϝϯτ ελοΫϙΠϯλ 41 Εͨ͢͡ ͨͬ͘͢ "9ΠςϨʔλ ɾΠςϨʔλΛϩʔυ ɾΠςϨʔλΛΠϯΫϦϝϯτ
ΠςϨʔλ มY ώʔϓͱελοΫɺΤεέʔϓղੳ -
ΞηϯϒϦΛݟͯΈΔɹTUFQΠςϨʔγϣϯऴΘΓ ελοΫϙΠϯλ 41 Εͨ͢͡ ͨͬ͘͢ "9ΠςϨʔλ ΠςϨʔλ͕ະຬͳΒϧʔϓʹೖΓ͢
ΠςϨʔλ มY ώʔϓͱελοΫɺΤεέʔϓղੳ -
ΞηϯϒϦΛݟͯΈΔɹTUFQελοΫͷ্ॻ͖ ελοΫϙΠϯλ 41 Εͨ͢͡ ͨͬ͘͢ "9ΠςϨʔλ ɾελοΫʹ͋ΔΠςϨʔλͷΛ্ॻ͖ ɾελοΫʹ͋ΔมͷΛ্ॻ͖ ϧʔϓมͷΞυϨε͕
ΠςϨʔγϣϯຖʹมΘ͍ͬͯͳ͍͜ͱʹ ΠςϨʔλ มY ώʔϓͱελοΫɺΤεέʔϓղੳ -
ΞηϯϒϦΛݟͯΈΔɹTUFQ9ϧʔϓऴྃɻελοΫϦηοτ ελοΫϙΠϯλ 41 Εͨ͢͡ ͨͬ͘͢ "9ΠςϨʔλ̏ ΠςϨʔλ͕Ҏ্ͷ߹ ελοΫϙΠϯλ 41
Λॳظʹͯ͠ऴྃ ώʔϓͱελοΫɺΤεέʔϓղੳ -
GNU1SJOUܥͰΤεέʔϓͤ͞ͳ͍ͨΊͷऔΓΈ ݱঢ়ͷΤεέʔϓղੳث ҾͷΠϯλʔϑΣΠεϝιουΛݺͼಘΔؔ ҾΛແ݅ʹΤεέʔϓͤͯ͞͠·͏🥺 FHGNU1SJOUMO ໌Β͔ʹΤεέʔϓ͕ඞཁͳ͍έʔε·Ͱ Τεέʔϓ͞ΕΔ͜ͷ ͔Βݴٴ͞Ε͍ͯͨ ʙίϯύΠϧ࣌ʹࣗΛެ։͢ΔΑ͏ͳϝιουΛ
͍࣋ͬͯͳ͍͔νΣοΫ͢ΔํͰઈࢍվળઓதʂ🔥 JTTVFʙ JTTVFʙ ώʔϓͱελοΫɺΤεέʔϓղੳ -
·ͱΊ MPPQWBSύοέʔδʹ͍ͭͯ ɾ(P͔Βϧʔϓมͷ҉తͳ࠶એݴ *3ϊʔυվม ͕ߦΘΕΔΑ͏ʹͳͬͨ ɾ҉తͳ࠶એݴͷ݅ɺϧʔϓม͕ΞυϨεऔಘPSΫϩʔδϟΩϟϓνϟ͞Ε͍ͯΔ࣌ Τεέʔϓͱϧʔϓ ɾϧʔϓͰએݴ͞Εͨม͕ελοΫׂΓͯͷ߹ ɹ֤ΠςϨʔγϣϯͰಉ͡ΞυϨεΛ࣋ͪɺελοΫྖҬ͕࠶ར༻͞ΕΔ ɾϧʔϓͰએݴ͞Εͨม͕ώʔϓׂΓͯͷ߹
ɹ֤ΠςϨʔγϣϯͰҟͳΔΞυϨεΛ࣋ͪɺ($ʹΑΔղ์·ͰώʔϓྖҬΛ༗͢Δ ɾGNU1SJOUܥؔͷҾΤεέʔϓ͢ΔҰํɺϏϧτΠϯͷQSJOUܥؔΤεέʔϓ͠ͳ͍ ɹΑͬͯϧʔϓมͷΞυϨεग़ྗͷ݁Ռʹҧ͍͕ੜ͡Δ पลπʔϧʹ͍ͭͯ ɾηϚϯςΟΫεมߋʹରԠ͢ΔͨΊʹHDGMBHTCJTFDUͳͲଟ͘ͷपลπʔϧͷαϙʔτ͕͋Δ ɾLBSBNBSVBMQIBDPQZMPPQWBSͷΑ͏ʹ ɹݴޠͷΞοϓσʔτۦಈͰMJOUFSΛ࡞͢Δͷ044ॳ৺ऀʹνϟϯε͕໌֬Ͱ͓͢͢Ί