ăăŽč¨äşă§ăŻăGoăłăźăăä˝ćăăăăăŽăăšăăăŠăŻăăŁăšăŤçŚçšăĺ˝ăŚăŚăăžăă ăăŹăźăłăăźăˇă§ăłăŽăšăżă¤ăŤă§ć§ćăăăŚăăžăăăé常ăŽăšăŠă¤ăăŻăăăžăăă ĺé
çŽăç°Ąć˝ăă¤ć確ăŤčŞŹćăăžăă
ćĺăŤăăăă°ăŠăăłă°č¨čŞăŽ
ăăšăăăŠăŻăăŁăšăŽćĺłăŤă¤ăăŚĺćăăĺż
čŚăăăăžăă ăăă§ăŻăGoăăŻăăŤăŤăăăźă¸ăŁăźăăŠăšăłăăŻăšăŽč¨čăćăĺşăăă¨ăă§ăăžăă
ćéăŽčŚĺ ăäťăŽăăă°ăŠăăźăčż˝ĺ ăăă¨ăă˝ăăăŚă§ă˘ă¨ăłă¸ăă˘ăŞăłă°ăăăă°ăŠăăłă°ăŤčľˇăăăžăă
ăăăăŁăŚăăŠăšăŻ
ăăă°ăŠăăłă°ăŽćŚĺżľă¨
ă˝ăăăŚă§ă˘ă¨ăłă¸ăă˘ăŞăłă°ăĺşĺĽăăžăă ĺč
ăŽĺ ´ĺăŻăăă°ăŠă ăčŞĺă§ä˝ćăăĺžč
ăŽĺ ´ĺăŻäťăŽăăă°ăŠăăźăćéăăăăŚä˝ćĽăă製ĺăä˝ćăăžăă ă¨ăłă¸ăă˘ăĺşĺ
Ľăăăžăă ăăźă ăŻćéˇăžăăŻç¸Žĺ°ăăžăă ć°ćŠč˝ăčż˝ĺ ăăăăă°ă俎ćŁăăăžăăă ăăăă˝ăăăŚă§ă˘éçşăŽć§čłŞă§ăă
ĺ
厚
1.ĺşćŹĺĺ
ç§ăŻăăŞăăŽä¸ă§GoăŽćĺăŽăŚăźăśăźăŽä¸äşşăăăăăžăăăăăăăŻç§ăŽĺäşşçăŞćčŚă§ăŻăăăžăăă ăăăăŽĺşćŹĺĺăŻăGočŞä˝ăŽć šĺşăŤăăăžăă
- ăˇăłăăŤă
- čŞăżăăă
- ççŁć§
ă注ć ăăăăŠăźăăłăšăăžăăŻăĺćĺŽčĄć§ăăŤă¤ăăŚăŻč¨ĺăăŚăăžăăă Goăăéăč¨čŞăăăăžăăăĺç´ăŤćŻčźăăăă¨ăŻă§ăăžăăă 丌ĺĺŚçăćĺŞĺ
ă¨ăăč¨čŞăăăăžăăăčŞăżăăăăăăă°ăŠăăłă°ăŽççŁć§ăŽčŚłçšăăćŻčźăăăă¨ăŻă§ăăžăăă
ăăăŠăźăăłăšă¨ĺćĺŽčĄć§ăŻéčŚăŞĺąć§ă§ăăăăˇăłăăŤăăčŞăżăăăăççŁć§ăťăŠéčŚă§ăŻăăăžăăăăˇăłăăŤă
ăăˇăłăăŤăăŻäżĄé źć§ăŽĺććĄäťśă§ăă -Edsger Dijkstra
ăˇăłăăŤăăčż˝ćąăăççą Goăăă°ăŠă ăăˇăłăăŤă§ăăăă¨ăéčŚăŞăŽăŻăŞăă§ăăďź
ç§ăăĄăŻăăăăăç解ă§ăăŞăăłăźăăŤééăăžăăăăďź ăăă°ăŠă ăŽĺĽăŽé¨ĺăĺŁăăŚăăžăăăăĺ¤ć´ăčĄăăŽăćăă¨ăăŻăăăŞăăăăžăç解ăăŚăăăă俎ćŁćšćłăăăăăžăăă ăăăĺ°éŁă§ăă
ăă˝ăăăŚă§ă˘ăŽč¨č¨ăŤăŻ2ă¤ăŽćšćłăăăăžăă1ă¤çŽăŻĺç´ăŞćšćłă§ćç˝ăŞćŹ éĽăăŞăăăă¨ă§ăăă2ă¤çŽăŻă˝ăăăŚă§ă˘ăé常ăŤč¤éăŤăăŚćç˝ăŞćŹ éĽăăŞăăă¨ă§ăă ćĺăŽćšăăŻăăăŤéŁăăăă -C.E. R. Hoar
č¤éăăŻăäżĄé źă§ăăă˝ăăăŚă§ă˘ăäżĄé źă§ăăŞăă˝ăăăŚă§ă˘ăŤĺ¤ăăžăă č¤éăăŻă˝ăăăŚă§ă˘ăăă¸ă§ăŻăă掺ăăăŽă§ăă ăăăăŁăŚăăˇăłăăŤăăGoăŽćçľçŽć¨ă§ăă ăŠăăŞăăă°ăŠă ăć¸ăăŤăăŚăăăăăăŻĺç´ă§ăŞăăă°ăŞăăžăăă
1.2ă čŞăżăăă
ăĺŻčŞć§ăŻäżĺŽć§ăŽä¸ĺŻćŹ ăŞé¨ĺă§ăă-Mark Conferenceă2018 ConferenceăJVM Conference
ăłăźăăčŞăżĺăĺŻč˝ă§ăăăă¨ăéčŚăŞăŽăŻăŞăă§ăăďź čŞăżăăăăŽăăăŤĺŞĺăăĺż
čŚăăăăŽăŻăŞăă§ăăďź
ăăăă°ăŠă ăŻäşşă
ăŽăăăŤć¸ăăăăšăă§ăăăćŠć˘°ăŻăăăăĺŽčĄăăă ăă§ăă -ăăŤăťă˘ăăŤă˝ăłă¨ă¸ă§ăŠăŤăăťăľăšăăłăăăłăłăăĽăźăżăźăăă°ăŠă ăŽć§é ă¨č§Łéă
Goăăă°ăŠă ă ăă§ăŞăăä¸čŹăŤăăšăŚăŽă˝ăăăŚă§ă˘ăŻäşşăŽăăăŤäşşăŤăăŁăŚć¸ăăăŚăăžăă ăăˇăłăăłăźăăĺŚçăăă¨ăăäşĺŽăŻäşćŹĄçă§ăă
ć¸ăčžźăžăăăłăźăăŻăäşşă
ăŤăăŁăŚçš°ăčżăčŞăżĺăăăžăăć°ĺĺă§ăŻăŞăăŤăăŚăăć°çžĺă§ăă
ăăăă°ăŠăăźăŤă¨ăŁăŚćăéčŚăŞăšăăŤăŻăă˘ă¤ăă˘ăĺšćçăŤäźăăč˝ĺă§ăăă - ăŹăšăăłăťăăźăŤăź
čŞăżăăăăŻăăăă°ăŠă ăŽćŠč˝ăç解ăăăăăŽéľă§ăă ăłăźăăç解ă§ăăŞăĺ ´ĺăăŠăŽăăăŤçśćăăăŽă§ăăďź ă˝ăăăŚă§ă˘ăăľăăźăă§ăăŞăĺ ´ĺăć¸ăćăăăăžăă ăăăŻăăŞăăŽäźç¤žăGoă使ç¨ăăćĺžăŽćŠäźăăăăăžăăă
čŞĺă§ăăă°ăŠă ăä˝ćăăŚăăĺ ´ĺăŻăčŞĺăŤĺăŁăćšćłăĺŽčĄăăŚăă ăăă ăăăăăăăĺ
ąĺăăă¸ă§ăŻăăŽä¸é¨ă§ăăĺ ´ĺăăžăăŻăăă°ăŠă ăčŚäťśăćŠč˝ăăžăăŻăăăćŠč˝ăăç°ĺ˘ăĺ¤ć´ăăăŽăŤĺĺăŞćé使ç¨ăăăĺ ´ĺăçŽć¨ăŻăăă°ăŠă ăäżĺŽĺŻč˝ăŤăăăă¨ă§ăă
ăľăăźăăăăŚăăă˝ăăăŚă§ă˘ăä˝ćăăćĺăŽăšăăăăŻăăłăźăăć確ă§ăăăă¨ă確čŞăăăă¨ă§ăă
1.3ă ççŁć§
ăăăśă¤ăłă¨ăŻăäťćĽĺä˝ăăăăăŤăłăźăăć´çăăćčĄă§ăăă常ăŤĺ¤ĺăăľăăźăăăžăăă -ăľăłăăŁăťăĄăă
ćĺžăŽĺşćŹĺĺă¨ăăŚăéçşč
ăŽççŁć§ăŤĺĺăäťăăăă¨ćăăžăă ăăăŻĺ¤§ăăŞăăăăŻă§ăăăăăăŻćŻçăŤĺ¸°çăăžăďźćç¨ăŞä˝ćĽăŤč˛ťăăćéă¨ăç解ă§ăăŞăăłăźăăăźăšă§ăŽăăźăŤăžăăŻçľśćçăŞćžćľŞăăăŽĺżçăĺž
ă¤ćéă§ăă Goăăă°ăŠăăźăŻăĺ¤ăăŽä˝ćĽăĺŚçă§ăăă¨ćăăăŻăă§ăă
Goč¨čŞăŻăC ++ăăă°ăŠă ăŽăłăłăă¤ăŤä¸ăŤéçşăăăă¨ăăĺčŤă§ăă ăŻă¤ăăŻăłăłăă¤ăŤăŻGoăŽéčŚăŞćŠč˝ă§ăăăć°ăăéçşč
ăĺźăäťăăéčŚăŞčŚç´ ă§ăă ăłăłăă¤ăŠăźăŻćšĺăăăŚăăžăăăä¸čŹçăŤăGoă§ăŻäťăŽč¨čŞă§ăŽăăăăŞăłăłăă¤ăŤăŤć°ç§ăăăăžăă Goéçşč
ăŻăĺçč¨čŞăŽăăă°ăŠăă¨ĺăăăăççŁçă§ăăă¨ćăăŚăăžăăăăăăăŽč¨čŞăŽäżĄé źć§ăŤĺéĄăŻăăăžăăă
éçşč
ăŽççŁć§ăŤă¤ăăŚć šćŹçăŤčŠąăă¨ăGoăăă°ăŠăăźăŻăłăźăăčŞăăă¨ăŻć¸ăăăăćŹčłŞçăŤéčŚă§ăăăă¨ăç解ăăžăă ăăŽăă¸ăăŻă§ăŻăGoăŻăăźăŤă使ç¨ăăŚăçšĺŽăŽăšăżă¤ăŤă§ăăšăŚăŽăłăźăăăăŠăźăăăăăăă¨ăăă§ăăžăă ăăăŤăăăçšĺŽăŽăăă¸ă§ăŻăăŽçšĺŽăŽćšč¨ăĺŚçżăăéăŽăăăăŞĺ°éŁăćé¤ăăăé常ăŽăłăźăă¨ćŻčźăăŚ
čŚăçŽăééăŁăŚăăăăăă¨ăŠăźăŽçšĺŽăŤĺ˝šçŤăĄăžăă
Goăăă°ăŠăăŻăĺĽĺŚăŞăłăłăă¤ăŤă¨ăŠăźăč¤éăŞăăŤăăšăŻăŞăăăŽăăăă°ăăžăăŻéç¨ç°ĺ˘ă§ăŽăłăźăăŽĺąéăŤä˝ćĽă貝ăăăžăăă ăăăŚćăéčŚăŞăă¨ăŻăĺĺăć¸ăăăă¨ăç解ăăăă¨ăăŚćéăçĄé§ăŤăăŞăăă¨ă§ăă
Goéçşč
ă
ăšăąăźăŠăăŞăăŁăŤă¤ăăŚčŠąăă¨ăăăăăŻççŁ
ć§ăćĺłăăžăă
2.čĺĽĺ
ćĺăŤčŞŹćăăăăăăŻ-identifiersăŻă
ĺĺăŽĺ瞊čŞă§ăăĺ¤ć°ăé˘ć°ăăĄă˝ăăăĺăăăăąăźă¸ăŞăŠăŽĺĺă§ăă
ăćŞăĺĺăŻč˛§ĺźąăŞăăśă¤ăłăŽççśă§ăă - ăă¤ăăťăă§ă¤ăăź
GoăŽĺśéăăăć§ćăčăăă¨ăăŞăă¸ă§ăŻăĺăŻăăă°ăŠă ăŽĺŻčŞć§ăŤĺ¤§ăăŞĺ˝ąéżăĺăźăăžăă ĺŻčŞć§ăŻĺŞăăăłăźăăŽéčŚăŞčŚç´ ă§ăăăăăĺŞăăĺĺăé¸ćăăăă¨ăéčŚă§ăă
2.1ă ç°Ąć˝ăă§ăŻăŞăć忍ăăŤĺşăĽăăĺĺčĺĽĺ
ăăłăźăăćç˝ă§ăăăă¨ăéčŚă§ăă 1čĄă§ă§ăăăă¨ă3čĄă§ăăĺż
čŚăăăăžăăă - ăŚăă˘ăťăšăăš
GoăŻăćąăăŤăăăŻăłăŠă¤ăăźăăăă°ăŠă ăŽćĺ°čĄć°ăŤĺŻžăăŚćéŠĺăăăŚăăžăăă ăăŁăšăŻä¸ăŽă˝ăźăšăłăźăăŽăľă¤ăşăăă¨ăăŁăżăźă§ăăă°ăŠă ăĺ
ĽĺăăăŽăŤĺż
čŚăŞćéăćéŠĺăăžăăă
ăčŻăĺĺăŻăăĺčŤăŽăăăŞăăŽă§ăă 誏ćăăĺż
čŚăăăĺ ´ĺăăăăŻăăŻăé˘ç˝ăăăăžăăăă - ăă¤ăăă§ă¤ăăź
ć大ăŽćçăăŽéľăŻăăăă°ăŠă ăčĺĽăăăăăŤé¸ćăăĺĺă§ăă čŻăĺĺăŤăŻăŠăŽăăăŞçščłŞăăăăžăăďź
- čŻăĺĺăŻç°Ąć˝ă§ăă ăăăŻćçă§ăăĺż
čŚăŻăăăžăăăăéĺ°ăĺŤăă§ăăžăăă 俥ĺˇĺŻžééłćŻăéŤăă
- čŻăĺĺăŻčŞŹćçă§ăă ĺ
厚ă§ăŻăŞăăĺ¤ć°ăžăăŻĺŽć°ăŽä˝żç¨ăŤă¤ăăŚčŞŹćăăŚăăžăă éŠĺăŞĺĺăŻăĺŽčŁ
ă§ăŻăŞăăé˘ć°ăŽçľćăžăăŻăĄă˝ăăăŽĺä˝ă誏ćăăžăă ĺ
厚ă§ăŻăŞăăăăąăźă¸ăŽçŽçă ĺĺăčĺĽăăăăŽăăăćŁç˘şăŤč¨čż°ăăŚăăăťăŠăĺŞăăŚăăžăă
- éŠĺăŞĺĺăŻäşć¸ŹĺŻč˝ă§ăă 1ă¤ăŽĺĺă§ăăŞăă¸ă§ăŻăăŽä˝żç¨ćšćłăç解ăăĺż
čŚăăăăžăă ĺĺăŻčŞŹćçăŞăăŽăŤăăĺż
čŚăăăăžăăăäźçľąăŤĺžăăă¨ăéčŚă§ăă ăăăŻăGoăăă°ăŠăăźăăă¤ăăŁăŞăăăŁăăŻăă¨č¨ăă¨ăăŽćĺłă§ăă
ăăăăŽăăăăăŁăŽăăăăăăăăŤčŠłăăć¤č¨ăăŚăżăžăăăă
2.2ă IDăŽéˇă
GoăŽăšăżă¤ăŤăŻăçăĺ¤ć°ĺă§ćšĺ¤ăăăăă¨ăăăăžăă Rob Pikeă
č¨ăŁăăă㍠ăăGoăăă°ăŠăăźăŻ
ćŁăăéˇăăŽčĺĽĺăĺż
čŚă¨ăăŚă
ăžă ăă
Andrew GerrandăŻăéčŚć§ă示ăăăéˇăčĺĽĺăćäžăăŚăăžăă
ăĺĺăŽĺŽŁč¨ăăăŞăă¸ă§ăŻăăŽä˝żç¨ăžă§ăŽčˇé˘ăéˇăăťăŠăĺĺăŻéˇăăŞăăŻăă§ăă -Andrew Gerrand
ăăăăŁăŚăăăă¤ăăŽć¨ĺĽ¨äşé
ăä˝ćă§ăăžăă
- çăĺ¤ć°ĺăŻă厣č¨ă¨ćĺžăŽä˝żç¨ă¨ăŽčˇé˘ăçăĺ ´ĺăŤéŠăăŚăăžăă
- éˇăĺ¤ć°ĺăŻăăăčŞä˝ăćŁĺ˝ĺăăĺż
čŚăăăăžăă éˇăăŞăă°ăŞăăťăŠăăăéčŚăŤăŞăăžăă 芳細ăŞăżă¤ăăŤăŤăŻăăăźă¸ä¸ăŽéăżăŤé˘éŁăăăˇă°ăăŤăăťă¨ăăŠĺŤăžăăŚăăžăăă
- ĺ¤ć°ĺăŤăżă¤ăĺăĺŤăăŞăă§ăă ăăă
- ĺŽć°ĺăŻăĺ¤ăŽä˝żç¨ćšćłă§ăŻăŞăăĺ
é¨ĺ¤ăč¨čż°ăăĺż
čŚăăăăžăă
- ăŤăźăă¨ĺĺ˛ăŤăŻ1ćĺăŽĺ¤ć°ăăăăŠăĄăźăżăźă¨ćťăĺ¤ăŤăŻĺĽă
ăŽĺčŞăăăăăąăźă¸ăŹăăŤă§ăŻé˘ć°ă¨ĺŽŁč¨ăŤč¤ć°ăŽĺčŞă使ç¨ăăžăă
- ăĄă˝ăăăă¤ăłăżăźăă§ăźăšăăăăłăăăąăźă¸ăŤăŻĺä¸ăŽĺčŞăĺŞĺ
ăăžăă
- ăăăąăźă¸ĺăŻăĺźăłĺşăĺ
ăĺç
§ăŤä˝żç¨ăăĺĺăŽä¸é¨ă§ăăăă¨ăŤćł¨ćăăŚăă ăăă
äžăčăăŚăżăžăăăă
type Person struct { Name string Age int }
10čĄçŽă§ăŻăçŻĺ˛
p
ĺ¤ć°
p
厣č¨ăăă揥ăŽčĄăă1ĺă ăĺźăłĺşăăăžăă ă¤ăžăăĺ¤ć°ăŻăăźă¸ä¸ăŤé常ăŤçćéăăĺĺ¨ăăžăăă čŞč
ăăăă°ăŠă ă§ăŽ
p
ăŽĺ˝šĺ˛ăŤčĺłăăăĺ ´ĺă2čĄă ăăčŞăă ăă§ĺĺă§ăă
ćŻčźăŽăăăŤă
people
é˘ć°ăăŠăĄăźăżăźă§ĺŽŁč¨ăăă7čĄăćĺšă§ăă
sum
ă¨
count
ăŤă¤ăăŚăĺăăă¨ăč¨ăăžăăŽă§ăéˇăĺĺăćŁĺ˝ĺăăžăă čŞč
ăŻăăăăčŚă¤ăăăăăŤăăĺ¤ăăŽăłăźăăăšăăŁăłăăĺż
čŚăăăăžăďźăăăŻăăĺ¤ăăŽčĺĽĺăćŁĺ˝ĺăăžăă
sum
s
ăă
count
ăŤ
c
ďźăžăăŻ
n
ďźăé¸ćă§ăăžăăăăăăŤăăăăăă°ăŠă ĺ
ăŽăăšăŚăŽĺ¤ć°ăŽéčŚć§ăĺăăŹăăŤăŤä˝ä¸ăăžăă
people
ă
p
ăŤç˝Žăćăăăă¨ăă§ăăžăăăĺéĄăăăăžă
for ... range
çš°ăčżăĺ¤ć°ăĺźăłĺşăăăŽ
for ... range
ă çĺ˝ăŽĺ垊ĺ¤ć°ăŻăăăăçąćĽăăăăă¤ăăŽĺ¤ăăăéˇăĺĺăĺĺžăăăăăä¸
person
ăŻĺĽĺŚăŤčŚăăžăă
ăăłă 掾č˝éăŽçŠşčĄăŻăăăšăăŽćľăăä¸ćăăăăăé˘ć°ăŽăšăăŞăźă ă犺čĄă§ĺşĺăăžăă AverageAge
ăŻ3ă¤ăŽéŁçśăăćä˝ăAverageAge
ăžăă ćĺăŤăăźăăŤăăé¤çŽă揥ăŤçˇĺš´é˝˘ă¨äşşć°ăŽçľčŤăćĺžăŽĺšłĺ嚴齢ăŽč¨çŽăăă§ăăŻăăžăă
2.2.1ă 丝ăŞăăŽăŻăłăłăăăšăă§ă
ăťă¨ăăŠăŽĺ˝ĺăŽăăłăăŻăłăłăăăšăĺşćă§ăăăă¨ăç解ăăăă¨ăéčŚă§ăă ăăăŻĺĺă§ăăăčŚĺă§ăŻăŞăăă¨č¨ăăăă§ăă
i
ă¨
index
IDăŽéăăŻä˝ă§ăăďź ăă¨ăă°ăăăŽăăăŞăłăźăăć確ăŤč¨ăăă¨ăŻă§ăăžăă
for index := 0; index < len(s); index++ {
ĺşćŹçăŤčŞăżăăă
for i := 0; i < len(s); i++ {
ăăŽĺ ´ĺăé ĺ
i
ăžăăŻ
index
for
ăŤăźăăŽćŹä˝ăŤăăŁăŚĺśéăăăčż˝ĺ ăŽĺéˇć§ăŻăăă°ăŠă ăŽç解ăŤăťă¨ăăŠĺ˝šçŤăăŞăăăă2çŞçŽăŽăŞăăˇă§ăłăŻćŞăăŞăă¨ćăăžăă
ăăăăăăăăŽé˘ć°ăŽăăĄăčŞăżăăăăŽăŻăŠăă§ăăďź
func (s *SNMP) Fetch(oid []int, index int) (int, error)
ăžăăŻ
func (s *SNMP) Fetch(o []int, i int) (int, error)
ăăŽäžă§ăŻă
oid
ăŻSNMPăŞăă¸ă§ăŻăIDăŽççĽĺ˝˘ă§ăăă
o
čż˝ĺ ăŽççĽĺ˝˘ăŻăăłăźăăčŞăżĺăă¨ăăŤăăłăźăĺ
ăŽćć¸ĺăăă襨č¨ćłăăçă襨č¨ćłă¸ăŽčŞăżĺăă埡ĺśăăžăă ĺć§ăŤă
index
ă
i
ăŤć¸ăăă¨ăSNMPăĄăăťăźă¸ă§ăŻĺOIDăŽăľăĺ¤ăă¤ăłăăăŻăšă¨ĺźă°ăăăăăç解ăéŁăăăŞăăžăă
ăăłă 1ă¤ăŽĺşĺă§éˇăćŁĺźăŞăăŠăĄăźăżă¨çăćŁĺźăŞăăŠăĄăźăżăçľăżĺăăăŞăă§ăă ăăă
2.3ă ăżă¤ăăă¨ăŤĺ¤ć°ăŤĺĺăäťăăŞăă§ăă ăă
ăăăăăçŹăăăçŤăă¨ĺźă°ăŞăă§ăăďź ĺăççąă§ăĺ¤ć°ĺăŤăżă¤ăĺăĺŤăăŞăă§ăă ăăă ăżă¤ăă§ăŻăŞăăłăłăăłăăč¨čż°ăăĺż
čŚăăăăžăă äžăčăăŚăżăžăăăďź
var usersMap map[string]*User
ăăŽçşčĄ¨ăŻä˝ăăăă§ăăďź ăăăŻăăăă§ăăă
*User
ăżă¤ăă¨é˘äżăăăăă¨ăăăă
*User
ăăăăŻăăăăčŻăăă¨ă§ăă ăă ăă
usersMap
ăŻ
ĺŽéăŤăŻăăăă§ăăăéçăŤĺäťăăăăč¨čŞă§ăăGoăŻăăšăŤăŠăźĺ¤ć°ăĺż
čŚăŞĺ ´ćă§čޤăŁăŚăăŽĺĺă使ç¨ăăŞăăăă
Map
ăľăăŁăăŻăšăŻĺéˇă§ăă
äťăŽĺ¤ć°ăčż˝ĺ ăăăçśćłăčăăŚăżăžăăăă
var ( companiesMap map[string]*Company productsMap map[string]*Products )
ăżă¤ăăăăăŽ3ă¤ăŽĺ¤ć°ďź
usersMap
ă
usersMap
ăăăł
productsMap
ăăăăăăšăŚăŽčĄăç°ăŞăăżă¤ăăŤăăăăăăŚăăžăă ăăăăŻăăăă§ăăăă¨ăăăăăžăăăžăăăłăźăă
map[string]*User
äşćăăŚăăcompanyMapă使ç¨ăăăă¨ăăă¨ăăłăłăă¤ăŠăă¨ăŠăźăăšăăźăăăă¨ăăăăŁăŚă
map[string]*User
ă ăăŽçśćłă§ăŻăăľăăŁăăŻăš
Map
ăăłăźăăŽćçăăĺä¸ăăăŞăăă¨ăŻćăăă§ăăăăăăŻĺăŞăčż˝ĺ ćĺă§ăă
ĺ¤ć°ăŽĺăŤäźźăćĽĺ°žčžăéżăăăă¨ăăĺ§ăăăžăă
ăăłă users
ăŽĺĺăââćŹčłŞăĺĺăŤć確ăŤčŞŹćăăŚăăŞăĺ ´ĺă usersMap
ăusersMap
ăžăă
ăăŽăăłăăŻăé˘ć°ăăŠăĄăźăżăźăŤăéŠç¨ăăăžăă äžďź
type Config struct {
*Config
ăăŠăĄăźăżăźăŽ
*Config
ĺăŻĺéˇă§ăă ăăă
*Config
ă§ăăăă¨ăŻć˘ăŤçĽăŁăŚăăžăă
ăăŽĺ ´ĺăĺ¤ć°ăŽćĺšćéăçăĺ ´ĺăŻă
conf
ăžăăŻ
c
ć¤č¨ăăŚăă ăăă
ă¨ăŞă˘ĺ
ăŽăăćçšă§
*Config
ăč¤ć°ăăĺ ´ĺă
original
conf1
ă¨
conf2
ăŽĺĺăŻă
original
ăŽĺĺă¨
updated
ăĺĺăăăćĺł
conf2
ĺ°ăŞăăŞăăžăăĺžč
ăŻćˇˇĺăăŤăăăăă§ăă
ă注ć ăăăąăźă¸ĺăŤéŠĺăŞĺ¤ć°ĺăçăžăŞăă§ăă ăăă
ă¤ăłăăźăăăăčĺĽĺăŽĺĺăŤăŻăăăăąăźă¸ăŽĺĺăĺŤăžăăžăă ăă¨ăă°ă context
ăăăąăźă¸ăŽContext
ăżă¤ăăŻcontext.Context
ă¨ĺźă°ăăžăă ăăăŤăăăăăăąăźă¸ă§ĺ¤ć°ăžăăŻĺcontext
ă使ç¨ă§ăăŞăăŞăăžăă
func WriteLog(context context.Context, message string)
ăăăŻăłăłăă¤ăŤăăăžăăă context.Context
ăăźăŤăŤă§ĺŽŁč¨ăăĺ ´ĺăăă¨ăă°ctx
ăăăŞĺĺăäźçľąçăŤä˝żç¨ăăăŚăăăŽăŻăăŽăăă§ăă
func WriteLog(ctx context.Context, message string)
2.4ă ĺä¸ăŽĺ˝ĺăšăżă¤ăŤă使ç¨ăă
čŻăĺĺăŽăă1ă¤ăŽçšć§ăŻăäşć¸ŹĺŻč˝ă§ăăăă¨ă§ăă čŞč
ăŻăăăŤăăăç解ăăŞăăă°ăŞăăžăăă ăăă
ä¸čŹĺă§ăăĺ ´ĺăčŞč
ăŻĺĺăăćĺłăĺ¤ăăŚăăŞăă¨ćłĺŽăă樊ĺŠăăăăžăă
ăă¨ăă°ăăłăźăăăăźăżăăźăšč¨čż°ĺăĺăĺ ´ĺăăăŠăĄăźăżăźă襨示ăăăăăłăŤăĺăĺĺăŤăăĺż
čŚăăăăžăă
d *sql.DB
ă
dbase *sql.DB
ă
DB *sql.DB
ăăăł
database *sql.DB
ăăăŞăăăă税éĄăŽçľăżĺăăăŽäťŁăăăŤă揥ăŽ1ă¤ă使ç¨ăăăă¨ăă
DB *sql.DB
ă
database *sql.DB
ă
db *sql.DB
ăłăźăăç解ăăćšăç°Ąĺă§ăă
db
ă襨示ăăăŚăăĺ ´ĺăăăăŻ
*sql.DB
ăăăăăźăŤăŤă§ĺŽŁč¨ăăăŚăăăăĺźăłĺşăĺ
ăŤăăŁăŚćäžăăăŚăăăă¨ăăăăăžăă
ăĄă˝ăăăŽĺ俥č
ăŤé˘ăăĺć§ăŽă˘ăăă¤ăšă ăăŽăżă¤ăăŽĺăĄă˝ăăăŤĺăĺ俥č
ĺă使ç¨ăăžăă ăăŽăăăăăŽăżă¤ăăŽăăžăăžăŞăĄă˝ăăăŽä¸ă§ăčŞč
ăĺ俥č
ăŽä˝żç¨ăç解ăăăăăŞăăžăă
ă注ć Go Recipients Short Name AgreementăŻă䝼ĺăŤčĄ¨ćăăăć¨ĺĽ¨äşé
ă¨ççžăăžăă ăăăŻă snake_case
䝣ăăăŤsnake_case
ă使ç¨ăăăŞăŠăĺć掾éă§čĄăăăé¸ćăć¨ćşăšăżă¤ăŤăŤăŞăăąăźăšăŽ1ă¤ă§ăă
ăăłă Goăšăżă¤ăŤăŻăăżă¤ăăăć´žçăăĺ俥č
ăŽ1ćĺăŽĺĺăžăăŻçĽčŞă示ăăžăă ĺ俥č
ĺăăĄă˝ăăăŽăăŠăĄăźăżăźĺă¨çŤśĺăăĺ ´ĺăăăăă¨ăĺ¤ćăăĺ ´ĺăăăăžăă ăăŽĺ ´ĺăăăŠăĄăźăżăźĺăăăĺ°ăéˇăăăŚăé çŞăŤä˝żç¨ăăăă¨ăĺżăăŞăă§ăă ăăă
ćĺžăŤăä¸é¨ăŽ1ćĺăŽĺ¤ć°ăŻăäźçľąçăŤăŤăźăă¨ăŤăŚăłăăŤé˘éŁäťăăăăŚăăžăă ăă¨ăă°ă
i
ă
j
ă
k
ăŻé常
for
ăŤăźăăŽĺ¸°ç´çĺ¤ć°ă
n
é常ăŤăŚăłăżăźăžăăŻç´ŻçŠĺ çŽĺ¨ăŤé˘éŁäťăăăă
v
ăŻă¨ăłăłăźăé˘ć°ăŽĺ
¸ĺçăŞĺ¤ăŽçĽčŞă
k
é常ăăăăăźăŤä˝żç¨ăăă
s
string
ĺăŽăăŠăĄăźăżăźăŽçĽčŞă¨ăăŚăă使ç¨ăă
string
ă
ä¸č¨ăŽ
db
äžă¨ĺć§ăŤăăăă°ăŠăăź
㯠i
ă帰ç´çĺ¤ć°ă§ăăăă¨ă
ćĺž
ăăŚăăžăă 彟ăăăłăźăă§ăăăčŚăă°ă彟ăăŻăăăŤăŤăźăăčŚăăă¨ăćĺž
ăăă
ăăłă ăăšăăăăăŤăźăăé常ăŤĺ¤ăă i
ă j
ăăăłk
ĺ¤ć°ăä¸čśłăăŚăăĺ ´ĺăŻăé˘ć°ăăăĺ°ăăŞĺä˝ăŤĺĺ˛ăăăă¨ăă§ăăžăă
2.5ă ĺä¸ăŽĺŽŁč¨ăšăżă¤ăŤă使ç¨ăă
GoăŤăŻăĺ¤ć°ă厣č¨ăăăăăŽĺ°ăŞăă¨ă6ă¤ăŽç°ăŞăćšćłăăăăžăă
var x int = 1
var x = 1
var x int; x = 1
var x = int(1)
x := 1
ăžă ăăšăŚăčŚăăŚăăŞăăŤéăăŞăă Goéçşč
ăŻăăăăăăăééăă¨čŚăŞăăžăăăä˝ăĺ¤ć´ăăăŤăŻé
ăăăžăă ăăŽé¸ćă§ăĺä¸ăŞăšăżă¤ăŤă確äżăăćšćłăŻďź
ç§ăŻăčŞĺčŞčşŤă§ĺŻč˝ăŞéă使ç¨ăăăă¨ăăĺ¤ć°ă厣č¨ăăăšăżă¤ăŤăććĄăăăă¨ćăăžăă
GoăŤăŻăăĺăăĺĽăŽĺă¸ăŽčŞĺĺ¤ćăăŞăăăăćĺă¨3çŞçŽăŽäžă§ăŻă䝣ĺ
ĽćźçŽĺăŽĺˇŚĺ´ăŽĺăŻĺłĺ´ăŽĺă¨ĺăă§ăăĺż
čŚăăăăžăă ăłăłăă¤ăŠăŻăĺłĺ´ăŽĺăă厣č¨ăăăĺ¤ć°ăŽĺăć¨ć¸Źă§ăăăăăäžăŻăăç°Ąć˝ăŤč¨čż°ă§ăăžăă
var players = 0 var things []Thing = nil var thing = new(Thing) json.Unmarshall(reader, thing)
ăăă§ăŻă
players
ăŽĺćĺ¤ăŻăăăăŽĺ ´ĺăăźăă§ăăăăă
players
ć示çăŤ
0
ăŤĺćĺăă
0
ăăăăŻĺéˇă§ăă ăăăăŁăŚănullĺ¤ă使ç¨ăăăă¨ăć確ăŤăăćšăéŠĺă§ăă
var players int
2çŞçŽăŽăŞăăŹăźăżăźăŻăŠăă§ăăďź ăżă¤ăăĺ¤ĺĽăăŚć¸ăčžźăăă¨ăŻă§ăăžăă
var things = nil
nil
ĺ nil
ăŞăăăă§ăă 䝣ăăăŤăé¸ćč˘ăăăăžăďźăžăăŻăăźăĺ¤ă使ç¨ăăŚăšăŠă¤ăšăăžă...
var things []Thing
...ăžăăŻčŚç´ ăăźăăŽăšăŠă¤ăšăä˝ćăăžăăďź
var things = make([]Thing, 0)
2çŞçŽăŽĺ ´ĺăăšăŠă¤ăšăŽĺ¤
ăŻăźăă§ăŻ
ăŞă ăçă形ĺźăŽĺŽŁč¨ă使ç¨ăăŚčŞč
ăŤć確ăŤăăžăă
things := make([]Thing, 0)
ăăăŻăć示çăŤĺćĺăăăă¨ăŤăăăă¨ăčŞč
ăŤäźăăžăă
ăăăăŁăŚă3çŞçŽăŽĺŽŁč¨ăŤé˛ăżăžăă
var thing = new(Thing)
ăăă§ăŻăĺ¤ć°ăŽć示çăŞĺćĺă¨ăä¸é¨ăŽGoăăă°ăŠăăźăć°ăŤĺ
ĽăăŞăăăŚăăźăŻăŞăăăźăŻăźă
new
ĺ°ĺ
ĽăŽä¸Ąćšăăăăžăă ć¨ĺĽ¨ăăăçăć§ćă使ç¨ăăă¨ă揥ăŽăăăŤăŞăăžă
thing := new(Thing)
ăăăŤăăă
thing
ć示çăŤ
new(Thing)
çľćăŤĺćĺăăăžăăăăăă§ăéĺŽĺăŽ
new
ăŻćŽăăăžăă ăăŽĺéĄăŻăăŞăăŠăŤă使ç¨ăăŚč§Łćąşă§ăăžăă
thing := &Thing{}
ăăăŻ
new(Thing)
äźźăŚăăăăăŽăăăŞč¤čŁ˝ăŻGoăăă°ăŠăă桡䚹ăăăžăă ăă ăăăăăŻă
Thing{}
ă¸ăŽăă¤ăłăżă¨ăźăăŽ
Thing
ĺ¤ă使ç¨ăăŚć示çăŤĺćĺăăăă¨ăćĺłăăžăă
ăăăă
thing
ăźăĺ¤ă§ĺŽŁč¨ăăăŚăăă¨ăăäşĺŽăčć
Žăă
json.Unmarshall
ă§
thing
ăŽă˘ăăŹăšă渥ăăăăŤćźçŽĺăŽă˘ăăŹăšă使ç¨ăăćšă
json.Unmarshall
ă§ăă
var thing Thing json.Unmarshall(reader, &thing)
ă注ć ăăĄăăăăŤăźăŤăŤăŻäžĺ¤ăăăăžăă ăă¨ăă°ă2ă¤ăŽĺ¤ć°ăĺŻćĽăŤé˘éŁăăŚăăĺ ´ĺăăăăăă揥ăŽăăăŤč¨čż°ăăăŽăŻĺĽĺŚă§ăă
var min int max := 1000
ăăčŞăżăăă厣č¨ďź
min, max := 0, 1000
čŚç´ăăă¨ďź
- ĺćĺăăăŤĺ¤ć°ă厣č¨ăăă¨ăăŻă
var
ć§ćă使ç¨ăăžăă
- ĺ¤ć°ă厣č¨ăăŚć示çăŤĺćĺăăă¨ăăŻă
:=
使ç¨ă:=
ă
ăăłă č¤éăŞăăŽăć示çăŤććăăžăă
var length uint32 = 0x80
ăăă§ăçšĺŽăŽć°ĺ¤ĺăĺż
čŚă¨ăăăŠă¤ăăŠăŞă§length
ă使ç¨ă§ăăžăăăăŽăŞăăˇă§ăłăŻăéˇăĺăçă厣č¨ă§ăăăuint32ă¨ăăŚĺ
ˇä˝çăŤé¸ćăăăăă¨ăăăć確ăŤç¤şăăžăă
length := uint32(0x80)
ćĺăŽäžă§ăŻăć示çăŤĺćĺăăvar厣č¨ă使ç¨ăăŚćĺłçăŤăŤăźăŤăç ´ăăžăă ć¨ćşăăăŽé¸čąăŤăăăčŞč
ăŻç°ĺ¸¸ăŞăă¨ă辡ăăŁăŚăăăă¨ăç解ă§ăăžăă
2.6ă ăăźă ăŽăăăŤĺă
ă˝ăăăŚă§ă˘éçşăŽćŹčłŞăŻăčŞăżăăăăľăăźăăăăăłăźăăä˝ćăăăă¨ă ă¨ăă§ăŤčż°ăšăžăăă ăăŞăăŽăăŁăŞă˘ăŽăťă¨ăăŠăŻăăăăăĺ
ąĺăăă¸ă§ăŻăă§ĺăă§ăăăă ăăŽçśćłă§ăŽç§ăŽă˘ăăă¤ăšăŻăăăźă ăćĄç¨ăăăšăżă¤ăŤăŤĺžăăă¨ă§ăă
ăăĄă¤ăŤăŽéä¸ă§ăšăżă¤ăŤăĺ¤ć´ăăăŽăŻé˘ĺă§ăă ĺäşşăŽĺĽ˝ăżăćăăăăŽăŽăä¸č˛Ťć§ăŻéčŚă§ăă ç§ăŽçľé¨ĺă§ăŻăăłăźăă
gofmt
ăŤéŠĺăăĺ ´ĺăĺéĄăŻé常č°čŤăă䞥ĺ¤ăŻăăăžăăă
ăăłă ăłăźăăăźăšĺ
¨ä˝ă§ĺĺăĺ¤ć´ăăĺ ´ĺăŻăăăăäťăŽĺ¤ć´ă¨ćˇˇăăŞăă§ăă ăăă 誰ăăgit bisectă使ç¨ăăŚăăĺ ´ĺă彟ăŻĺĽăŽĺ¤ć´ăăăăłăźăăčŚă¤ăăăăăŤä˝ĺăăŽĺĺĺ¤ć´ăćŠăĺăăŽă弽ăżăžăăă
3.ăłăĄăłă
ăăéčŚăŞăă¤ăłăăŤç§ťăĺăŤăăłăĄăłăăăăŽăŤć°ĺăăăăăă¨ćăăžăă
ăčŻăăłăźăăŤăŻĺ¤ăăŽăłăĄăłăăăăăćŞăăłăźăăŤăŻĺ¤ăăŽăłăĄăłăăĺż
čŚă§ăăă -ĺŽç¨ăăă°ăŠăăźăăă¤ăăťăăźăăšă¨ă˘ăłăăŞăĽăźăťăăłă
ăłăĄăłăăŻăăăă°ăŠă ăčŞăżăăăăăăăăŤé常ăŤéčŚă§ăă ĺăłăĄăłăăŻă揥ăŽ3ă¤ăŽăăĄ1ă¤ă ăăĺŽčĄăăĺż
čŚăăăăžăă
- ăłăźăăŽćŠč˝ă誏ćăăžăă
- 彟ăăăăăŠăŽăăăŤčĄăăă誏ćăăŚăă ăăă
- ççąă誏ćăăŚăă ăă ă
ćĺăŽĺ˝˘ĺźăŻăĺ
ŹéăăŁăŠăŻăżăźăŤé˘ăăăłăĄăłăăŤćéŠă§ăă
2çŞçŽăŻăăĄă˝ăăĺ
ăŽăłăĄăłăăŤćéŠă§ăă
3çŞçŽăŽĺ˝˘ĺźďźăççąăďźăŻăćĺăŽ2ă¤ă罎ăćăăă罎ăćăăăăăŞăă¨ăăçšă§ăŚăăźăŻă§ăă ăăŽăăăŞăłăĄăłăăŻăçžĺ¨ăŽĺ˝˘ĺźă§ăłăźăăć¸ăăă¨ăŤčłăŁăĺ¤é¨čŚĺ ă誏ćăăŚăăžăă ĺ¤ăăŽĺ ´ĺăăăŽăłăłăăăšăăăŞăăă°ăăłăźăăăăŽăăăŤč¨čż°ăăăŚăăççąăç解ăăăă¨ăŻĺ°éŁă§ăă
return &v2.Cluster_CommonLbConfig{
ăăŽäžă§ăŻăHealthyPanicThresholdăăźăăăźăťăłăăŤč¨ĺŽăăăŚăăĺ ´ĺăŤä˝ă辡ăăăăăăăŤăŻăăăăžăăă ăłăĄăłăăŻăĺ¤0ăăăăăŻăăăĺ¤ăçĄĺšăŤăăăă¨ăć確ăŤăăăă¨ăçŽçă¨ăăŚăăžăă
3.1ă ĺ¤ć°ă¨ĺŽć°ăŽăłăĄăłăăŻăçŽçă§ăŻăŞăăăăŽĺ
厚ă誏ćăăĺż
čŚăăăăžă
ĺ
ăťăŠăĺ¤ć°ăžăăŻĺŽć°ăŽĺĺăŻăăŽçŽçă誏ćăăăšăă ă¨č¨ăăžăăă ăăăăĺ¤ć°ăžăăŻĺŽć°ăŤé˘ăăăłăĄăłăăŻă
çŽçă§ăŻăŞă
ĺ
厚ăćŁç˘şăŤčŞŹćăăĺż
čŚăăăăžăă
const randomNumber = 6
ăăŽäžă§ăŻ
ă randomNumber
6ăŤ
randomNumber
ăŚăă
ççąă¨ă㎠randomNumber
ăłăĄăłăă§čŞŹćăăŚăăžăă ăłăĄăłăăŤăŻă
randomNumber
ă使ç¨ăăăĺ ´ćăŻč¨čż°ăăăŚăăžăăă 䝼ä¸ăŤäžă示ăăžăă
const ( StatusContinue = 100
HTTPăŽăłăłăăăšă㧠100
ăRFC 7231ăŽăťăŻăˇă§ăł6.2.1ă§ĺŽçžŠăăăŚăăăăăŤ
ăçŞĺˇ
100
StatusContinue
ă¨ăăŚçĽăăăŚă
StatusContinue
ă
ăăłă ĺćĺ¤ăŽăŞăĺ¤ć°ăŽĺ ´ĺăăłăĄăłăăŤăŻăăăŽĺ¤ć°ăŽĺćĺăŽč˛Źäťťč
ăč¨čż°ăăĺż
čŚăăăăžăă
ăăă§ăăłăĄăłăăŻčŞč
ăŤdowidth
é˘ć°dowidth
ăŽçść
ăçśćăă貏䝝ăăăăă¨ăsizeCalculationDisabled
ăžăă
ăăłă çŽăŽĺăŤé ăăžăă ăăăŻăąă¤ăă°ăŹă´ăŞăźăăăŽă˘ăăă¤ăšă§ăă ĺ¤ć°ăŽćéŠăŞĺĺăăłăĄăłăăŤé ăăŚăăĺ ´ĺăăăăžăă
ĺĺregistry
ăăăŽçŽçăĺĺăŤčŞŹćăăŚăăŞăăăăčč
ăŤăăŁăŚăłăĄăłăăčż˝ĺ ăăăžăă-ăăăŻăŹă¸ăšăăŞă§ăăăăŹă¸ăšăăŞă¨ăŻä˝ă§ăăďź
ĺ¤ć°ăŽĺĺăsqlDriversăŤĺ¤ć´ăăă¨ăSQLăăŠă¤ăăźăĺŤăžăăŚăăăă¨ăćăăăŤăŞăăžăă
var sqlDrivers = make(map[string]*sql.Driver)
ăăă§ăăłăĄăłăăŻĺéˇăŤăŞăăĺé¤ă§ăăžăă
3.2ă 常ăŤĺ
ŹéăăăŚăăăăŁăŠăŻăżăźăćć¸ĺăă
ăăăąăźă¸ăŽăăăĽăĄăłăăŻgodocăŤăăŁăŚçćăăăăăăăăăąăźă¸ă§ĺŽŁč¨ăăăŚăăĺăăăŞăăŻćĺďźĺ¤ć°ăĺŽć°ăé˘ć°ăăĄă˝ăăďźăŤăłăĄăłăăčż˝ĺ ăăĺż
čŚăăăăžăă
Googleăšăżă¤ăŤăŹă¤ăăŽ2ă¤ăŽăŹă¤ăăŠă¤ăłă揥ăŤç¤şăăžăă
- ćç˝ă§ăç°Ąć˝ă§ăăŞăăăăŞăăŻé˘ć°ăŤă¤ăăŚăŻăłăĄăłăăăĺż
čŚăăăăžăă
- ăŠă¤ăăŠăŞăŽé˘ć°ăŻăéˇăăč¤éăăŤé˘äżăŞăăłăĄăłăăăĺż
čŚăăăăžăă
package ioutil
ăăŽčŚĺăŤăŻ1ă¤ăŽäžĺ¤ăăăăžăăă¤ăłăżăźăă§ă¤ăšăĺŽčŁ
ăăăĄă˝ăăăćć¸ĺăăĺż
čŚăŻăăăžăăă ĺ
ˇä˝çăŤăŻăăăăčĄăăŞăă§ăă ăăă
ăăŽăłăĄăłăăŻä˝ăŽćĺłăăăăžăăă 彟ăŻăăŽăĄă˝ăăăä˝ăăăăŽăăčż°ăšăŚăăžăăăăăăŤćŞăăă¨ăŤă彟ăŻăăăĽăĄăłăăć˘ăăăăŤăŠăăăŤéăŁăŚăăžăă ăăŽçśćłă§ăŻăăłăĄăłăăĺŽĺ
¨ăŤĺé¤ăăăă¨ăććĄăăžăă
io
ăăăąăźă¸ăŽäžă揥ăŤç¤şăăžăă
LimitedReader
厣č¨ăŽç´ĺăŤăŻăăăă使ç¨ăăé˘ć°ăăăă
LimitedReader.Read
厣č¨ăŻ
LimitedReader
čŞä˝ăŽĺŽŁč¨ăŽ
LimitedReader
çśăăă¨ăŤćł¨ćăăŚăă ăăă
LimitedReader.Read
čŞä˝ăŻćć¸ĺăăăŚăăžăăăăăăăŻ
io.Reader
ĺŽčŁ
ă§ăăăă¨ăç解ă§ăăžăă
ăăłă é˘ć°ăć¸ăĺăŤăăăă誏ćăăăłăĄăłăăć¸ăăŚăă ăăă ăłăĄăłăăć¸ăăŽăéŁăăă¨ćăăŞăăăăăŻăăŞăăć¸ăăă¨ăăŚăăăłăźăăç解ăăăŽăéŁăăă¨ăăăľă¤ăłă§ăă
3.2.1ă ćŞăăłăźăăŤăłăĄăłăăăŞăă§ăć¸ăç´ăăŚăă ăă
ăćŞăăłăźăăŤăŻăłăĄăłăăăŞăă§ăă ăă-ć¸ăç´ăăŚăă ăăă -ăăŠă¤ă˘ăłăťăŤăźăăăł
ăłăĄăłăă§ăłăźăăăŠă°ăĄăłăăŽéŁăăă示ăă ăă§ăŻä¸ĺĺă§ăă ăăăăŽăłăĄăłăăŽ1ă¤ăŤĺşăăăăĺ ´ĺăŻăăŞăăĄăŻăżăŞăłă°ăćăĺşăăăŚăăąăăăéĺ§ăăĺż
čŚăăăăžăă ééĄăăăăŁăŚăăéăăćčĄçč˛ ĺľăćąăăŚçć´ťă§ăăžăă
ć¨ćşăŠă¤ăăŠăŞă§ăŻăĺéĄăŤć°ăĽăăăŚăźăśăźăŽĺĺă¨ă¨ăăŤTODOăšăżă¤ăŤă§ăłăĄăłăăćŽăăŽăä¸čŹçă§ăă
ăăăŻĺéĄă俎ćŁăă瞊ĺă§ăŻăăăžăăăăćĺŽăăăăŚăźăśăźă質ĺăŤéŁçľĄăăăŽăŤćéŠăŞäşşçŠă§ăăĺ ´ĺăăăăžăă äťăŽăăă¸ă§ăŻăă§ăŻăćĽäťăžăăŻăăąăăçŞĺˇăTODOăŤćˇťäťăăŚăăžăă
3.2.2ă ăłăźăăăłăĄăłăă˘ăŚăăă䝣ăăăŤăăŞăăĄăŻăżăŞăłă°ăăžă
ăčŻăăłăźăăŻćéŤăŽăăăĽăĄăłăă§ăă ăłăĄăłăăčż˝ĺ ăăăă¨ăăă¨ăăăăăŽăłăĄăłăăä¸čŚăŤăŞăăăăŤăłăźăăćšĺăăăŤăŻăŠăăăă°ăăă§ăăďźăă¨ăă質ĺăčŞĺăăŚăă ăăă
é˘ć°ăŻ1ă¤ăŽăżăšăŻăŽăżăĺŽčĄăăĺż
čŚăăăăžăă ä¸é¨ăŽăăŠă°ăĄăłăăćŽăăŽé˘ć°ăŤé˘éŁăăŚăăŞăăăăŤăłăĄăłăăć¸ăăăĺ ´ĺăŻăăłăĄăłăăĺĽăŽé˘ć°ăŤć˝ĺşăăăă¨ăć¤č¨ăăŚăă ăăă
ĺ°ăăćŠč˝ăŻć確ă§ăăă ăă§ăŞăăäşăăŤĺĽă
ăŤăăšăăăăŽăç°Ąĺă§ăă ăłăźăăĺĽăŽé˘ć°ăŤĺé˘ăăă¨ăăăŽĺĺă§ăłăĄăłăă罎ăćăăăă¨ăă§ăăžăă
4.ăăăąăźă¸ć§é
ăć§ăăăŞăłăźăăć¸ăďźäťăŽă˘ă¸ăĽăźăŤăŤä˝ĺăŞăăŽă示ăăăäťăŽă˘ă¸ăĽăźăŤăŽĺŽčŁ
ăŤäžĺăăŞăă˘ă¸ăĽăźăŤă -Dave Thomas
ĺăăăąăźă¸ăŻăćŹčłŞçăŤĺĽĺăŽĺ°ăăŞGoăăă°ăŠă ă§ăă é˘ć°ăžăăŻăĄă˝ăăăŽĺŽčŁ
ăĺźăłĺşăĺ´ăŤă¨ăŁăŚéčŚă§ăŻăŞăăăăŤăăăăąăźă¸ăŽăăăŞăăŻAPIăć§ćăăé˘ć°ăăĄă˝ăăăăăăłăżă¤ăăŽĺŽčŁ
ăéčŚă§ăŻăăăžăăă
ĺŞăăGoăăăąăźă¸ăŻăă˝ăźăšăłăźăăŹăăŤă§äťăŽăăăąăźă¸ă¨ăŽćĺ°éăŽćĽçśăçŽćăăŚăăăăăă¸ă§ăŻăăćéˇăăŚăă1ă¤ăŽăăăąăźă¸ăŽĺ¤ć´ăăłăźăăăźăšĺ
¨ä˝ăŤăŤăšăąăźăăăăžăăă ăăŽăăăŞçśćłăŻăăăŽăłăźăăăźăšă§ä˝ćĽăăăăă°ăŠăă大ăăéťĺŽłăăžăă
ăăŽăťăŻăˇă§ăłă§ăŻăăăăąăźă¸ăŽč¨č¨ăŤă¤ăăŚăăăŽĺĺăăĄă˝ăăăé˘ć°ăć¸ăăăăŽăăłăăŞăŠăŤă¤ăăŚčŞŹćăăžăă
4.1ă čŻăăăăąăźă¸ăŻčŻăĺĺă§ĺ§ăžăăžă
éŠĺăŞGoăăăąăźă¸ăŻăĺ質ăŽĺĺă§ĺ§ăžăăžăăăăăŻă1čŞăŤéĺŽăăăçăăăŹăźăłăăźăˇă§ăłă¨čăăŚăă ăăăĺăŽăťăŻăˇă§ăłăŽĺ¤ć°ĺă¨ĺć§ăŤăăăăąăźă¸ĺăŻé常ăŤéčŚă§ăăăăŽăăăąăźă¸ăŽăăźăżĺăŤă¤ăăŚčăăĺż
čŚăŻăăăžăăăăăăŽăăăąăźă¸ăŻăŠăŽăľăźăăšăćäžăăžăăďźăă¨ăă質ĺăăăćšăăăă§ăăăăĺč°äźăăăăąăźă¸ĺăŻăăłăłăăłăă§ăŻăŞăćŠč˝ăă¨ăŤé¸ćăăŚăă ăăă
4.1.1ăéŠĺăŞăăăąăźă¸ĺăŻä¸ćă§ăŞăăă°ăŞăăžăă
ĺăăăąăźă¸ăŤăŻăăăă¸ă§ăŻăĺ
ă§ä¸ćăŽĺĺăäťăăăăŚăăžăăăăăąăźă¸ăŽçŽçă§ĺĺăäťăăă¨ăăă˘ăăă¤ăšăŤĺžăă°ăĺéĄăŻăăăžăăă2ă¤ăŽăăăąăźă¸ăŽĺĺăĺăă§ăăăă¨ăĺ¤ćăăĺ ´ĺăăťă¨ăăŠăŽĺ ´ĺďź- ăăăąăźă¸ĺăä¸čŹçăăăžăă
- . , .
4.2ă base
, common
util
ćŞăĺĺăŽä¸čŹçăŞççąăŻăăăăăăľăźăăšăăăąăźă¸ă§ăăăăă§ăŻăćéăŽçľéă¨ă¨ăăŤăăžăăžăŞăăŤăăźă¨ăľăźăăšăłăźăăčçŠăăăžăăăăă§ä¸ćăŽĺĺăčŚă¤ăăăŽăŻéŁăăăŽă§ăăăăŤăăăĺ¤ăăŽĺ ´ĺăăăăąăźă¸ĺăŻĺŤăžăăŚăăăŚăźăăŁăŞăăŁăăć´žçăăžăăăžăăŻăŽăăăŞĺĺăŻă大čŚć¨ĄăŞăăă¸ă§ăŻăă§çşçăăžăăăăŽăăă¸ă§ăŻăă§ăŻăăăăąăźă¸ăŽćˇąăé幤ăăŤăźăĺăăăčŁĺŠćŠč˝ăĺ
ąćăăăžăăé˘ć°ăć°ăăăăăąăźă¸ăŤć˝ĺşăăă¨ăă¤ăłăăźăă夹ćăăžăăăăŽĺ ´ĺăăăăąăźă¸ăŽĺĺăŻăăăąăźă¸ăŽçŽçăĺć ăăŚăăžăăăăăăă¸ă§ăŻăăŽä¸éŠĺăŞçˇ¨ćăŤăăă¤ăłăăźăćŠč˝ăŽĺ¤ąćăŽăżăĺć ăăŚăăžăăăăŽăăăŞçśćłă§ăŻăăăăąăźă¸ăŽĺźăłĺşăĺ
ăĺćăăăă¨ăăĺ§ăăăžăăutils
helpers
utils
helpers
ăăăăłĺŻč˝ă§ăăă°ă寞ĺżăăé˘ć°ăĺźăłĺşăăăąăăăŤç§ťĺăăžăăăăăŤăăŤăăźăłăźăăŽč¤čŁ˝ăĺŤăžăăĺ ´ĺă§ăă2ă¤ăŽăăăąăźă¸éăŤă¤ăłăăźăäžĺé˘äżăĺ°ĺ
ĽăăăăăĺŞăăŚăăžăăăďźĺ°ăăŽďźč¤čŁ˝ăŻăééăŁăć˝čąĄĺăăăăŻăăăŤĺŽäžĄă§ăăă -Sandy Mets
ăŚăźăăŁăŞăăŁé˘ć°ăĺŤă1ă¤ăŽă˘ăăŞăˇăăŻăăăąăźă¸ă§ăŻăŞăăăŚăźăăŁăŞăăŁé˘ć°ăĺ¤ăăŽĺ ´ćă§ä˝żç¨ăăĺ ´ĺăŻăăăăăă1ă¤ăŽĺ´é˘ăŤçŚçšăĺ˝ăŚăč¤ć°ăŽăăăąăźă¸ăä˝ćăăăă¨ăăĺ§ăăăžăăĺč°äźăăľăźăăšăăăąăźă¸ăŤăŻč¤ć°ĺ˝˘ă使ç¨ăăžăăăă¨ăă°ăstrings
ćĺĺĺŚçăŚăźăăŁăŞăăŁăŽĺ ´ĺă
base
ăžăăŻăŽăăăŞĺĺăŽăăăąăźă¸ăŻcommon
ă2ă¤äťĽä¸ăŽĺŽčŁ
ăŽçšĺŽăŽĺ
ąéćŠč˝ăžăăŻăŻăŠă¤ă˘ăłăă¨ăľăźăăźăŽĺ
ąéăżă¤ăăĺĽăŽăăăąăźă¸ăŤăăźă¸ăăăă¨ăăŤăăçşçăăžăăăăŽăăăŞĺ ´ĺă1ă¤ăŽăăăąăźă¸ĺ
ăŽăŻăŠă¤ă˘ăłăăăľăźăăźăăăăłĺ
ąéăłăźăăăăăŽćŠč˝ăŤĺŻžĺżăăĺĺă¨çľăżĺăăăŚăăăăąăźă¸ăŽć°ăć¸ăăĺż
čŚăăăă¨ćăăžăăăă¨ăă°ăăănet/http
ĺă
ăŽăăăąăźă¸ăăăŞăclient
ă¨server
ă䝣ăăăŤăăăĄă¤ăŤăăăclient.go
ă¨server.go
ă寞ĺżăăăăźăżăżă¤ăă¨ăă ăă§ăŞăătransport.go
ăăźăżăŤăŽčź¸éăŽăăăŤăŻăĺč°äźăčĺĽĺĺăŤăŻăăăąăźă¸ĺăĺŤăžăăăă¨ăčŚăăŚăăăă¨ăéčŚă§ăă
Get
ăăăąăźă¸ăŽé˘ć°ăŻăĺĽăŽăăăąăźă¸ăănet/http
ăŽhttp.Get
ăŞăłăŻăŤăŞăăžăă
Reader
ăăăąăźă¸ăŽĺăŻăstrings
äťăŽăăăąăźă¸ăŤă¤ăłăăźăăăăă¨ăăŤĺ¤ćăăăžăstrings.Reader
ă
Error
ăăăąăźă¸ăŽă¤ăłăżăźăă§ă¤ăšăŻănet
ćăăăŤăăăăŻăźăŻă¨ăŠăźăŤé˘éŁäťăăăăŚăăžăă
4.3ă 桹ăć˝ăăă¨ăŞăăăăŤćťăŁăŚăăžă
GoăŻĺśĺžĄăăăźă§äžĺ¤ă使ç¨ăăŞăăătry
ăandăŽćä¸ä˝ăŽć§é ăćäžăăăăăŤăłăźăă桹ăćăä¸ăăĺż
čŚăŻăăăžăăcatch
ăč¤ć°ăŹăăŤăŽé幤ăŽäťŁăăăŤăGoăłăźăăŻé˘ć°ăŽé˛čĄă¨ă¨ăăŤçťé˘ăä¸ăŁăŚăăăžăăç§ăŽĺäşşăŽăăăăťăŠă¤ă˘ăźăŻăăăŽçˇ´çżăăčŚçˇăă¨ĺźăă§ăăžăăăăăŻăĺ˘çćźçŽĺă使ç¨ăăŚĺŽçžăăăžăăé˘ć°ă¸ăŽĺ
ĽĺăŤĺććĄäťśăăăćĄäťśäťăăăăăŻăăăăąăźă¸ăŽäžă揥ăŤç¤şăăžăbytes
ă func (b *Buffer) UnreadRune() error { if b.lastRead <= opInvalid { return errors.New("bytes.Buffer: UnreadRune: previous operation was not a successful ReadRune") } if b.off >= int(b.lastRead) { b.off -= int(b.lastRead) } b.lastRead = opInvalid return nil }
é˘ć°UnreadRune
ăŤĺ
Ľăă¨ăçść
ăăă§ăăŻăăb.lastRead
ăĺăŽćä˝ăă§ăŞăReadRune
ĺ ´ĺăă¨ăŠăźăăăăŤčżăăăžăăé˘ć°ăŽćŽăăŻăb.lastRead
ăă大ăăĺ¤ăŤĺşăĽăăŚćŠč˝ăopInvalid
ăžăăĺăé˘ć°ă¨ćŻčźăăžăăăĺ˘çćźçŽĺăŻăăăžăăďź func (b *Buffer) UnreadRune() error { if b.lastRead > opInvalid { if b.off >= int(b.lastRead) { b.off -= int(b.lastRead) } b.lastRead = opInvalid return nil } return errors.New("bytes.Buffer: UnreadRune: previous operation was not a successful ReadRune") }
ćĺăăĺŻč˝ć§ăéŤăăăŠăłăăŽćŹä˝ăŻćĺăŽćĄäťśăŤĺăčžźăžăăçľäşăăŠăąăăăć
éăŤä¸č´ăăăăă¨ăŤăăif
ăćĺăăçľäşăŽćĄäťśăreturn nil
ć¤ĺşăăĺż
čŚăăăăžăăé˘ć°ăŽćĺžăŽčĄăŻă¨ăŠăźăčżăăăăŤăŞăŁăăăă寞ĺżăăéĺ§ăăŠăąăăăžă§é˘ć°ăŽĺŽčĄă追补ăăŚăăăŽăă¤ăłăăŤĺ°éăăćšćłăčŚă¤ăăĺż
čŚăăăăžăăăăŽăŞăăˇă§ăłăŻčŞăżăŤăăăăăăăă°ăŠăăłă°ă¨ăłăźăăľăăźăăŽĺ質ăä˝ä¸ăăăăăGoăŻĺć掾éă§ĺ˘çćźçŽĺă使ç¨ăăŚă¨ăŠăźăčżăăă¨ă弽ăżăžăă4.4ă nullĺ¤ăćç¨ăŤăă
ĺĺ¤ć°ĺŽŁč¨ăŻăć示çăŞĺćĺĺăăŞăă¨äťŽĺŽăăă¨ăăźăĺăăăăĄă˘ăŞăŽĺ
厚ăŤĺŻžĺżăăĺ¤ăă¤ăžăzeroă§čŞĺçăŤĺćĺăăăžăăĺ¤ăŽăżă¤ăăŻăć°ĺ¤ăżă¤ăăŽĺ ´ĺ-ăźăăăă¤ăłăżăźăżă¤ăăŽĺ ´ĺ-nilăăšăŠă¤ăšăăăăăăăăłăăŁăăŤă§ăĺăăŞăăˇă§ăłăŽăăăăăŤăăŁăŚćąşĺŽăăăžăăć˘çĽăŽăăăŠăŤăĺ¤ă常ăŤč¨ĺŽăăćŠč˝ăŻăăăă°ăŠă ăŽăťăăĽăŞăăŁă¨ćŁç˘şć§ăŤă¨ăŁăŚéčŚă§ăăăGoăăă°ăŠă ăăăç°Ąĺăă¤ăłăłăăŻăăŤăăăă¨ăă§ăăžăăăăăŻăGoăŽăăă°ăŠăăźăăć§é ăŤćç¨ăŞăźăĺ¤ăä¸ăăăă¨č¨ăă¨ăăŤĺżľé ăŤç˝ŽăăŚăăăă¨ă§ăăăăĽăźăăăŻăšăŽĺ
é¨çść
ă襨ă2ă¤ăŽć´ć°ăăŁăźăŤăăĺŤăĺsync.Mutex
ăčăăžăăăăăăŽăăŁăźăŤăăŻă厣č¨ă§čŞĺçăŤnullĺ¤ăĺăăžăsync.Mutex
ăăăŽäşĺŽăŻăłăźăĺ
ă§čć
ŽăăăăăăăăŽăżă¤ăăŻć示çăŞĺćĺăŞăă§ăŽä˝żç¨ăŤéŠăăŚăăžăă type MyInt struct { mu sync.Mutex val int } func main() { var i MyInt
äžżĺŠăŞnullĺ¤ăćă¤ĺăŽĺĽăŽäžăŻbytes.Buffer
ă§ăăć示çăŤĺćĺăăăă¨ăŞăă厣č¨ăăŚć¸ăčžźăżăéĺ§ă§ăăžăă func main() { var b bytes.Buffer b.WriteString("Hello, world!\n") io.Copy(os.Stdout, &b) }
ăăŽć§é ăŽăźăĺ¤ăŻălen
严ćšcap
ăçăăăă¨0
ăăăăły array
ďźăăăŻă˘ăăăšăŠă¤ăšé
ĺăŽĺ¤ăćă¤ăĄă˘ăŞă¸ăŽăă¤ăłăżďźăćĺłăăžănil
ăă¤ăžăăć示çăŤăŤăăăăĺż
čŚăŻăŞăăĺç´ăŤĺŽŁč¨ă§ăăžăă func main() {
ă注ć var s []string
ä¸é¨ăŽ2čĄăŽăłăĄăłăčĄă¨äźźăŚăăžăăăĺä¸ă§ăŻăăăžăăănilăŽăšăŠă¤ăšĺ¤ă¨éˇăăźăăŽăšăŠă¤ăšĺ¤ăŤăŻéăăăăăžăă揥ăŽăłăźăăŻfalseăĺşĺăăžăă
func main() { var s1 = []string{} var s2 []string fmt.Println(reflect.DeepEqual(s1, s2)) }
ĺćĺăăăŚăăŞăăă¤ăłăżăźĺ¤ć°ăŽćç¨ăŞăăă ăäşćăăŞăăăăăăŁ-nil pointers-ăŻănilă§ăăĺăŽăĄă˝ăăăĺźăłĺşăćŠč˝ă§ăăăăă使ç¨ăăŚăăăăŠăŤăĺ¤ăç°ĄĺăŤćäžă§ăăžăă type Config struct { path string } func (c *Config) Path() string { if c == nil { return "/usr/home" } return c.path } func main() { var c1 *Config var c2 = &Config{ path: "/export", } fmt.Println(c1.Path(), c2.Path()) }
4.5ăăăăąăźă¸ăŹăăŤăŽçść
ăéżăă
ĺźąăćĽçśăăăăľăăźăăăăăăăă°ăŠă ăä˝ćăăéľăŻă1ă¤ăŽăăăąăźă¸ăĺ¤ć´ăăŚăăćĺăŽăăăąăźă¸ăŤç´ćĽäžĺăăŞăĺĽăŽăăăąăźă¸ăŤĺ˝ąéżăä¸ăăĺŻč˝ć§ăä˝ăăă¨ă§ăăGoă§ĺźąăćĽçśăĺŽçžăăăŤăŻă2ă¤ăŽĺŞăăćšćłăăăăžăă- ă¤ăłăżăźăă§ă¤ăšă使ç¨ăăŚăé˘ć°ăžăăŻăĄă˝ăăăŤĺż
čŚăŞĺä˝ăč¨čż°ăăžăă
- ă°ăăźăăŤçść
ăéżăăŚăă ăăă
Goă§ăŻăé˘ć°ăžăăŻăĄă˝ăăăŽăšăłăźăĺ
ăăăłăăăąăźă¸ăŽăšăłăźăĺ
ă§ĺ¤ć°ă厣č¨ă§ăăžăă大ćĺăŽčĺĽĺăćă¤ĺ¤ć°ăĺ
ŹéăăăŚăăĺ ´ĺăăăŽăšăłăźăăŻĺŽéăŤăŻăăă°ăŠă ĺ
¨ä˝ă§ă°ăăźăăŤă§ăăăăăąăźă¸ăŻăă¤ă§ăăăŽĺ¤ć°ăŽăżă¤ăă¨ĺ
厚ăĺç
§ăăžăăă°ăăźăăŤĺ¤ć°ăŻăăă°ăŠă ĺ
ăŽĺé˘ć°ăŽçŽăŤčŚăăŞăăăŠăĄăźăżăźăŤăŞăăăăĺŻĺ¤ă°ăăźăăŤçść
ăŻăăă°ăŠă ăŽçŹçŤăăé¨ĺéăŽĺŻćĽăŞé˘äżăćäžăăžăďźă°ăăźăăŤĺ¤ć°ăŤäžĺăăé˘ć°ăŻăăăŽĺ¤ć°ăŽĺăĺ¤ć´ăăăă¨éĺăăĺŻč˝ć§ăăăăžăăă°ăăźăăŤĺ¤ć°ăŽçść
ăŤäžĺăăé˘ć°ăŻăăăă°ăŠă ăŽĺĽăŽé¨ĺăăăŽĺ¤ć°ăĺ¤ć´ăăă¨éĺăăĺŻč˝ć§ăăăăžăăă°ăăźăăŤĺ¤ć°ăä˝ćăăćĽçśăć¸ăăćšćłďź- 寞ĺżăăĺ¤ć°ăăăŁăźăŤăă¨ăăŚăăăăăĺż
čŚă¨ăăć§é ăŤç§ťĺăăžăă
- ă¤ăłăżăźăă§ă¤ăšă使ç¨ăăŚăĺä˝ă¨ăăŽĺä˝ăŽĺŽčŁ
ă¨ăŽé˘äżăć¸ăăăžăă
5.ăăă¸ă§ăŻăăŽć§é
ăăăąăźă¸ăăăă¸ă§ăŻăăŤçľĺăăćšćłăŤă¤ăăŚčŞŹćăăžăăăăăăăŻé常ăĺä¸ăŽGităŞăă¸ăăŞă§ăăăăăąăźă¸ă¨ĺć§ăŤăĺăăă¸ă§ăŻăăŤăŻć確ăŞçŽć¨ăĺż
čŚă§ăăăŠă¤ăăŠăŞăŽĺ ´ĺăXML解ćăă¸ăŁăźăăŞăłă°ăŞăŠă1ă¤ăŽăă¨ăčĄăĺż
čŚăăăăžăă1ă¤ăŽăăă¸ă§ăŻăă§č¤ć°ăŽçŽć¨ăçľăżĺăăăŚăŻăăăžăăăăăăŻćăăăăŠă¤ăăŠăŞăźăéżăăăŽăŤĺ˝šçŤăĄăžăcommon
ăĺč°äźăç§ăŽçľé¨ă§ăŻăăŞăă¸ăăŞăŻcommon
ćçľçăŤć大ăŽćśč˛ťč
ă¨ĺŻćĽăŤé˘éŁăăŚăăăăcommon
ăăăăăŻćŽľéă§ćśč˛ťč
ă¨ć´ć°č
ăŽä¸Ąćšăć´ć°ăăăŤäťĽĺăŽăăźă¸ă§ăłăŽäżŽćŁďźăăăŻăăźă俎ćŁďźăčĄăăă¨ăŻéŁăăăĺ¤ăăŽçĄé˘äżăŞĺ¤ć´ăçşçăăéä¸ă§ĺŁăăžăAPI
ă˘ăăŞăąăźăˇă§ăłďźWebă˘ăăŞăąăźăˇă§ăłăKubernetesăłăłăăăźăŠăźăŞăŠďźăăăĺ ´ĺăăăă¸ă§ăŻăăŤăŻ1ă¤äťĽä¸ăŽăĄă¤ăłăăăąăźă¸ăăăĺ ´ĺăăăăžăăăă¨ăă°ăKubernetesăłăłăăăźăŠăźăŤăŻcmd/contour
ăKubernetesăŻăŠăšăżăźăŤĺąéăăăăľăźăăźă¨ăăŚăăăăłăăăă°ăŻăŠă¤ă˘ăłăă¨ăăŚćŠč˝ăăăăăąăźă¸ă1ă¤ăăăžăă5.1ă ĺ°ăŞăăăăąăźă¸ăăăă大ăă
ăłăźăăŹăăĽăźă§ăäťăŽč¨čŞăăGoăŤĺăćżăăăăă°ăŠăăŽĺ
¸ĺçăŞééăăŽ1ă¤ăŤć°äťăăžăăă彟ăăŻăăăąăźă¸ăäšąç¨ăăĺžĺăăăăžăăGoă§ăŻăčŚčŞć§ăŽç˛žĺˇ§ăŞăˇăšăă ăćäžăăŚăăžăăďźč¨čŞăŻăJavaďźăŽăăăŤĺĺăŞă˘ăŻăťăšäżŽéŁžĺă§ăŻăăăžăăpublic
ăprotected
ăprivate
ăăăłćéťçdefault
ďźăC ++ăŽăăŹăłăăŞăźăŞăŻăŠăšăŽéĄäźźçŠăŻăăăžăăăGoăŤăŻă2ă¤ăŽă˘ăŻăťăšäżŽéŁžĺăăăăăžăăăăăăăŻăăăŞăăŻčĺĽĺă¨ăăŠă¤ăăźăčĺĽĺă§ăčĺĽĺăŽćĺăŽćĺďźĺ¤§ćĺ/ĺ°ćĺďźă§ç¤şăăăžăăčĺĽĺăăăăŞăăŻăŽĺ ´ĺăăăŽĺĺăŻĺ¤§ćĺă§ĺ§ăžăăäťăŽGoăăăąăźă¸ăŻăăăĺç
§ă§ăăžăăă注ć ăă¨ăŻăšăăźăăăăăăžăăŻăă¨ăŻăšăăźăăăăŚăăŞăăă¨ăăč¨čăŻăăăăŞăăŻăăăłăăŠă¤ăăźăăŽĺ瞊čŞă¨ăăŚčăăăžăă
ă˘ăŻăťăšĺśĺžĄćŠč˝ăĺśéăăăŚăăĺ ´ĺăé庌ăŤč¤éăŞăăăąăźă¸é幤ăĺéżăăăăăŤăŠăŽăăăŞćšćłă使ç¨ă§ăăžăăďźĺč°äźăăé¤ăăăšăŚăŽăăăąăźă¸ă§cmd/
ăinternal/
ă˝ăźăšăłăźăăĺĺ¨ăăĺż
čŚăăăăžăă
ç§ăŻăăă大ăăŞĺ¤§ăăăăąăăă弽ăžăŞăćšăčŻăă¨çš°ăčżăč¨ăŁăŚăăžăăăăăăŠăŤăăŽä˝ç˝ŽăŻăć°ăăăăăąăźă¸ăä˝ćăăŞăăă¨ă§ăăăăăŤăăăĺ
Źéăăăĺăĺ¤ăăăŚă使ç¨ĺŻč˝ăŞAPIăŽçŻĺ˛ăĺşăăŞăăĺ°ăăăŞăăžăă䝼ä¸ă§ăŻăăăŽčŤćăăăăŤčŠłăăć¤č¨ăăžăăĺč°äźăJavaăăćĽăžăăăďź
JavaăžăăŻCďźăŽä¸çăăćĽăĺ ´ĺăŻăćéťăŽăŤăźăŤăčŚăăŚăăăŚăă ăăăJavaăăăąăźă¸ăŻĺä¸ăŽă˝ăźăšăăĄă¤ăŤăŤç¸ĺ˝ăăžă.go
ăGoăăăąăźă¸ăŻăMavenă˘ă¸ăĽăźăŤĺ
¨ä˝ăžăăŻ.NETă˘ăťăłăăŞă¨ĺçă§ăă
5.1.1ăă¤ăłăăźăćé ă使ç¨ăăŚăăĄă¤ăŤăă¨ăŤăłăźăăă˝ăźăăă
ăľăźăăšăă¨ăŤăăăąăźă¸ăć´çăăĺ ´ĺăăăăąăźă¸ĺ
ăŽăăĄă¤ăŤăŤĺŻžăăŚĺăăă¨ăčĄăĺż
čŚăăăăžăăďź1ă¤ăŽăăĄă¤ăŤ.go
ăč¤ć°ăŤĺĺ˛ăăăżă¤ăăłă°ăçĽăćšćłăŻďźčĄăéăăŚăăăĄă¤ăŤăŽăăźă¸ăŤă¤ăăŚčăăĺż
čŚăăăĺ ´ĺăăŠăŽăăăŤăăăăžăăďźç§ă使ç¨ăăć¨ĺĽ¨äşé
ăŻćŹĄăŽă¨ăăă§ăă- 1ă¤ăŽăăĄă¤ăŤă§ĺăăăąăźă¸ăéĺ§ăăžă
.go
ăăăŽăăĄă¤ăŤăŤăăŁăŹăŻăăŞă¨ĺăĺĺăäťăăžăăăă¨ăă°ăăăăąăźă¸http
ăŻhttp.go
ăăŁăŹăŻăăŞĺ
ăŽăăĄă¤ăŤăŤăăĺż
čŚăăăăžăhttp
ă
- ăăăąăźă¸ă大ăăăŞăă¨ăăăžăăžăŞćŠč˝ăăăă¤ăăŽăăĄă¤ăŤăŤĺĺ˛ă§ăăžăăăă¨ăă°ăăăĄă¤ăŤ
messages.go
ăŤăŻăżă¤ăRequest
ă¨Response
ăăăĄă¤ăŤclient.go
ăżă¤ăClient
ăăăĄă¤ăŤserver.go
ăżă¤ăăľăźăăźăĺŤăžăăžăă
- , . , .
- . ,
messages.go
HTTP- , http.go
, client.go
server.go
â HTTP .
. .
ă注ć Go . ( â Go). .
5.1.2.
ăăŽăăźăŤgo
ăŻătesting
2ă¤ăŽĺ ´ćă§ăăăąăźă¸ăăľăăźăăăžăăăăăąăźă¸http2
ăăăĺ ´ĺăŻăăăĄă¤ăŤhttp2_test.go
ăč¨čż°ăăŚăăăąăźă¸ĺŽŁč¨ă使ç¨ă§ăăžăhttp2
ăăăăŻăăłăźăăăłăłăă¤ăŤăhttp2_test.go
ăă¨ăăŚăăăŻăăăąăźă¸ăŽä¸é¨ă§ăhttp2
ăĺŁčŞéłĺŁ°ă§ăŻăăăŽăăăŞăăšăăŻĺ
é¨ă¨ĺźă°ăăžăăăăŽăăźăŤgo
ăŻătestă§çľăăçšĺĽăŞăăăąăźă¸ĺŽŁč¨ăăľăăźăăăŚăăžăhttp_test
ăăăăŤăăăăăšăăăĄă¤ăŤăŻăłăźăă¨ĺăăăăąăźă¸ăŤĺĺ¨ă§ăăžăăăăăŽăăăŞăăšăăăłăłăă¤ăŤăăăă¨ăăăăăŻăăăąăźă¸ăŽăłăźăăŽä¸é¨ă§ăŻăŞăăçŹčŞăŽăăăąăźă¸ăŤĺĺ¨ăăžăăăăăŤăăăĺĽăŽăăăąăźă¸ăăłăźăăĺźăłĺşăăŚăăăăŽăăăŤăăšăăä˝ćă§ăăžăăăăŽăăăŞăăšăăŻĺ¤é¨ă¨ĺźă°ăăžăăăŚăăăăŚăăăăăšăăŤăŻĺ
é¨ăăšăă使ç¨ăăăă¨ăăĺ§ăăăžăăăăăŤăăăĺćŠč˝ăžăăŻăĄă˝ăăăç´ćĽăăšăă§ăăĺ¤é¨ăăšăăŽĺŽĺ丝瞊ăĺéżă§ăăžăăăă ăăăăšăé˘ć°ďźďźăŽäžăĺ¤é¨ăăšăăăĄă¤ăŤăŤé
罎ăăĺż
čŚăăăăžăExample
ăăăăŤăăăgodocă§čĄ¨ç¤şăăă¨ăăŤăăľăłăăŤăéŠĺăŞăăăąăźă¸ăăŹăăŁăăŻăšăĺăĺăăç°ĄĺăŤăłăăźă§ăăăăăŤăŞăăžăă. , .
, , Go go
. , net/http
net
.
.go
, , .
5.1.3. , API
ăăă¸ă§ăŻăăŤč¤ć°ăŽăăăąăźă¸ăăăĺ ´ĺăăăăŞăăŻAPIç¨ă§ăŻăŞăăäťăŽăăăąăźă¸ă§ä˝żç¨ăăăă¨ăçŽçă¨ăăă¨ăŻăšăăźăé˘ć°ăčŚă¤ăăĺ ´ĺăăăăžăăăăŽçśćłă§ăŻăăăźăŤăŻăăăă¸ă§ăŻăăŤĺŻžăăŚéăăŚăăăäťăŽăŚăźăśăźăŤăŻéăăăăŚăăăłăźăăé
罎ăăăăăŤä˝żç¨ă§ăăgo
çšĺĽăŞăăŠăŤăăźĺinternal/
ăčŞčăăžăăăăŽăăăŞăăăąăźă¸ăä˝ćăăăŤăŻăĺĺăŽäťăăinternal/
ăăŁăŹăŻăăŞăžăăŻăăŽăľăăăŁăŹăŻăăŞăŤé
罎ăăžăăăăźă go
ăŻăăăšăĺŤăăăăąăźă¸ăŽă¤ăłăăźăăinternal
確čŞăăă¨ăăăŁăŹăŻăăŞăžăăŻăľăăăŁăŹăŻăăŞĺ
ăŽĺźăłĺşăăăăąăźă¸ăŽĺ ´ćă確čŞăăžăinternal/
ăăă¨ăă°ăăăăąăźă¸.../a/b/c/internal/d/e/f
ăŻăăŁăŹăŻăăŞăăŞăźăăăăăąăźă¸ăŽăżăă¤ăłăăźăă§ăăžăă.../a/b/c
ăăžăŁăă.../a/b/g
ăžăăŻäťăŽăŞăă¸ăăŞăŻă¤ăłăăźăă§ăăžăăďźĺç
§ăăăĽăĄăłăďźă5.2ă ćĺ°ăŽăĄă¤ăłăăăąăźă¸
é˘ć°main
ă¨ăăăąăźă¸main
ăŻmain.main
ăăˇăłă°ăŤăăłăŽăăăŤćŠč˝ăăăăăćĺ°éăŽćŠč˝ăĺăăŚăăĺż
čŚăăăăžăăăăă°ăŠă ăŻmain
ăăăšăăĺŤăăŚ1ă¤ăŽé˘ć°ăŽăżăćă¤ăă¨ăă§ăăžăăăămain.main
ăŻăˇăłă°ăŤăăłă§ăăăăăĺźăłĺşăăăăŞăă¸ă§ăŻăăŤăŻĺ¤ăăŽĺśéăăăăžăăăăăăŻămain.main
ăžăăŻmain.init
ăăăăłä¸ĺşŚă ăĺźăłĺşăăăžăăăăăŤăăăăłăźăăŽăăšăăŽä˝ćăĺ°éŁăŤăŞămain.main
ăžăăăăăăŁăŚăĺŻč˝ăŞéăĺ¤ăăŽăă¸ăăŻăăĄă¤ăłé˘ć°ăăăçćłçăŤăŻăĄă¤ăłăăăąăźă¸ăăĺ°ĺşăăăăĺŞĺăăĺż
čŚăăăăžăăĺč°äźăfunc main()
ăăŠă°ăĺćăăăăźăżăăźăšăăăŹăźăŞăŠă¸ăŽćĽçśăéăăĺŽčĄăéŤăŹăăŤăŽăŞăă¸ă§ăŻăăŤčť˘éăăĺż
čŚăăăăžăă
6. APIć§é
ăăă¸ă§ăŻăč¨č¨ăŤé˘ăăćĺžăŽă˘ăăă¤ăšăŻăćăéčŚă ă¨ćăăžăăĺăŽćăŻăăšăŚăĺĺă¨ăăŚććĺăŻăăăžăăăăăăăŻăĺäşşçăŞçľé¨ăŤĺşăĽăăĺăŞăć¨ĺĽ¨äşé
ă§ăăăăăăŽć¨ĺĽ¨äşé
ăăłăźăăŹăăĽăźăŤăăžăćźăčžźăżăžăăăăăă§ăŻăĺžćšäşćć§ăćăŞăăă¨ăŞăäťăŽăăšăŚă俎ćŁă§ăăăăăă¨ăŠăźăŻăă桹ĺťăŤćąăăăžăďźăťă¨ăăŠăŽĺ ´ĺăăăăăŻĺăŞăĺŽčŁ
ăŽčŠłç´°ă§ăăăăăŞăăŻAPIăŤé˘ăăŚăŻăćĺăŽćŽľéăăć§é ăçĺŁăŤć¤č¨ăă䞥ĺ¤ăăăăžăăĺžçśăŽĺ¤ć´ăŻăŚăźăśăźăŤă¨ăŁăŚç ´ĺŁçăŞăăŽăŤăŞăăăă§ăă6.1ă č¨č¨ä¸ćŞç¨ăăŤăăAPIăč¨č¨ăă
ÂŤAPIăŻăăéŠĺăŞä˝żç¨ăŽăăăŽăăˇăłăăŤă§ćŞç¨ăăăă¨ăŻĺ°éŁă§ăăăšă - ă¸ă§ăˇăĽăťăăăă
Josh BlochăŽă˘ăăă¤ăšăŻăăăăăăăŽč¨äşă§ćă䞥ĺ¤ăăăăžăăAPIăĺç´ăŞăăŽăŤä˝żç¨ăăăŽăéŁăăĺ ´ĺăăăšăŚăŽAPIĺźăłĺşăăŻĺż
čŚäťĽä¸ăŤč¤éăŤăŞăăžăăAPIĺźăłĺşăăč¤éă§ćç˝ă§ăŞăĺ ´ĺăčŚč˝ă¨ăăăĺŻč˝ć§ăăăăžăă6.1.1ăĺăăżă¤ăăŽč¤ć°ăŽăăŠăĄăźăżăźăĺăĺ
Ľăăé˘ć°ăŤăŻćł¨ćăăŚăă ăăă
ä¸čŚăˇăłăăŤă§ăăăAPIăŽä˝żç¨ăéŁăăäžă¨ăăŚăĺăăżă¤ăăŽ2ă¤äťĽä¸ăŽăăŠăĄăźăżăźăĺż
čŚăŞĺ ´ĺăăăăžăă2ă¤ăŽé˘ć°ăˇă°ăăăŁăćŻčźăăžăă func Max(a, b int) int func CopyFile(to, from string) error
ăăă2ă¤ăŽćŠč˝ăŽéăăŻä˝ă§ăăďźćăăăŤă1ă¤ăŻć大2ă¤ăŽć°ĺ¤ăčżăăăă1ă¤ăŻăăĄă¤ăŤăăłăăźăăžăăăăăăăăăŻăă¤ăłăă§ăŻăăăžăăă Max(8, 10)
MaxăŻĺŻćă§ăăăăŠăĄăźăżăźăŽé ĺşăŻéčŚă§ăŻăăăžăăă8ă¨10ăăžăăŻ10ă¨8ăćŻčźăăăăŠăăăŤé˘äżăŞăăć大8ă¨10ăŻ10ă§ăăăăăăCopyFileăŽĺ ´ĺăăăăŻăăă§ăŻăăăžăăă CopyFile("/tmp/backup", "presentation.md") CopyFile("presentation.md", "/tmp/backup")
ăăăăŽăŞăăŹăźăżăźăŽăăĄăăăŹăźăłăăźăˇă§ăłăăăăŻă˘ăăăăăŞăăŹăźăżăźă¨ăĺ
éąăŽăăźă¸ă§ăłă§ä¸ć¸ăăăăŞăăŹăźăżăźăŻčŞ°ă§ăăďźăăăĽăĄăłăă確čŞăăăžă§ăăăăžăăăăłăźăăŽăŹăăĽăźä¸ăŤăĺźć°ăŽé ĺşăćŁăăăăŠăăăŻä¸ćă§ăăăăä¸ĺşŚăăăăĽăĄăłăăčŚăŚăă ăăă1ă¤ăŽĺŻč˝ăŞč§ŁćąşçăŻćŁăăĺźăłĺşăăŤč˛ŹäťťăăăčŁĺŠăżă¤ăăĺ°ĺ
Ľăăăă¨ă§ăCopyFile
ă type Source string func (src Source) CopyTo(dest string) error { return CopyFile(dest, string(src)) } func main() { var from Source = "presentation.md" from.CopyTo("/tmp/backup") }
ăăă§ăŻCopyFile
常ăŤćŁăăĺźăłĺşăăăžă-ăăăŻĺä˝ăăšăă使ç¨ăăŚćĺŽă§ăăžă-ăăŠă¤ăăźăăŤăăăă¨ăă§ăăăăăŤăăä¸ćŁä˝żç¨ăŽĺŻč˝ć§ăăăăŤć¸ĺ°ăăžăăĺč°äźăĺăăżă¤ăăŽč¤ć°ăŽăăŠăĄăźăżăźăćă¤APIăćŁăă使ç¨ăăăă¨ăŻĺ°éŁă§ăă
6.2ă ĺşćŹçăŞăŚăźăšăąăźăšç¨ăŽAPIăč¨č¨ăă
ć°ĺš´ĺăŤç§ăä¸ăăăăŹăźăłăăźăˇă§ăłă使ç¨ăăăă¨ăŤăćŠč˝ăŞăăˇă§ăłăŽăăăŠăŤăă¸ăŽĺŽšćăŞAPIăä˝ăăă¨ăăăŹăźăłăăźăˇă§ăłăŽćŹčłŞăŻă丝ăŞăŚăźăšăąăźăšç¨ăŽAPIăéçşăăĺż
čŚăăăă¨ăăăă¨ă§ăăăč¨ăćăăă°ăAPIăŻăăŚăźăśăźăčĺłăŽăŞăčż˝ĺ ăŽăăŠăĄăźăżăźăćäžăăăă¨ăăŚăźăśăźăŤčŚćąăăăšăă§ăŻăăăžăăă6.2.1ăăăŠăĄăźăżă¨ăăŚnilă使ç¨ăăăă¨ăŻć¨ĺĽ¨ăăăžăă
ăžăăăŚăźăśăźăŤčĺłăŽăŞăAPIăăŠăĄăźăżăźăćäžăăăăăŤĺźˇĺśăăăšăă§ăŻăŞăă¨č¨ăăă¨ăăĺ§ăăžăăăăăăŻăžăă丝ăŞăŚăźăšăąăźăšç¨ăŽAPIăč¨č¨ăăăă¨ăćĺłăăžăďźăăăŠăŤăăŞăăˇă§ăłďźănet / httpăăăąăźă¸ăŽäžă揥ăŤç¤şăăžăă package http
ListenAndServe
2ă¤ăŽăăŠăĄăźăżăźăĺăĺ
Ľăăžăăç俥ćĽçśăăŞăăšăłăăăăăŽTCPă˘ăăŹăšă¨http.Handler
ăç俥HTTPăŞăŻă¨ăšăăĺŚçăăăăăŽTCPă˘ăăŹăšă§ăăServe
2çŞçŽăŽăăŠăĄăźăżăăŤăăăă¨ăă§ăăžănil
ăăłăĄăłăă§ăŻăé常ăĺźăłĺşăĺ
ăŽăŞăă¸ă§ăŻăăĺŽéăŤć¸ĄăăăćéťçăŞăăŠăĄăźăżăźă¨ăăŚnil
使ç¨ăăăă¨http.DefaultServeMux
ă示ăăŚăăăă¨ăŤćł¨ćăăŚăă ăăăĺźăłĺşăĺ
Serve
ăŤăŻăĺăăă¨ăčĄă2ă¤ăŽćšćłăăăăžăă http.ListenAndServe("0.0.0.0:8080", nil) http.ListenAndServe("0.0.0.0:8080", http.DefaultServeMux)
严ćšăŽăŞăăˇă§ăłăŻĺăăă¨ăăăžăăăăŽă˘ăăŞăąăźăˇă§ăłnil
ăŻăŚă¤ăŤăšăŽăăăŤĺşăăăžăăăăăąăźă¸ăŤhttp
ăŻăăŤăăźăĺŤăžăăŚăăhttp.Serve
ăăăé˘ć°ăŽć§é ăćłĺă§ăăžăListenAndServe
ă func ListenAndServe(addr string, handler Handler) error { l, err := net.Listen("tcp", addr) if err != nil { return err } defer l.Close() return Serve(l, handler) }
ăŽă§ListenAndServe
ăçşäżĄč
ăééăăăă¨ăĺŻč˝ăŤăănil
äşçŞçŽăŽăăŠăĄăźăżăŽăăăŤăhttp.Serve
ăžăăăăŽĺä˝ăăľăăźăăăŚăăžăăĺŽéăhttp.Serve
ăăăłăăŠăçăăĺ ´ĺăŻnil
ă使ç¨ăăDefaultServeMux
ăĺŽčŁ
ăăăŚăăăă¸ăăŻăŤăăăžăănil
1ă¤ăŽăăŠăĄăźăżăźăĺăĺ
Ľăăă¨ăĺźăłĺşăĺ´nil
ăŻä¸ĄćšăŽăăŠăĄăźăżăźăŤć¸Ąăăă¨ăă§ăăă¨čăăăăăŤăŞăăžăăăăăăăăŽăăăŞServe
http.Serve(nil, nil)
ćăăăăăăăŻăŤă¤ăŞăăăžăăĺč°äźăĺăé˘ć°ăˇă°ăăăŁăăŠăĄăźăżăŤćˇˇĺ¨ăăăŞăă§ăă ăănil
ă¨ăăăžăănil
ă
čč
http.ListenAndServe
ăŻăăăăŠăŤăăŽĺ ´ĺăŽAPIăŚăźăśăźăŽçć´ťăç°Ąç´ ĺăăăă¨ăăžăăăăăťăăĽăŞăăŁăŤĺ˝ąéżăăăăžăăăĺĺ¨ăăĺ ´ĺănil
ć示ç使ç¨ă¨éćĽä˝żç¨ăŽéă§čĄć°ăŤéăăŻăăăžăăDefaultServeMux
ă const root = http.Dir("/htdocs") http.Handle("/", http.FileServer(root)) http.ListenAndServe("0.0.0.0:8080", nil)
ă¨ćŻčźă㌠const root = http.Dir("/htdocs") http.Handle("/", http.FileServer(root)) http.ListenAndServe("0.0.0.0:8080", http.DefaultServeMux)
1čĄăçśćăăăă¨ăŻćˇˇäšąăŽäžĄĺ¤ăăăăžăăăďź const root = http.Dir("/htdocs") mux := http.NewServeMux() mux.Handle("/", http.FileServer(root)) http.ListenAndServe("0.0.0.0:8080", mux)
ĺč°äźăăăŤăăźé˘ć°ăăăă°ăŠăăźăăŠăă ăçŻç´ăăăăçĺŁăŤčăăŚăă ăăăć忍ăăŻç°Ąć˝ăăăăĺŞăăŚăăžăă
ĺč°äźăăăšăăŽăżăĺż
čŚă¨ăăăăŠăĄăźăżăźăćă¤ăăăŞăăŻAPIăŻéżăăŚăă ăăăăăšăä¸ăŤăŽăżĺ¤ăç°ăŞăăăŠăĄăźăżăźăćă¤APIăă¨ăŻăšăăźăăăŞăă§ăă ăăă䝣ăăăŤăăăŽăăăŞăăŠăĄăźăżăźăŽčť˘éăé ăăŠăăăźé˘ć°ăă¨ăŻăšăăźăăăăăšăă§ăŻăăăšăăŤĺż
čŚăŞĺ¤ă渥ăĺć§ăŽčŁĺŠé˘ć°ă使ç¨ăăžăă
6.2.2ă[] TăŽäťŁăăăŤĺŻĺ¤éˇĺźć°ă使ç¨ăăžă
ĺ¤ăăŽĺ ´ĺăé˘ć°ăžăăŻăĄă˝ăăăŻĺ¤ăŽăšăŠă¤ăšăĺăĺăăžăă func ShutdownVMs(ids []string) error
ăăăŻĺăŞăć§ćäžă§ăăăăăăŻé常ăŤä¸čŹçă§ăăĺéĄăŻăăăăăŽç˝˛ĺăč¤ć°ăŽăŹăłăźăă§ĺźăłĺşăăăăă¨ăĺćă¨ăăŚăăăă¨ă§ăăçľé¨ă示ăăăăŤăăăăăŻăă°ăă°1ă¤ăŽĺźć°ăŽăżă§ĺźăłĺşăăăé˘ć°ăˇă°ăăăŁăŽčŚäťśăćşăăăăăŤăšăŠă¤ăšĺ
ăŤăăăăŻăăăĺż
čŚăăăăžăăăăăŤăăăŠăĄăźăżăźids
ăŻăšăŠă¤ăšă§ăăăăă犺ăŽăšăŠă¤ăšăžăăŻăźăăé˘ć°ăŤć¸Ąăăă¨ăă§ăăăłăłăă¤ăŠăźăŻćşčśłăăžăăăăšăă§ăŻăăŽăăăŞăąăźăšăăŤăăźăăĺż
čŚăăăăăăăăăŤăăăăšăăŽč˛ ć
ăĺ˘ăăžăăăăŽăăăŞAPIăŻăŠăšăŽäžăćăăăăăŤăćčżăĺ°ăŞăă¨ă1ă¤ăŽăăŠăĄăźăżăźăăźă䝼ĺ¤ăŽĺ ´ĺăŤăăă¤ăăŽčż˝ĺ ăăŁăźăŤăăŽă¤ăłăšăăźăŤăĺż
čŚă¨ăăăă¸ăăŻăăŞăăĄăŻăżăŞăłă°ăăžăăăăă¸ăăŻăŻćŹĄăŽăăăŤăŞăăžăăă if svc.MaxConnections > 0 || svc.MaxPendingRequests > 0 || svc.MaxRequests > 0 || svc.MaxRetries > 0 {
ćźçŽĺăif
é常ăŤéˇăăŞăŁăăăăć¤č¨źăă¸ăăŻăĺĽăŽé˘ć°ăŤĺźăčžźăżăăă¨ćăăžăăăăăăŤç§ăćăă¤ăăăăŽăăăăžăďź
ăăăŤăăă厤ĺ
ăŚăăăăĺŽčĄăăăćĄäťśăć確ăŤčż°ăšăăă¨ăă§ăăžăăă if anyPositive(svc.MaxConnections, svc.MaxPendingRequests, svc.MaxRequests, svc.MaxRetries) {
ăă ăăăŤăŻĺéĄăăăanyPositive
ă誰ăă誤ăŁăŚćŹĄăŽăăăŤĺźăłĺşăăă¨ăă§ăăžăă if anyPositive() { ... }
ăăŽĺ ´ĺăanyPositive
ăčżăfalse
ăžăăăăăŻććŞăŽăŞăăˇă§ăłă§ăŻăăăžăăăĺźć°ăăŞăĺ ´ĺăŤanyPositive
čżătrue
ăăĺ ´ĺăŻăăăŤćŞăăăă ăăanyPositiveăŽăˇă°ăăăŁăĺ¤ć´ăăŚăĺźăłĺşăĺ
ăŤĺ°ăŞăă¨ă1ă¤ăŽĺźć°ă渥ăăăăăăŤăăćšăăăă§ăăăăăăăŻăé常ăŽĺźć°ă¨ĺŻĺ¤éˇĺźć°ďźvarargsďźăŽăăŠăĄăźăżăźăçľăżĺăăăăă¨ă§ĺŽčĄă§ăăžăă
ăăă§anyPositive
ă1ă¤ćŞćşăŽĺźć°ă§ĺźăłĺşăăă¨ăŻă§ăăžăăă6.3ă é˘ć°ăŤçŽçăŽĺä˝ăćąşĺŽăăăžăă
Document
ăăŁăšăŻä¸ăŽć§é ăäżĺăăé˘ć°ăä˝ćăăăżăšăŻăä¸ăăăăă¨ăăžăă
ăăĄă¤ăŤăŤSave
ć¸ăčžźăé˘ć°ăć¸ăăă¨ăă§ăăžăăăăăăăăăă¤ăăŽĺéĄăăăăžăă署ĺăŤăăăăăăăŻăźăŻçľçąă§ăăźăżăč¨é˛ăăĺŻč˝ć§ăăŞăăŞăăžăăăăŽăăăŞčŚäťśăĺ°ćĽçťĺ ´ăăĺ ´ĺăé˘ć°ăŽç˝˛ĺăĺ¤ć´ăăĺż
čŚăăăăăăăŻăăšăŚăŽĺźăłĺşăăŞăă¸ă§ăŻăăŤĺ˝ąéżăăžăăăžăăăăŁăšăŻä¸ăŽăăĄă¤ăŤăç´ćĽćä˝ăăăăăăăšăăăăŽăé˘ĺă§ăăăăăăŁăŚăăăŽĺä˝ăć¤č¨źăăăăăŤăăăšăăŻć¸ăčžźăżĺžăŤăăĄă¤ăŤăŽĺ
厚ăčŞăżĺăĺż
čŚăăăăžăăăăăŚăăăăä¸ćăăŠăŤăăźăŤć¸ăčžźăžăăăăŽĺžĺé¤ăăăăă¨ă確čŞăăĺż
čŚăăăăžăăăžăăăă¨ăă°ăăăŁăŹăŻăăŞăŽčŞăżĺăăăăăšăăˇăłăăŞăăŻăŞăłăŻă§ăăăăŠăăăŽç˘şčŞăŞăŠăăŤé˘éŁăăŞăĺ¤ăăŽăĄă˝ăăăĺŽçžŠăăžăăăăŚă署ĺăŽĺ ´ĺDocument
*os.File
Save
Save
f
*os.File
Save
Save
é˘éŁăăé¨ĺă ăă誏ćăăžăă*os.File
ăä˝ăă§ăăžăăďź
ăăŤăă使ç¨ăăŚăio.ReadWriteCloser
ă¤ăłăżăźăă§ă¤ăšăŽĺé˘ăŽĺĺăéŠç¨ăSave
ăăăĄă¤ăŤăŽăăä¸čŹçăŞăăăăăŁă誏ćăăă¤ăłăżăźăă§ă¤ăšă§ĺĺŽçžŠă§ăăžăăăăŽăăăŞĺ¤ć´ăŽĺžăă¤ăłăżăźăă§ă¤ăšăĺŽčŁ
ăăĺăŻăăšăŚio.ReadWriteCloser
䝼ĺăŽĺăŤç˝Žăćăăăă¨ăă§ăăžă*os.File
ăăăăŤăăăĺćăŤăšăłăźăăćĄĺźľăSave
ăăăŠăŽăżă¤ăăŽăĄă˝ăă*os.File
ăăăŽćä˝ăŤé˘éŁăăăăĺźăłĺşăĺ´ăŤć確ăŤăŞăăžăăăăăŚăä˝č
Save
ăŻăăŻăăăăăŽçĄé˘äżăŞăĄă˝ăăăĺźăłĺşăăă¨ăă§ăăžăăă*os.File
ăŞăăŞăă彟ăŻă¤ăłăżăźăă§ăźăšăŽĺžăăŤé ăăŚăăăăio.ReadWriteCloser
ă§ăăăăăăă¤ăłăżăźăă§ă¤ăšĺé˘ăŽĺçăăăăŤćĄĺźľă§ăăžăă珏ä¸ăŤSave
ĺä¸ăŽč˛ŹäťťăŽĺĺăŤĺžăăžăăăłăłăăłăăăă§ăăŻăăăăăŤĺ˝źăć¸ăăă°ăăăŽăăĄă¤ăŤăčŞăăă¨ăŻăăăăăŤăăăžăă-äťăŽăłăźăăŻăăăčĄăăšăă§ăă
ăăăăŁăŚăă¤ăłăżăźăă§ă¤ăšăŽäťć§ăçľăčžźăă§ăSave
ć¸ăčžźăżă¨ăŻăăźăşăčĄăăă¨ăă§ăăžăă珏äşăŤăăšăŹăăăéăăăĄăŤăăşă y Save
ăŻăăăĄă¤ăŤăćä˝ăăĺ˝ćăŽéşçŁă§ăăĺéĄăŻăăŠăŽăăăŞçśćłwc
ă§éăăăăăă§ăăăăŠăăăŻSave
ăĺĺ Close
çĄćĄäťśăăŠăăăćĺăŽĺ ´ĺăŤăŻăăăŻăăăăĽăĄăłăăć¸ăčžźăžăăĺžăŤăăźăżăăšăăŞăźă ăŤčż˝ĺ ăăăĺ ´ĺăăăăăăĺźăłĺşăĺ´ăŤĺéĄăć示ăăžăă
ćéŠăŞăŞăăˇă§ăłăŻio.Writer
ăäżĺăŽăżă使ç¨ăăăăăŤSaveăĺĺŽçžŠăăăšăăŞăźă ă¸ăŽăăźăżăŽć¸ăčžźăżăé¤ăăäťăŽăăšăŚăŽćŠč˝ăăăŞăăŹăźăżăźăäżĺăăăă¨ă§ăăă¤ăłăżăźăă§ă¤ăšăŽĺé˘ăŽĺĺăéŠç¨ăăĺžăćŠč˝ăŻčŚäťśăŽçšă§ăăĺ
ˇä˝çďźSave
ć¸ăčžźăżĺŻč˝ăŞăŞăă¸ă§ăŻăăŽăżăĺż
čŚďźăŤăŞăăćŠč˝ăŽé˘ă§ăŻăăä¸čŹçăŤăŞăăžăăio.Writer
ă7.ă¨ăŠăźĺŚç
ç§ăŻăăă¤ăăŽăăŹăźăłăăźăˇă§ăłăčĄăăăăă°ă§ăăŽăăăăŻăŤă¤ăăŚĺ¤ăăŽă㨠ăć¸ăăăŽă§ăçš°ăčżăăžăăă䝣ăăăŤăă¨ăŠăźĺŚçăŤé˘éŁăăäťăŽ2ă¤ăŽé ĺăŤă¤ăăŚčŞŹćăăžăă7.1ă ă¨ăŠăźčŞä˝ăĺé¤ăăăă¨ăŤăăăă¨ăŠăźĺŚçăŽĺż
čŚć§ăćé¤
ă¨ăŠăźĺŚçć§ćăćšĺăăăăăŤĺ¤ăăŽććĄăăăžăăăăćčŻăŽăŞăăˇă§ăłăŻăăăăăžăŁăăĺŚçăăŞăăă¨ă§ăăă注ćăă¨ăŠăźĺŚçăĺé¤ăăăă¨ăŻč¨ăăžăăăĺŚçăŤă¨ăŠăźăăŞăăăăŤăłăźăăĺ¤ć´ăăăă¨ăăĺ§ăăăžăă
John OsterhoutăŽćčżăŽă˝ăăăŚă§ă˘éçşĺ˛ĺŚăŽćŹăŻăç§ăŤăăŽććĄăăăăăäżăăžăăăăăŁăăżăźăŽ1ă¤ăŤăŻăă¨ăŠăźăçžĺŽăăćé¤ăăăă¨ăăăżă¤ăăŤăäťăăŚăăžăăăăŽă˘ăăă¤ăšăéŠç¨ăăŚăżăžăăăă7.1.1ă čĄć°
ăăĄă¤ăŤĺ
ăŽčĄć°ăăŤăŚăłăăăé˘ć°ăä˝ćăăžăă func CountLines(r io.Reader) (int, error) { var ( br = bufio.NewReader(r) lines int err error ) for { _, err = br.ReadString('\n') lines++ if err != nil { break } } if err != io.EOF { return 0, err } return lines, nil }
ĺăŽăťăŻăˇă§ăłăŽă˘ăăă¤ăšăŤĺžăŁăŚăCountLines
accepts io.Reader
ă§ăŞă*os.File
;ăĺăĺ
Ľăăžăăio.Reader
ăŤăŚăłăăăăłăłăăłăăćäžăăăŽăŻăĺźăłĺşăĺ
ăŽăżăšăŻă§ăăăä˝ćbufio.Reader
ăăăŤăźăĺ
ReadString
ă§ăĄă˝ăăăĺźăłĺşăăŚăăăĄă¤ăŤăŽćĺžăŤĺ°éăăăžă§ăŤăŚăłăżăźăĺ˘ăăăŚăăăčŞăżĺăŁăčĄć°ăčżăăžăăĺ°ăŞăă¨ăăăŽăăăŞăłăźăăć¸ăăăăŽă§ăăăé˘ć°ăŤăŻă¨ăŠăźĺŚçăĺż
čŚă§ăăăă¨ăă°ă揥ăŽăăăŞĺĽĺŚăŞć§é ăăăăžăă _, err = br.ReadString('\n') lines++ if err != nil { break }
ă¨ăŠăźăăă§ăăŻăăĺăŤčĄć°ăĺ˘ăăăžă-ăăăŻĺĽĺŚăŤčŚăăžăăăăŽăăăŤč¨čż°ăăĺż
čŚăăăăŽReadString
ăŻăćščĄćĺăăĺăŤăăĄă¤ăŤăŽçľăăăć¤ĺşăăăă¨ă¨ăŠăźăčżăăăă§ăăăăăŻăăăĄă¤ăŤăŽćĺžăŤć°ăăčĄăăŞăĺ ´ĺăŤçşçăăĺŻč˝ć§ăăăăžăăăăă俎ćŁăăăŤăŻăčĄăŤăŚăłăżăźăŽăă¸ăăŻăĺ¤ć´ăăăŤăźăăçľäşăăĺż
čŚăăăăăŠăăă確čŞăăžăăă注ć ăăŽčŤçăŻăžă ĺŽĺ
¨ă§ăŻăăăžăăăăééăăčŚă¤ăăăă¨ăă§ăăžăăďź
ăă ăăă¨ăŠăźăŽăă§ăăŻăŻĺŽäşăăŚăăžăăăăăĄă¤ăŤăŽçľăăăŤéăăReadString
ă¨ćťăio.EOF
ăžăăăăăŻäşćłăăăçśćłă§ăăăăŽăăăReadString
ăĺć˘ăăă䝼ä¸čŞăăăŽăŻăăăžăăăă¨č¨ăä˝ăăăŽćšćłăĺŽčĄăăĺż
čŚăăăăžăăăăăăŁăŚăĺźăłĺşăĺ
ăŽăŞăă¸ă§ăŻăăŤă¨ăŠăźăčżăĺăŤăă¨ăŠăźăăŤCountLine
é˘éŁăăŚăăŞăăă¨ă確čŞăăŚăăio.EOF
渥ăĺż
čŚăăăăžăăăăă§ăŞăĺ ´ĺăŻnil
ăăăšăŚăćŁĺ¸¸ă§ăăă¨čżăăăžăăăăăŻăă¨ăŠăźĺŚçăé˘ć°ăé ăćšćłăŤé˘ăăăŠăšăłăăŻăšăŽčŤćăŽčŻăäžă ă¨ćăăžăăćšĺăăăăăźă¸ă§ăłăčŚăŚăżăžăăăă func CountLines(r io.Reader) (int, error) { sc := bufio.NewScanner(r) lines := 0 for sc.Scan() { lines++ } return lines, sc.Err() }
ăăŽćšĺăăăăăźă¸ă§ăłăŻbufio.Scanner
䝣ăăăŤă使ç¨ăăžăbufio.Reader
ăĺ
é¨ă§bufio.Scanner
ăŻă使ç¨ăbufio.Reader
ăžăăăéŠĺăŞăŹăăŤăŽć˝čąĄĺăčż˝ĺ ăăă¨ăŠăźĺŚçăŽĺé¤ăŤĺ˝šçŤăĄăžăăă注ć bufio.Scanner
, .
ăšăăŁăăćĺĺăć¤ĺşăăă¨ăŠăźăć¤ĺşăăŞăăŁăĺ ´ĺăăĄă˝ăăsc.Scan()
ăŻĺ¤ăčżătrue
ăžăăăăăăŁăŚăăŤăźăăăăŁăŻfor
ăăšăăŁăăźăăăăĄăźăŤăăăšăčĄăăăĺ ´ĺăŤăŽăżĺźăłĺşăăăžăăăăCountLines
ăŻăć°ăăčĄăĺĺ¨ăăŞăĺ ´ĺăăăĄă¤ăŤă犺ăŽĺ ´ĺăŤć°ăăăăŽăăąăźăšăĺŚçăăăă¨ăćĺłăăžăă珏äşăŤăă¨ăŠăźăć¤ĺşăăăă¨ăăŤsc.Scan
ćťăăăfalse
ăăľă¤ăŻăŤfor
ăŻăăĄă¤ăŤăŽçľăăăŤéăăăă¨ăŠăźăć¤ĺşăăăă¨çľäşăăžăăăăŽĺbufio.Scanner
ăŻăćĺăŤçşçăăă¨ăŠăźăč¨ćśăăŚăăăăĄă˝ăăsc.Err()
ă使ç¨ăăă¨ăăŤăźăăçľäşăăă¨ăăăŤăăŽă¨ăŠăźă垊ĺ
ă§ăăžăăćĺžăŤăsc.Err()
ĺŚçăĺŚçăio.EOF
ănil
ă¨ăŠăźăŞăă§ăăĄă¤ăŤăŽçľăăăŤĺ°éăăĺ ´ĺăŤĺ¤ćăăžăăĺč°äźăé庌ăŽă¨ăŠăźĺŚçăçşçăăĺ ´ĺăŻăä¸é¨ăŽćä˝ăăăŤăăźăżă¤ăăŤć˝ĺşăăŚăżăŚăă ăăă
7.1.2ă ć¸ăčžźăżĺżç
2çŞçŽăŽäžăŻăăMistakes is Valuesăă¨ăăć稿ăŤč§ŚçşăăăžăăăĺăŤăăăĄă¤ăŤăéăăć¸ăčžźăăéăăćšćłăŽäžăčŚăŚăăžăăăă¨ăŠăźĺŚçăŻăăăžăăăćä˝ăŻăăŤăăźă§ăŤăăťăŤĺăăăă¨ăă§ăăăŽă§ăăăăŻăăăžăăŞăăăŞăŠioutil.ReadFile
ă¨ioutil.WriteFile
ăăă ăăä˝ăŹăăŤăŽăăăăŻăźăŻăăăăłăŤă使ç¨ăăĺ ´ĺăŻăI / OăăŞăăăŁăă使ç¨ăăŚç´ćĽĺçăä˝ćăăĺż
čŚăăăăžăăăăŽĺ ´ĺăă¨ăŠăźĺŚçăéŞéăŤăŞăăă¨ăăăăžăăHTTPĺżçăä˝ćăăHTTPăľăźăăźăŽăăŠă°ăĄăłăăć¤č¨ăăŚăă ăăă type Header struct { Key, Value string } type Status struct { Code int Reason string } func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error { _, err := fmt.Fprintf(w, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason) if err != nil { return err } for _, h := range headers { _, err := fmt.Fprintf(w, "%s: %s\r\n", h.Key, h.Value) if err != nil { return err } } if _, err := fmt.Fprint(w, "\r\n"); err != nil { return err } _, err = io.Copy(w, body) return err }
ăžăăăšăăźăżăšăăźăä˝ćăfmt.Fprintf
ăă¨ăŠăźă確čŞăăžăă揥ăŤăĺčŚĺşăăŤĺŻžăăŚăă¨ăŠăźăăă§ăăŻăăăăłăŤăăźă¨čŚĺşăĺ¤ăć¸ăčžźăżăžăăćĺžăŤăăăăăźăťăŻăˇă§ăłăčż˝ĺ ăăŚ\r\n
ăă¨ăŠăźă確čŞăăĺżçćŹćăăŻăŠă¤ă˘ăłăăŤăłăăźăăžăăćĺžăŤăăăăŽă¨ăŠăźăăă§ăăŻăăĺż
čŚăŻăăăžăăăio.Copy
ă2ă¤ăŽćťăĺ¤ăăăčżăĺŻä¸ăŽĺ¤ăŤĺ¤ćăăĺż
čŚăăăăžăWriteResponse
ăăăăŻĺ調ăŞä˝ćĽă§ăăăăăăĺ°ăăŞăżă¤ăăŽăŠăăăźăéŠç¨ăăăă¨ă§ăăżăšăŻăç°ĄĺăŤăăăă¨ăă§ăăžăerrWriter
ăerrWriter
ăŻĺĽç´ăćşăăăŚăăio.Writer
ăăăăŠăăăźă¨ăăŚä˝żç¨ă§ăăžăăerrWriter
ă¨ăŠăźăć¤ĺşăăăăžă§ăé˘ć°ăäťăăŚăŹăłăźăă渥ăăžăăăăŽĺ ´ĺăă¨ăłăăŞăćĺŚăăĺăŽă¨ăŠăźăčżăăžăă type errWriter struct { io.Writer err error } func (e *errWriter) Write(buf []byte) (int, error) { if e.err != nil { return 0, e.err } var n int n, e.err = e.Writer.Write(buf) return n, nil } func WriteResponse(w io.Writer, st Status, headers []Header, body io.Reader) error { ew := &errWriter{Writer: w} fmt.Fprintf(ew, "HTTP/1.1 %d %s\r\n", st.Code, st.Reason) for _, h := range headers { fmt.Fprintf(ew, "%s: %s\r\n", h.Key, h.Value) } fmt.Fprint(ew, "\r\n") io.Copy(ew, body) return ew.err }
ăŤéŠç¨errWriter
ăăWriteResponse
ă¨ăăłăźăăŽćçăă大ĺš
ăŤĺä¸ăăžăăĺă
ăŽćä˝ăă¨ăŤă¨ăŠăźăăă§ăăŻăăĺż
čŚăŻăŞăăŞăăžăăăă¨ăŠăźăĄăăťăźă¸ăŻăăăŁăźăŤăăă§ăăŻă¨ăăŚé˘ć°ăŽćĺžăŤç§ťĺăew.err
ăčżăăăio.Copyĺ¤ăŽčżˇćăŞĺ¤ćăĺéżăăžăă7.2ă ă¨ăŠăźăä¸ĺşŚă ăĺŚçăă
ćĺžăŤăă¨ăŠăźăŻ1ĺă ăĺŚçăăĺż
čŚăăăăă¨ăŤćł¨ćăăŚăă ăăăĺŚçă¨ăŻăă¨ăŠăźăŽćĺłă確čŞăăĺä¸ăŽćąşĺŽăä¸ăăă¨ăćĺłăăžăă
1ă¤ćŞćşăŽćąşĺŽăčĄăĺ ´ĺăă¨ăŠăźăçĄčŚăăžăăăăăŤăăăăăŤăăăăŽă¨ăŠăźăŻw.WriteAll
çĄčŚăăăžăăăăăă1ă¤ăŽăăšăŤĺŻžĺżăăŚč¤ć°ăŽćąşĺŽăä¸ăăă¨ăééăŁăŚăăžăă䝼ä¸ăŻăç§ăăăééăăăłăźăă§ăă func WriteAll(w io.Writer, buf []byte) error { _, err := w.Write(buf) if err != nil { log.Println("unable to write:", err)
ăăŽäžă§ăŻătimeăŽéăŤă¨ăŠăźăçşçăăw.Write
ă¨ăčĄăăă°ăŤć¸ăčžźăžăăĺźăłĺşăĺ
ăŽăŞăă¸ă§ăŻăăŤčżăăăžăăĺźăłĺşăĺ
ăŽăŞăă¸ă§ăŻăăŻăăăăăăă°ăč¨é˛ăăŚăăă°ăŠă ăŽćä¸ä˝ăžă§ć¸Ąăăžăăăťă¨ăăŠăŽĺ ´ĺăĺźăłĺşăĺ
ăŻĺăăă¨ăčĄăăžăă func WriteConfig(w io.Writer, conf *Config) error { buf, err := json.Marshal(conf) if err != nil { log.Printf("could not marshal config: %v", err) return err } if err := WriteAll(w, buf); err != nil { log.Println("could not write config: %v", err) return err } return nil }
ăăăăŁăŚăçš°ăčżăčĄăŽăšăżăăŻăăă°ăŤä˝ćăăăžăă unable to write: io.EOF could not write config: io.EOF
ăăăăăăă°ăŠă ăŽä¸é¨ă§ăŻăăłăłăăăšăăŞăă§ĺ
ăŽă¨ăŠăźăçşçăăžăă err := WriteConfig(f, &conf) fmt.Println(err)
ăăŽăăăăŻăăă芳細ăŤĺćăăăăŽăŻăă¨ăŠăźăčżăă¨ĺćăŤĺäşşçăŞĺĽ˝ăżăč¨é˛ăăă¨ăăĺéĄăčć
ŽăăŚăăŞăăăă§ăă func WriteConfig(w io.Writer, conf *Config) error { buf, err := json.Marshal(conf) if err != nil { log.Printf("could not marshal config: %v", err)
ăăă°ăŠăăźăă¨ăŠăźăăćťăăă¨ăĺżăăă¨ăăĺéĄăŤăă°ăă°ééăăžăăĺ
ăŤčż°ăšăăăăŤăGoăŽăšăżă¤ăŤăŻĺ˘çćźçŽĺă使ç¨ăăé˘ć°ăŽĺŽčĄćăŤĺććĄäťśă確čŞăăćŠćăŤćťăăă¨ă§ăăăăŽäžă§ăŻăä˝ćč
ăŻă¨ăŠăźăăă§ăăŻăăŚçťé˛ăăžăăăăćťăăŽăĺżăăŚăăžăăăăăŽăăă垎ĺŚăŞĺéĄăçşçăăžăăGoă¨ăŠăźĺŚçăłăłăăŠăŻăă§ăŻăă¨ăŠăźăĺĺ¨ăăĺ ´ĺăäťăŽćťăĺ¤ăŽĺ
厚ăŤă¤ăăŚäťŽĺŽăçŤăŚăăă¨ăŻă§ăăŞăă¨ăăŚăăžăă JSONăăźăˇăŁăŞăłă°ă夹ćăăăăăĺ
厚ăŻbuf
ä¸ćă§ăăä˝ăĺŤăžăăŚăăŞăĺŻč˝ć§ăăăăžăăăăăăŤćŞăăă¨ăŤăĺĺć¸ăăăJSONăăŠă°ăĄăłăăĺŤăžăăŚăăĺŻč˝ć§ăăăăžăăăăă°ăŠăăŻă¨ăŠăźăăă§ăăŻăăŚçťé˛ăăĺžăŤćťăăŽăĺżăăăăăç ´ćăăăăăăĄă蝢éăăWriteAll
ăžăăćä˝ăŻćĺăăĺŻč˝ć§ăéŤăăăăć§ćăăĄă¤ăŤăŻćŁăăć¸ăčžźăžăăžăăăăă ăăé˘ć°ăŻćŁĺ¸¸ăŤĺŽäşăăĺéĄăçşçăăăă¨ă示ăĺŻä¸ăŽĺ
ĺăŻăć§ćăŹăłăźăăŽé厳ă§ăŻăŞăăJSONăăźăˇăŁăŞăłă°ă夹ćăăăă°ăŽčĄă§ăă7.2.1ăă¨ăŠăźă¸ăŽăłăłăăăšăăŽčż˝ĺ
ä˝ćč
ăă¨ăŠăźăĄăăťăźă¸ăŤăłăłăăăšăăčż˝ĺ ăăăă¨ăăăăăă¨ăŠăźăçşçăăžăăă彟ăŻăă¨ăŠăźăŽĺĺ ă示ăăăźăŻăćŽăăă¨ăăžăăăăäťăăŚĺăăă¨ăčĄăĺĽăŽćšćłăčŚăŚăżăžăăăfmt.Errorf
ă func WriteConfig(w io.Writer, conf *Config) error { buf, err := json.Marshal(conf) if err != nil { return fmt.Errorf("could not marshal config: %v", err) } if err := WriteAll(w, buf); err != nil { return fmt.Errorf("could not write config: %v", err) } return nil } func WriteAll(w io.Writer, buf []byte) error { _, err := w.Write(buf) if err != nil { return fmt.Errorf("write failed: %v", err) } return nil }
ă¨ăŠăźăŹăłăźăă1čĄă§čżăăă¨ă¨çľăżĺăăăă¨ăćťăăă¨ăĺżăăŚĺśçşçăŞçśçśăéżăăăŽăăăĺ°éŁăŤăŞăăžăăăăĄă¤ăŤăŽć¸ăčžźăżä¸ăŤI / Oă¨ăŠăźăçşçăăĺ ´ĺăăĄă˝ăăError()
ăŻćŹĄăŽăăăŞăăŽăçćăăžăă could not write config: write failed: input/output error
7.2.2ăgithub.com/pkg/errorsă§ăŽă¨ăŠăźăŠăăăłă°
ăăŽăăżăźăłăŻă¨ăŠăźăĄăăťăźă¸ăŽfmt.Errorf
č¨é˛ăŤéŠăăŚăăžăăăă¨ăŠăźăŽç¨ŽéĄăŻăăéăŤăăăžăăççľĺăăă¸ă§ăŻăă§ăŻăă¨ăŠăźăä¸éćăŞĺ¤ă¨ăăŚĺŚçăăăă¨ăéčŚă§ăăăăăĺ
ăŽă¨ăŠăźăŽç¨ŽéĄăŻăăăŽĺ¤ăĺŚçăăă ăă§ăăăăŠăăăŻé˘äżăŞăă¨ä¸ťĺźľăăžăăă- ăźăă§ăŞăăă¨ă確čŞăăŚăă ăăă
- çťé˘ăŤčĄ¨ç¤şăăăăăă°ăŤč¨é˛ăăžăă
ăă ăăĺ
ăŽă¨ăŠăźă垊ĺ
ăăĺż
čŚăăăĺ ´ĺăăăăžăăăăŽăăăŞă¨ăŠăźăŤćł¨éăäťăăăŤăŻăç§ăŽăăăąăźă¸ăŽăăăŞăăŽă使ç¨ă§ăăžăerrors
ďź func ReadFile(path string) ([]byte, error) { f, err := os.Open(path) if err != nil { return nil, errors.Wrap(err, "open failed") } defer f.Close() buf, err := ioutil.ReadAll(f) if err != nil { return nil, errors.Wrap(err, "read failed") } return buf, nil } func ReadConfig() ([]byte, error) { home := os.Getenv("HOME") config, err := ReadFile(filepath.Join(home, ".settings.xml")) return config, errors.WithMessage(err, "could not read config") } func main() { _, err := ReadConfig() if err != nil { fmt.Println(err) os.Exit(1) } }
ăăă§ăăĄăăťăźă¸ăŻç´ ćľăŞKďźDăšăżă¤ăŤăŽăă°ăŤăŞăăžăă could not read config: open failed: open /Users/dfc/.settings.xml: no such file or directory
ăăŽĺ¤ăŤăŻĺ
ăŽççąă¸ăŽăŞăłăŻăĺŤăžăăŚăăžăă func main() { _, err := ReadConfig() if err != nil { fmt.Printf("original error: %T %v\n", errors.Cause(err), errors.Cause(err)) fmt.Printf("stack trace:\n%+v\n", err) os.Exit(1) } }
ăăăăŁăŚăĺ
ăŽă¨ăŠăźă垊ĺ
ăăŚăšăżăăŻăăŹăźăšă襨示ă§ăăžăă original error: *os.PathError open /Users/dfc/.settings.xml: no such file or directory stack trace: open /Users/dfc/.settings.xml: no such file or directory open failed main.ReadFile /Users/dfc/devel/practical-go/src/errors/readfile2.go:16 main.ReadConfig /Users/dfc/devel/practical-go/src/errors/readfile2.go:29 main.main /Users/dfc/devel/practical-go/src/errors/readfile2.go:35 runtime.main /Users/dfc/go/src/runtime/proc.go:201 runtime.goexit /Users/dfc/go/src/runtime/asm_amd64.s:1333 could not read config
ăăŽăăăąăźă¸ăerrors
使ç¨ăăă¨ăäşşă¨ăăˇăłăŽä¸ĄćšăŤă¨ăŁăŚäžżĺŠăŞĺ˝˘ĺźă§ă¨ăŠăźĺ¤ăŤăłăłăăăšăăčż˝ĺ ă§ăăžăăćčżăŽăăŹăźăłăăźăˇă§ăłă§ăGoăŽćŹĄăŽăŞăŞăźăšă§ăăăŽăăăŞăŠăăăźăć¨ćşăŠă¤ăăŠăŞăŤčĄ¨ç¤şăăăăă¨ăăäźăăăžăăă8.丌čĄć§
GoăŻĺ¤ăăŽĺ ´ĺăăăŽĺćĺŽčĄćŠč˝ăŽăăăŤé¸ćăăăžăăéçşč
ăŻăăŽĺšçďźăăźăăŚă§ă˘ăŞă˝ăźăšďźă¨ççŁć§ăĺä¸ăăăăăăŤĺ¤ăăŽăă¨ăăăžăăăăGoăŽä¸ŚĺĺŚçćŠč˝ă使ç¨ăăŚăççŁçă§ăäżĄé źć§ăŽăŞăăłăźăăć¸ăăă¨ăă§ăăžăăč¨äşăŽćĺžă§ăGoăŽä¸ŚčĄĺŚçćŠč˝ăŽč˝ă¨ă犴ăŽăăă¤ăăĺéżăăćšćłăŤé˘ăăăăłăăăăă¤ăç´šäťăăžăăGoăŽćéŤăŹăăŤăŽĺćĺŽčĄć§ăľăăźăăŻăăăŁăăŤă¨ćé select
ăăăăłgo
ăćç§ć¸ă大ĺŚă§ĺ˛theoryçčŤăĺŚăă ĺ ´ĺă丌ĺĺŚçăťăŻăˇă§ăłăŻĺ¸¸ăŤăłăźăšăŽćĺžăŽăťăŻăˇă§ăłăŽ1ă¤ă§ăăăă¨ăŤăć°ăĽăăăăăăžăăăç§ăăĄăŽč¨äşăĺăă§ăăGoăăă°ăŠăăźăçżĺžăăšăé常ăŽăšăăŤăŤčż˝ĺ ăăăăŽă¨ăăŚăćĺžăŤä¸ŚĺĺŚçăŤă¤ăăŚčŞŹćăăăă¨ăŤăăžăăăGoăŽä¸ťăŞçšĺž´ăŻĺç´ă§ç°ĄĺăŞä¸ŚĺĺŚçă˘ăăŤă§ăăăăăăăăŤăŻçšĺŽăŽäşĺćłăăăăžăă製ĺă¨ăăŚăç§ăăĄăŽč¨čŞăŻăăăŽăťăź1ă¤ăŽćŠč˝ăç ç˛ăŤăăŚăăčŞä˝ă貊売ăăŚăăžăăä¸ćšă丌čĄć§ăŻĺŽéăŤăŻăăăťăŠä˝żăăăăăăŽă§ăŻăăăžăăăăăăŞăăă°ăčč
ăŻćŹăŽćĺžăŽçŤ ăŤăăăăłăźăăĺžćăăăă¨ăŻăăăžăăă§ăăăăăŽăťăŻăˇă§ăłă§ăŻăGo丌čĄć§é˘ć°ăŽĺç´ăŞä˝żç¨ăŽč˝ă¨ă犴ăŽăăă¤ăăŤă¤ăăŚčŞŹćăăžăă8.1ă常ăŤä˝ăăăŽäťäşăăăŚăă ăăă
ăăŽăăă°ăŠă ăŽĺéĄăŻä˝ă§ăăďź package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) go func() { if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }() for { } }
ăăŽăăă°ăŠă ăŻăç§ăăĄăćĺłăăăă¨ăčĄăăžăăĺç´ăŞWebăľăźăăźăćäžăăžăăĺćăŤăCPUćéăçĄéăŤăźăăŤč˛ťăăăăžăăfor{}
ćĺžăŽčĄă§main
ăŻgorutin mainăăăăăŻăăI / OăĺŽčĄăăăŤăăăăăăłă°ăăĄăăťăźă¸ăŽéĺ俥ăăžăăŻăˇă§ăăźă¨ăŽä˝ăăăŽćĽçśăĺž
ćŠăăžăăăGoăŠăłăżă¤ă ăŻé常ăˇă§ăăŠăźăŤăăŁăŚćäžăăăăăăăăŽăăă°ăŠă ăŻăăăťăăľăźä¸ă§çĄćĺłăŤăšăăłăăă˘ăŻăăŁăăŞăăăŻďźăŠă¤ăăăăŻďźăŤăŞăĺŻč˝ć§ăăăăžăă俎ćŁćšćł
1ă¤ăŽăŞăăˇă§ăłăăăăžăă package main import ( "fmt" "log" "net/http" "runtime" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) go func() { if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }() for { runtime.Gosched() } }
ăăăŻéŚŹéšżăăŚăăăăăŤčŚăăăăăăăžăăăăăăăŻçžĺŽăŽçć´ťă§ç§ăŤĺşăăăä¸čŹçăŞč§Łćąşçă§ăăăăăŻăć šćŹçăŞĺéĄăŽčŞ¤č§ŁăŽççśă§ăăGoăŽçľé¨ăĺ°ăăăĺ ´ĺăŻă揥ăŽăăăŤć¸ăăă¨ăă§ăăžăă package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) go func() { if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }() select {} }
犺ăŽăšăăźăăĄăłăăŻselect
ć°¸äš
ăŤăăăăŻăăăžăăăăăŻäžżĺŠă§ăăăŞăăŞăăäťăŻcallăŽăăă ăăŤăăăťăăľĺ
¨ä˝ăăšăăłăăŞăăăă§ăruntime.GoSched()
ăăă ăăĺĺ ă§ăŻăŞăççśăŽăżăćąăăžăăăă1ă¤ăŽč§Łćąşçă示ăăăă¨ćăăžăăăăăăŻć˘ăŤăăŞăăŤčľˇăăŁăŚăăăă¨ă§ăăhttp.ListenAndServe
ă´ăŤăźăăłă§ĺŽčĄăă䝣ăăăŤăăĄă¤ăłăŽă´ăŤăźăăłăŽĺéĄăćŽăăŚăăĄă¤ăłăŽă´ăŤăźăăłă§ĺŽčĄhttp.ListenAndServe
ăăă ăă§ăăĺč°äźăé˘ć°ăçľäşăămain.main
ă¨ăăăă°ăŠă ăŽĺŽčĄä¸ăŤĺŽčĄăăăäťăŽă´ăŤăźăăłăä˝ăăăăăŤé˘äżăŞăăGoăăă°ăŠă ăŻçĄćĄäťśăŤçľäşăăžăă
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, GopherCon SG") }) if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatal(err) } }
ăăăăŁăŚăăăăç§ăŽćĺăŽă˘ăăă¤ăšă§ăăă´ăŤăźăăłăĺĽăŽçľćăĺžăăžă§é˛ćŠă§ăăŞăĺ ´ĺăäťäşăĺ§äťťăăăăăčŞĺă§čĄăćšăç°ĄĺăŞĺ ´ĺăăăăăăžăăăăăŤăăăĺ¤ăăŽĺ ´ĺăă´ăŤăźăăłăăăăăťăšéĺ§č
ăŤçľćăćťăăăăŤĺż
čŚăŞĺ¤ăăŽçść
追补ă¨ăăŁăăŤćä˝ăä¸čŚăŤăŞăăžăăĺč°äźăĺ¤ăăŽGoăăă°ăŠăăźăŻăçšăŤćĺăŻă´ăŤăźăăłăäšąç¨ăăŚăăžăăäşşçăŽäťăŽăăšăŚă¨ĺć§ăŤăćĺă¸ăŽéľăŻçŻĺşŚă§ăă
8.2ăĺźăłĺşăĺ
ăŤä¸ŚĺĺŚçăäťťăă
2ă¤ăŽAPIăŽéăăŻä˝ă§ăăďź
ćăăăŞéăăŤă¤ăăŚč¨ĺăăžăăćĺăŽäžă§ăŻăăăŁăŹăŻăăŞăăšăŠă¤ăšăŤčŞăżčžźăżăä˝ăĺéĄăçşçăăĺ ´ĺăŻăšăŠă¤ăšĺ
¨ä˝ăžăăŻă¨ăŠăźăčżăăžăăăăăŻĺćçăŤçşçăăĺźăłĺşăĺ
ListDirectory
ăŻăăšăŚăŽăăŁăŹăŻăăŞă¨ăłăăŞăčŞăżĺăăăăžă§ăăăăŻăăžăăăăŁăŹăŻăăŞăŽĺ¤§ăăăŤăăŁăŚăŻăćéăăăăăĺ ´ĺăŤăăŁăŚăŻĺ¤§éăŽăĄă˘ăŞăĺż
čŚăŤăŞăĺ ´ĺăăăăžăă2çŞçŽăŽäžăčăăŚăżăžăăăăĺ¤ĺ
¸çăŞGoăăă°ăŠăăłă°ăŤĺ°ăäźźăŚăListDirectory
ăžăăăăăă§ăŻăăŁăŹăŻăăŞă¨ăłăăŞăé俥ăăăăăŁăăŤăčżăăžăăăăŁăăŤăéăăăăă¨ăăăăŻăŤăżăă°ă¨ăłăăŞăăŞăăŞăŁăăă¨ă示ăăŚăăžăăăăŁăăŤăŽĺ
奍ăŻreturnăŽĺžăŤçşçListDirectory
ăăăăăă´ăŤăźăăłăăăŁăăŤăŽĺ
奍ăéĺ§ăăă¨ćłĺŽă§ăăžăăă注ć2çŞçŽăŽăŞăăˇă§ăłă§ăŻăă´ăŤăźăăłăĺŽéăŤä˝żç¨ăăĺż
čŚăŻăăăžăăăăăăăŻăăăŤăăšăŚăŽăăŁăŹăŻăăŞă¨ăłăăŞăć źç´ăăăŽăŤĺĺăŞăăŁăăŤăé¸ćăăĺ
ĽĺăăŚéăăŚăăăĺźăłĺşăĺ
ăŤăăŁăăŤăčżăăă¨ăă§ăăžăăăă ăăăăŽĺ ´ĺăăăŁăăŤĺ
ăŽăăšăŚăŽçľćăăăăăĄăŞăłă°ăăăăăŤĺ¤§éăŽăĄă˘ăŞă使ç¨ăăă¨ĺăĺéĄăçşçăăăăăăăăŻčăăăăžăăă
ListDirectory
ăăŁăłăăŤăăźă¸ă§ăłăŤăŻăăăăŤ2ă¤ăŽĺéĄăăăăžăă- ĺŚçăăčŚç´ ăăăăŞăăă¨ă示ă俥ĺˇă¨ăăŚéăăăăŁăăŤă使ç¨ăă
ListDirectory
ă¨ăă¨ăŠăźăĺĺ ă§čŚç´ ăŽä¸ĺŽĺ
¨ăŞăťăăăĺźăłĺşăĺ´ăŤéçĽă§ăăžăăăĺźăłĺşăĺ
ăŤăŻă犺ăŽăăŁăŹăŻăăŞă¨ă¨ăŠăźăŽéăăäźăăćšćłăăăăžăăăăŠăĄăăŽĺ ´ĺăăăăŁăăŤăŻăăăŤéăăăăăăă§ăă
- ĺźăłĺşăĺ
ăŻăăăŁăăŤăéăăăăă¨ăăŤăăŁăăŤăăăŽčŞăżĺăăçśçśăăĺż
čŚăăăăžăăăăăŻăăăŁăăŤăćşăăă´ăŤăźăăłăćŠč˝ăăŞăăŞăŁăăă¨ăç解ăăĺŻä¸ăŽćšćłă ăăă§ăăăăăŻä˝żç¨ä¸ăŽé大ăŞĺśé
ListDirectory
ă§ăăçşäżĄč
ăŻăĺż
čŚăŞăăźăżăăăšăŚĺ俥ăăă¨ăăŚăăăăŁăăŤăăăŽčŞăżĺăăŤćéă貝ăăăžăăăăăŻăăăăăä¸čŚć¨Ąăăăłĺ¤§čŚć¨ĄăăŁăŹăŻăăŞăŽăĄă˘ăŞä˝żç¨éăŽçšă§ăăĺšççă§ăăăăăŽćšćłăŻĺ
ăŽăšăŠă¤ăšăăźăšăŽćšćłăăăéŤéă§ăŻăăăžăăă
ăŠăĄăăŽĺ ´ĺă§ăă解湺çăŻăłăźăŤăăăŻă使ç¨ăăăă¨ă§ăăăłăźăŤăăăŻăŻăĺŽčĄćăŤĺăăŁăŹăŻăăŞă¨ăłăăŞăŽăłăłăăăšăă§ĺźăłĺşăăăé˘ć°ă§ăă func ListDirectory(dir string, fn func(string))
ĺ˝çśăŽăă¨ăŞăăăé˘ć°filepath.WalkDir
ăŻăăŽăăăŤćŠč˝ăăžăăĺč°äźăé˘ć°ăă´ăŤăźăăłă辡ĺăăĺ ´ĺăăăŽăŤăźăăłăć示çăŤĺć˘ăăćšćłăĺźăłĺşăĺ
ăŤćäžăăĺż
čŚăăăăžăăĺ¤ăăŽĺ ´ĺăĺźăłĺşăĺ
ă§éĺćĺŽčĄă˘ăźăăçľäşăăăŽăćăç°Ąĺă§ăă
8.3ăăă¤ĺć˘ăăăăçĽăăăŤă´ăŤăźăăłăĺŽčĄăăŞă
ĺăŽäžă§ăŻăă´ăŤăźăăłăŻä¸ĺż
čŚăŤä˝żç¨ăăăŚăăžăăăăăăăGoăŽä¸ťăŞĺźˇăżăŽ1ă¤ăŻăăăŽä¸ćľăŽä¸ŚčĄć§ćŠč˝ă§ăăĺŽéăĺ¤ăăŽĺ ´ĺă丌čĄä˝ćĽăé常ăŤéŠĺă§ăăăă´ăŤăźăăłă使ç¨ăăĺż
čŚăăăăžăăăăŽĺç´ăŞă˘ăăŞăąăźăˇă§ăłăŻăă˘ăăŞăąăźăˇă§ăłăăŠăăŁăăŻç¨ăŽăăźă8080ă¨ă¨ăłăăă¤ăłăă¸ăŽă˘ăŻăťăšç¨ăŽăăźă8001ăŽ2ă¤ăŽç°ăŞăăăźăă§httpăăŠăăŁăăŻăĺŚçăăžă/debug/pprof
ă package main import ( "fmt" "net/http" _ "net/http/pprof" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) go http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux)
ăăă°ăŠă ăŻč¤éă§ăŻăăăžăăăăĺŽéăŽă˘ăăŞăąăźăˇă§ăłăŽĺşç¤ă§ăăçžĺ¨ăŽĺ˝˘ĺźăŽă˘ăăŞăąăźăˇă§ăłăŤăŻăćéˇăăăŤă¤ăăŚçžăăăăă¤ăăŽĺéĄăăăăŽă§ăăăăŤăăăăŽăăă¤ăăčŚăŚăżăžăăăă func serveApp() { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) http.ListenAndServe("0.0.0.0:8080", mux) } func serveDebug() { http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux) } func main() { go serveDebug() serveApp() }
ăăłăăŠăç ´ăserveApp
ă¨serveDebug
ăĺĽăŽé˘ć°ăŤăćă
ăŻăăăăăăĺé˘ăăŚăăžămain.main
ăăžăă䝼ĺăŽă˘ăăă¤ăšăŤĺžăă確čŞăăžăăserveApp
ă¨serveDebug
ăĺźăłĺşăĺ
ăŽä¸Śĺć§ă確äżăăăăăŽăżăšăŻăćŽăăžăăăăăăăăŽăăăŞăăă°ăŠă ăŽăăăŠăźăăłăšăŤăŻăăă¤ăăŽĺéĄăăăăžăăçľäşserveApp
ăăŚăăexităĺŽčĄăămain.main
ă¨ăăăă°ăŠă ăŻçľäşăăăăăťăšăăăźă¸ăŁăźăŤăăŁăŚĺ辡ĺăăăžăăĺč°äźăGoăŽé˘ć°ăĺźăłĺşăăŞăă¸ă§ăŻăăŤä¸Śĺć§ăćŽăăăăŤăă˘ăăŞăąăźăˇă§ăłăŻçść
ăŽçŁčŚăĺć˘ăăĺźăłĺşăăăăă°ăŠă ăĺ辡ĺăăĺż
čŚăăăăžăăă˘ăăŞăąăźăˇă§ăłăčŞĺă§ĺ辡ĺăă貏䝝ăč˛ ăăăŞăă§ăă ăăăăăŽăăăťăšăŻăă˘ăăŞăąăźăˇă§ăłăŽĺ¤é¨ăăĺŚçăăăŽăćéŠă§ăă
ăă ăăserveDebug
ĺĽăŽă´ăŤăźăăłă§éĺ§ăăăăăŽăŞăŞăźăšăŽĺ ´ĺăă´ăŤăźăăłăŻçľäşăăžăăăăăă°ăŠă ăŽćŽăăŻçśçśăăžăăéçşč
/debug
ăŻăăăłăăŠăźăéˇćéĺä˝ăăŞăăŞăŁăăăăă˘ăăŞăąăźăˇă§ăłăŽçľąč¨ć
ĺ ąăĺĺžă§ăăŞăă¨ăăäşĺŽăĺŤăăžăăç§ăăĄăŻĺć˘ăăĺ ´ĺăĺż
ăă˘ăăŞăąăźăˇă§ăłăéăăăăăăăŤăăĺż
čŚăăăäťťćăŽăăăćäžgorutinaăă func serveApp() { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) if err := http.ListenAndServe("0.0.0.0:8080", mux); err != nil { log.Fatal(err) } } func serveDebug() { if err := http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux); err != nil { log.Fatal(err) } } func main() { go serveDebug() go serveApp() select {} }
äťserverApp
ă彟ăăŻserveDebug
ăăă¨ăŠăźăăă§ăăŻListenAndServe
ăăĺż
čŚăŤĺżăăŚăăăăĺźăłĺşăăžălog.Fatal
ă严ćšăŽăăłăăŠăźăŻă´ăŤăźăăłă§ĺä˝ăăăăăăĄă¤ăłăŤăźăăłăä˝ćăselect{}
ăžăăăăŽă˘ăăăźăăŤăŻăăă¤ăăŽĺéĄăăăăžăăListenAndServe
ă¨ăŠăźă§čżăăăĺ ´ĺnil
ăĺźăłĺşăăŻčĄăăălog.Fatal
ăăăŽăăźăăŽHTTPăľăźăăšăŻă˘ăăŞăąăźăˇă§ăłăĺć˘ăăăŤçľäşăăžăă
log.Fatal
os.Exit
ăăă°ăŠă ăçĄćĄäťśăŤçľäşăăĺźăłĺşăăé
ĺťśĺźăłĺşăăŻćŠč˝ăăăäťăŽă´ăŤăźăăłăŻééăŽéçĽăĺăăăăăă°ăŠă ăŻĺăŤĺć˘ăăžăăăăăŤăăăăăăăŽé˘ć°ăŽăăšăăć¸ăăă¨ăéŁăăăŞăăžăă
ĺč°äźălog.Fatal
é˘ć°main.main
ăžăăŻă§ăŽăżä˝żç¨ăăžăinit
ă
ĺŽéăă´ăŤăźăăłăŽä˝ćč
ăŤă¨ăŠăźăçşçăăĺ ´ĺăŻăăăŽă¨ăŠăźăäźăăŚă彟弳ăăăăťăšăĺć˘ăăŚĺŽĺ
¨ăŤĺŽäşăăççąăčŚă¤ăăăăăăăŤăăžăă func serveApp() error { mux := http.NewServeMux() mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { fmt.Fprintln(resp, "Hello, QCon!") }) return http.ListenAndServe("0.0.0.0:8080", mux) } func serveDebug() error { return http.ListenAndServe("127.0.0.1:8001", http.DefaultServeMux) } func main() { done := make(chan error, 2) go func() { done <- serveDebug() }() go func() { done <- serveApp() }() for i := 0; i < cap(done); i++ { if err := <-done; err != nil { fmt.Println("error: %v", err) } } }
GoroutineăŽćťăăšăăźăżăšăŻăăăŁăăŤăäťăăŚĺĺžă§ăăžăăăăŁăăŤăľă¤ăşăŻĺśĺžĄăăăă´ăŤăźăăłăŽć°ă¨çăăăăăăăŁăăŤă¸ăŽé俥done
ăŻăăăăŻăăăžăăăă´ăŤăźăăłăŽăˇăŁăăăăŚăłăăăăăŻăăăăŞăźăŻăçşçăăăăă§ăăăăŁăăŤdone
ăĺŽĺ
¨ăŤéăăăă¨ăă§ăăŞăăăăfor range
ăăšăŚăŽă´ăŤăźăăłăĺ ąĺăăăăžă§ăăăŁăăŤăľă¤ăŻăŤăŽă¤ăăŁăŞă ă使ç¨ă§ăăžăăă䝣ăăăŤăĺŽčĄä¸ăŽăăšăŚăŽă´ăŤăźăăłă1ăľă¤ăŻăŤă§ĺŽčĄăăžăăăăăŻăăăŁăăŤăŽĺŽšéăŤçăăăŞăăžăăăăă§ăăăšăŚăŽă´ăŤăźăăłăăăăăŤçľäşăăçşçăăăăšăŚăŽă¨ăŠăźă俎ćŁăăćšćłăă§ăăžăăăćĺăŽă´ăŤăźăăłăăäťăŽĺ
¨ĺĄăŤä˝ćĽăĺŽäşăăăăăŽäżĄĺˇăé俥ăăă ăă§ăăă¸ăŽč¨´ăhttp.Server
ĺŽäşăŤă¤ăăŚăŞăŽă§ăăăŽăă¸ăăŻăăăŤăăźé˘ć°ă§ăŠăăăăžăăăăăŤăăźserve
ăŻăă˘ăăŹăšă¨http.Handler
ăĺć§http.ListenAndServe
ăŤstop
ăăĄă˝ăăăŽĺŽčĄăŤä˝żç¨ăăăăŁăăŤăĺăĺ
ĽăăžăShutdown
ă func serve(addr string, handler http.Handler, stop <-chan struct{}) error { s := http.Server{ Addr: addr, Handler: handler, } go func() { <-stop
ăăŁăłăăŤăŽĺĺ¤ăŤĺŻžăăŚăăăŁăłăăŤdone
ăéăăžăstop
ăăăăŤăăăăăŽăăŁăłăăŤăŽĺă´ăŤăăłăçŹčŞăŤéăăžăhttp.Server
ăăăăŤăăăćŽăăŽgoroutinesăăăšăŚčżăăListenAndServe
ăžăăĺŽčĄä¸ăŽgorutinăăăšăŚĺć˘main.main
ăăă¨ăçľäşăăăăăťăšăĺŽĺ
¨ăŤĺć˘ăăžăăĺč°äźăăăŽăăăŞăă¸ăăŻăčŞĺă§č¨čż°ăăăă¨ăŻăçš°ăčżăăŽä˝ćĽă§ăăăééăăŽăŞăšăŻă§ăăăťă¨ăăŠăŽä˝ćĽăčĄăăăŽăăăąăźă¸ăŽăăăŞăăŽăčŚăŚăă ăăă