Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DESAMIS Go Training Season 1 Day 7

DESAMIS Go Training Season 1 Day 7

デザミス社内 Go 研修 (第1期) の7日目の資料です。
今回は社内で広く使われている Heroku を Go で開発するためのハンズオンを行います。Go の標準ライブラリである http (サーバー機能) と html/template の説明も行います。

Yutaka Kato

June 01, 2021
Tweet

More Decks by Yutaka Kato

Other Decks in Technology

Transcript

  1. ݚमܭը ճ ೔࣍ ༧ఆ λΠτϧ ୈճ  Ր  (Pͷجຊ

    ୈճ  Ր  ؀ڥߏஙͱ(JU (JU)VCͷجຊ ୈճ  Ր  جຊߏจ ୈճ  Ր  ߏ଄ମɺεϥΠεɺϚοϓ ୈճ  Ր  ඪ४ϥΠϒϥϦ͸΍Ί͙Γ ୈճ  Ր  ϞδϡʔϧγεςϜͱ֎෦ϥΠϒϥϦ ୈճ  Ր  )FSPLV(Pೖ໳ ୈճ  Ր  "84-BNCEB(Pೖ໳ ୈճ  Ր  ฒߦॲཧϓϩάϥϛϯά ୈճ  Ր  ୯ମςετٕ๏ ୈճ  Ր  σʔλϕʔεΞΫηε ୈճ  Ր  'ZOFʹΑΔ(6*ΞϓϦέʔγϣϯ։ൃ ୈճ  Ր  ࣾ಺(PϓϩδΣΫτͷίʔυղઆ 
  2. )FSPLVͷ࢓૊Έ  ιʔείʔυ #VJMEQBDLT 4MVH Ϗϧυ 
 4MVH$PNQJMF %ZOPT σϓϩΠ

    
 ϦϦʔε 
 ࣮ߦ )FSPLVϓϥοτϑΥʔϜ )FSPLV3PVUFS 8FCτϥϑΟοΫ "EEPOT
  3. ྉۚମܥ  1MBO $16 ϝϞϦ උߟ ݄EZOP 'SFF W$16 .#

    ෼ΞΫηε 
 ͳ͠ͰεϦʔϓ  )PCCZ W$16 .# 5FBNTͰ 
 બ΂Δ࠷খαΠζ  4UBOEBSEY W$16 .# &OUFSQSJTFͰ 
 બ΂Δ࠷খαΠζ  4UBOEBSEY W$16 (#   1FSGPSNBODF. ઐ༗ (#   1FSGPSNBODF- ઐ༗ (#   ৄࡉ͸IUUQTXXXIFSPLVDPNEZOPT
  4. (Pͱͷ૬ੑ w )FSPLVͷ࠷খϓϥϯ͸ϝϞϦ͕গͳ্͍εέʔϧΞοϓ͸ߴՁ w ϝϞϦ࢖༻ޮ཰͕ߴ͍(P͸࠷খίετͷ··େ͖ͳ࢓ࣄ͕Ͱ͖Δ w Ϗϧυ࣌ؒ ෼ ɺ4MVHαΠζ .#

    ͳͲͷ੍໿͕͋Δ w ίϯύΠϧ͕ߴ଎Ͱ࣮ߦόΠφϦ͸ແବ͕࡟͗མͱ͞ΕΔ(P͸ 
 ֤छ੍໿Λड͚ʹ͍͘ w શͯͷ)FSPLVͷϓϩηε͸೔ճ࠶ىಈ $ZDMJOH ͕͔͔Δ w %ZOP࣌ʹ͸μ΢ϯλΠϜ͕ൃੜ͢Δ͕ɺ(PͳΒىಈ͕ߴ଎ͳ ͷͰ$ZDMJOHͷӨڹΛ࠷খݶʹͰ͖Δ 
  5. )FSPLV։ൃͷᎄ w 5IF5XFMWF'BDUPS"QQ"EBN8JHHJOT )FSPLV ։ൃऀ ͕ఏএͨ͠Ϟμϯ8FCΞϓϦ։ൃͷํ๏࿦ w จࣈ௨Γ߲໨͔ΒͳΔ  ίʔυϕʔε

    ґଘؔ܎ ઃఆ όοΫΤϯυαʔϏε ϏϧυɺϦϦʔεɺ࣮ߦ ϓϩηε ϙʔτόΠϯσΟϯά ฒߦੑ ഇغ༰қੑ ։ൃຊ൪Ұக ϩά ؅ཧϓϩηε 👉IUUQTGBDUPSOFUKB
  6. 45&1ϦϙδτϦͷ࡞੒  IUUQTHJUIVCDPNOFX 
 ʹΞΫηε͠ɺҎԼΛೖྗ 0XOFS ࣗ෼ͷΞΧ΢ϯτ 3FQPTJUPSZ/BNF IFSPLVHPUPPMCPY %FTDSJQUJPO

    ྫ )FSPLV(PͰ࡞ͬͨಓ۩ശ 1VCMJD1SJWBUF 1VCMJD˞ "EEB3&"%.& fi MF ☑ νΣοΫ "EEHJUJHOPSF ☑UFNQMBUF(P $IPPTFBMJDFOTF ೚ҙ ˞ߨࢣʹΑΔϑΥϩʔΛԁ׈ʹ͢ΔͨΊͰ͋Γɺٕज़తͳ੍໿Ͱ͸͋Γ·ͤΜ
  7. 45&1ϦϙδτϦͷෳ੡   74$PEFΛ։͖ʮΑ͏ͦ͜ʯը໘Λදࣔͤ͞·͢ 
 ϝχϡʔͷ<ϔϧϓ><Α͏ͦ͜>Ͱݺͼग़͠Մೳ   ʮ(JUϦϙδτϦͷΫϩʔϯʜʯΛΫϦοΫ͠·͢ 

    ೖྗ૭ʹ͋Δʮ(JU)VC͔Βෳ੡ʯΛબ୒͠·͢  ʮ(JU)VCϢʔβʔIFSPLVHPUPPMCPYʯͱλΠϓ͠ɺબ୒͠·͢  ʮϗʔϜσΟϨΫτϦTSDHJUIVCDPN(JU)VCϢʔβʔʯͷϑΥϧμʹೖ Γ·͢ (JU)VCϢʔβʔͷͱ͜Ζ͸ઌि࡞ͬͨ͸ͣͰ͢   ʮϦϙδτϦͷ৔ॴΛબ୒ʯϘλϯΛΫϦοΫ͠·͢  μΠΞϩά͕ग़ΔͷͰʮ։͘ʯϘλϯΛΫϦοΫ͠·͢
  8. 45&1NBJOHP  package mai n // import লུ.. . func

    handleHome(w http.ResponseWriter, r *http.Request) { log.Printf("%s %s", r.Method, r.RequestURI ) w.Write([]byte("͜Μʹͪ͸ʂ") ) } func main() { port := os.Getenv("PORT") // ࣮ߦ࣌ʹ Heroku ͕ࢦఆ͢Δϙʔτ൪߸Λऔಘ if len(port) == 0 { port = "8080" // ϩʔΧϧͰ࣮ߦ͢Δͱ͖ͷϙʔτ൪߸Λࢦఆ } http.HandleFunc("/", handleHome ) log.Printf("ϙʔτ %s Ͱ଴ͪड͚Λ։࢝͠·͢...", port ) if err := http.ListenAndServe(":"+port, nil); err != nil { log.Printf("αʔόʔ͕ҟৗऴྃ͠·ͨ͠: %v", err ) } }
  9. ௥Ճͯ͠ΈΑ͏  func handleSecret(w http.ResponseWriter, r *http.Request) { user, password,

    _ := r.BasicAuth( ) if user != "user" || password != "password" { w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"` ) http.Error(w, "ೝূʹࣦഊ͠·ͨ͠", http.StatusUnauthorized ) retur n } log.Printf("%s %s", r.Method, r.RequestURI ) w.Write([]byte("ൿີͷϖʔδͰ͢ʂ") ) } http.HandleFunc("/", handleHome) http.HandleFunc("/secret", handleSecret) // ௥Ճ log.Printf("ϙʔτ %s Ͱ଴ͪड͚Λ։࢝͠·͢...", port) NBJOHPͷNBJO ͷதʹ௥Ճ NBJOHP಺ʹ௥Ճ
  10. IUNMUFNQMBUFͱ͸ w ඪ४ϥΠϒϥϦͷ)5.-ςϯϓϨʔτΤϯδϯ w ଞʹ͸൚༻ͷUFYUUFNQMBUF͕͋Δ ϝʔϧૹ৴ͳͲͰ໾ཱͭ  w γϯϓϧͳ͕ΒॊೈͰڧྗͳػೳΛ࣋ͭ 

    <p>ࠓ೔ͷఱؾ͸{{.Weather}}Ͱ͢ɻ</p > <p>࠷ߴؾԹ͸{{printf "%.1f" .Temp}}℃Ͱ͢ɻ</p > {{if eq .Weather "੖"} } <p>෍ஂΛׯ͠·͠ΐ͏ɻ</p > {{end}} ࣜͷॻ͖ํ͸ϙʔϥϯυه๏ 1PMJTI/PUBUJPO
  11. ςϯϓϨʔτͷར༻  UFNQMBUFσΟϨΫτϦΛ࡞੒ɺͦͷதʹ JOEFYHPIUNMΛ࡞੒͠·͢  ҎԼͷίʔυΛೖྗ͠·͢  <!DOCTYPE html >

    <html lang="ja" > <head > <meta charset="UTF-8" > <title>ಓ۩ശ</title > </head > <body > <h1>Α͏ͦ͜ {{.UserName}} ͞Μʂ</h1 > <p>ݱࡏ࣌ࠁ͸ {{.Time.Format "2006/1/2 15:04:05"}} Ͱ͢ɻ</p > </body > </html>
  12. ύʔεͱ࣮ߦ  t := template.Must(template.ParseFiles("template/index.gohtml") ) if err := t.Execute(w,

    struct { UserName strin g Time time.Tim e } { “ήετ" , time.Now() , }); err != nil { log.Printf("ςϯϓϨʔτ %s ͷ࣮ߦʹࣦഊʂ: %v", t.Name(), err ) http.Error(w, "಺෦ΤϥʔͰ͢", http.StatusInternalServerError ) } IBOEMF)PNF ಺Λ࡟আ͠ɺҎԼΛೖྗ ࠶౓αʔόʔΛىಈ͢Δͱʜ
  13. ςϯϓϨʔτͷ෦඼Խ  {{define "menu"} } <nav style="float: right; padding: 0.8rem;

    background: whitesmoke;" > Men u <ul > <li><a href="/">Home</a></li > <li><a href="/secret">Secret</a></li > </ul > </nav > {{end}} UFNQMBUF@NFOVHPIUNM˞Λ࡞੒͠ɺҎԼΛೖྗ UFNQMBUFJOEFYHPIUNMͷCPEZͷԼ͋ͨΓʹҎԼΛ௥Ճ {{template "menu"}} IBOEMF)PNF ಺ͷUFNQMBUF1BSTF'JMFT ݺͼग़͠ΛҎԼͷΑ͏ʹมߋ template.ParseFiles("template/index.gohtml", "template/_menu.gohtml") ˞ʮ@ʯ͸෦඼Ͱ͋Δ͜ͱΛ໊લͰڧௐ͍͚ͨͩ͠
  14. ศརϥΠϒϥϦɾ'8 w 0"VUIΫϥΠΞϯτΛ࣮૷͍ͨ͠ 
 ˠHPMBOHPSHYPBVUI͕͓͢͢Ί w VTFSTJEΈ͍ͨͳύεύϥϝʔλʔΛड͚͍ͨ 
 ˠHJUIVCDPNHPSJMMBNVY͕͓͢͢Ί w

    ͍ΘΏΔϑϨʔϜϫʔΫͳͲ 
 ˠHJO CFFHP FDIP HPB౳ଟ਺͋Δ͕ɺ·ͣ͸ ඪ४ϥΠϒϥϦΛ͔ͬ͠Γ࢖͍͜ͳ͢ͷ͕Α͍ 
  15. ͳ'SFF%ZOP w ·ͣ͸ΫϨδοτΧʔυΛొ࿥ͯ͠ʮೝূࡁΈΞΧ΢ϯτʯʹ ͢Δ w ݄͋ͨΓͷແྉ࿮͕͔࣌ؒΒ ࣌ؒʹͳΔ w )FSPLV"EEPOT͕ར༻ՄೳʹͳΔ w

    )FSPLV4DIFEVMFS"EEPOΛΞϓϦʹ௥ՃɺʮDVSM IUUQTΞϓϦ໊IFSPLVBQQDPNʯίϚϯυΛఆظ࣮ߦ ͤ͞Δ w 6QUJNF3PCPU΍/FX3FMJD4ZOUIFUJDTͳͲͰ΋Α͍
  16. ࿅श՝୊ w ࿅श՝୊ w ৽͍͠ϖʔδΛ௥Ճ͍ͯͩ͘͠͞ 
 63-ɺϑΝΠϧ໊ɺ಺༰౳͸શͯࣗ༝  w ࿅श՝୊

    w )FSPLVΞϓϦʹ؀ڥม਺ $PO fi H7BST Λઃఆ͢ Δํ๏Λௐ΂ɺ#BTJDೝূͷϢʔβʔ໊ͱύεϫʔυ Λ؀ڥม਺͔ΒಡΉΑ͏ʹมߋ͍ͯͩ͘͠͞ 
 ઃఆ஋͸ଞͷαʔϏε౳Ͱ࢖͍ͬͯͳ͍΋ͷʹ͍ͯͩ͘͠͞ 
  17. ίʔυΛॻ͖ऴ͑ͨΒ w มߋΛεςʔδ͠ɺίϛοτ͍ͯͩ͘͠͞ w 74$PEFͷࠨϝχϡʔͷʮιʔε؅ཧʯ͔Βૢ࡞ w ίʔυΛ(JU)VCʹϓογϡ͍ͯͩ͘͠͞ w 74$PEFͷҰ൪ࠨԼͷϒϥϯν໊ͷ͙͢ӈʹ͋ΔΞΠίϯ͔ Βૢ࡞

    w )FSPLVʹσϓϩΠ͍ͯͩ͘͠͞ ࣗಈσϓϩΠΛߏ੒ͯ͠΋ྑ͍  w ࣾ಺4MBDLHPQIFSTʹ)FSPLVΞϓϦͷ63-ΛషΓ෇͚ͯ൸ ࿐͍ͯͩ͘͠͞