Slide 1

Slide 1 text

;ΜΘΓཧղ͢ΔDPOUFYU ʰ-FUT(P5BMLʱ !SVLJBEJB 4IP:BNBEB

Slide 2

Slide 2 text

ܰࣗ͘ݾ঺հ • ࢁాɹ঵ʢ΍·ͩɹ͠ΐ͏ʣ • Twitter : @rukiadia • גࣜձࣾάϥϑΝʔͱ͍͏ձࣾͰProduct Developerͱ͍͏ݞॻ͖Ͱ ಇ͍ͯ·͢ɻ • ʮGo / GinʯɺʮTypeScript / React ʯΛॻ͘৔໘͕ଟΊɻ

Slide 3

Slide 3 text

ࠓ೔ͷ-5ͷϞνϕʔγϣϯ w งғؾͰ(PΛॻ͚ΔΑ͏ʹ͸ͳͬͨɻ w ˠ͋Δ೔ɺ$POUFYUΛ࢖ͬͯԿ͕خ͍͠ͷ͔ؾʹͳΓ࢝Ίͨɻ w ˠԿΛ໨తͱٕज़ͳͷ͔Λௐ΂ͨ͘ͳͬͨɻ

Slide 4

Slide 4 text

ͦΕͰ͸ຊ୊΁

Slide 5

Slide 5 text

͜͏͍͏ίʔυɺݟͨ͜ͱ͋Γ·ͤΜ͔ʁ func logic(ctx context.Context, info string) (string, error) { // ctxΛ༻͍ͯԿ͔͠ΒͷॲཧΛ࣮ߦ return "", nil } ༨ஊ DPOUFYU$POUFYUΛୈҰҾ਺ʹ౉͢ͷ͸ (Pͷ׳श

Slide 6

Slide 6 text

DPOUFYUΛௐ΂ͯ໨ʹೖͬͨϑϨʔζ w DPOUFYU͸ฒߦॲཧͷͨΊͷ࢓૊Έ w DPOUFYU͸HPSPVUJOFʢΰϧʔνϯʣΛ੍ޚ͢ΔͨΊͷ࢓૊Έ w ˠʮHPSPVUJOFͷͨΊʹ࡞ΒΕͨʯͱ͍͏ҙຯͷଊ͑ํ΋Ͱ͖ͯ͠ ·͏ͷͰɺͦͷଊ͑ํ͸ਖ਼֬Ͱ͸ͳ͍ɻ

Slide 7

Slide 7 text

DPOUFYU͕ੜ·ΕͨܦҢ w αʔόʔͷϦΫΤετͷϝλσʔλΛॲཧ͢Δํ๏͕ඞཁͩͬͨͷͰ ࡞ΒΕͨɻ w ͜͜Ͱ͍͏ʮϝλσʔλʯͱ͸ҎԼͷͭΛҙຯ͢Δɻ w ϦΫΤετΛॲཧ͢ΔϩδοΫʹඞཁͳϝλσʔλ w ϦΫΤετΛ͍ͭఀࢭ͢Δͷ͔Λ஌Δϝλσʔλ

Slide 8

Slide 8 text

HPSPVUJOFʹ͍ͭͯͷิ଍ w ʮϝλσʔλͰHPSPVUJOFΛ੍ޚ͢Δʯ͸DPOUFYUͷଆ໘ͷͭ w ʮ͍ͭࢭΊΔͷ͔ʁʯͷ৘ใΛDPOUFYUܦ༝Ͱ౉͢ɺͱ͍͏ڍಈͱ ͳΔɻ w ͭ·ΓɺʮDPOUFYUͷ༻్ͷͭͱͯ͠ɺHPSPVUJOFͷ੍ޚ͕ڍ͛Β ΕΔʯͱදݱ͢Δͷ͕ਖ਼֬ͳͷͰ͸ͳ͍͔ʁͱ͍͏ͷ͕ݱ࣌఺Ͱͷ ߟ͑ɻ

Slide 9

Slide 9 text

ࠓճ͸ϝλσʔλͷѻ͍ʹ͍ͭͯ ܰ͘৮ΕͯऴΘΔ༧ఆͰ͢

Slide 10

Slide 10 text

DPOUFYUͷΠϯλϑΣʔε type Context interface { // ఀࢭ͕εέδϡʔϧ͞Εͨ࣌ؒɺεέδϡʔϧ͞Ε͍ͯΔ͔Ͳ͏͔ͷbooleanΛฦ٫ Deadline() (deadline time.Time, ok bool) // λΠϜΞ΢τɺΩϟϯηϧͳͲʹΑΔcontextͷ׬ྃΛ௨஌͢Δνϟωϧ Done() <-chan struct{} // ׬ྃͨ͠ཧ༝Λฦ٫͢Δ Err() error // key:valueͰอ͍࣋ͯ͠Δ஋Λฦ͢ Value(key interface{}) interface{} }

Slide 11

Slide 11 text

λΠϜΞ΢τͤ͞ΔDPOUFYUΛॻ͍ͨྫ func main() { ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() start := time.Now() <-ctx.Done() // contextͷऴྃΛνϟωϧͰड͚औΔ end := time.Now() fmt.Println(end.Sub(start)) // 3s ͱදࣔ͞ΕΔ }

Slide 12

Slide 12 text

)551ϦΫΤετͷλΠϜΞ΢τྫ func getHTTPResponse(url string) (*http.Response, error) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() // contextΛΩϟϯηϧ client := &http.Client{} req, _ := http.NewRequest("GET", url, nil) res, err := client.Do(req.WithContext(ctx)) if err != nil { // Ϩεϙϯεऔಘ·Ͱʹ10ඵ͕ܦաͨ͠৔߹ɺ͜͜ͰΤϥʔ // ctx.Err()͕ʮcontext deadline exceededʯΛฦ݁͢ՌʹͳΔ return nil, err } return res, nil } ༨ஊ DPOUFYUͷ༻్͕HPSPVUJOFʹݶఆ͞Εͳ͍ ͜ͱ͕ݟͯͱΕΔ

Slide 13

Slide 13 text

)551ϦΫΤετͷλΠϜΞ΢τͷิ଍ client := &http.Client{} req, _ := http.NewRequest("GET", url, nil) res, err := client.Do(req.WithContext(ctx)) // ϦΫΤετ͸͜͜ͰԿΛ࣮ߦ͍ͯ͠Δʁ ※req.WithContext͸ʮݱࡏͷϦΫΤετʯͱʮ౉͞ΕͨcontextʯΛ૊Έ߹Θͤͨ৽͍͠http.RequestΛ ฦΓ஋ͱͯ͠ฦ͢ɻ͜ͷ࢓૊ΈʹΑͬͯɺcontextͷcancelΛhttp.Requestʹ఻͑Δ͜ͱ͕Մೳͱͳ͍ͬͯ Δɻ

Slide 14

Slide 14 text

OFUIUUQύοέʔδʹؔ͢Δิ଍ w DPOUFYU͕(PͰඪ४ʹͳͬͨͷ͸(P͔ΒͰɺOFUIUUQύοέʔ δ͕࡞੒͞Εͨޙͷग़དྷࣄɻ w DPOUFYUΛ༻͍ͨΩϟϯηϧͷ࢓૊ΈΛIUUQʹఏڙ͍͕ͨ͠ɺ(Pͷޓ ׵ੑ͸ҡ࣋͞Εͳ͚Ε͹ͳΒͳ͍ɻ w ͦͷ݁ՌɺΠϯλϑΣʔεΛมߋ͢Δ͜ͱ͸ͤͣɺIUUQ3FRVFTUʹ ৽ͨͳϝιουΛ௥Ճ͢Δͱ͍͏Ξϓϩʔν͕બ୒͞Εͨɻ w ˞௥Ճ͞Εͨϝιουͷ͕ͭઌఔ৮ΕͨʮIUUQ3FRVFTU8JUI$POUFYUʯ

Slide 15

Slide 15 text

ϩδοΫʹඞཁͳϝλσʔλͷ࿩Λ গ͚ͩ͠͠·͢

Slide 16

Slide 16 text

͜͏͍͏ίʔυɺݟͨ͜ͱ͋Γ·ͤΜ͔ʁʢճ໨ʣ func AttachContextWithUser(ctx context.Context, user string) context.Context { return context.WithValue(ctx, "user", user) } func GetUserFromContext(ctx context.Context) (string, bool) { user, ok := ctx.Value("user").(string) return user, ok } func main() { ctx := AttachContextWithUser(context.Background(), "my name") user, _ := GetUserFromContext(ctx) fmt.Println(user) // my name }

Slide 17

Slide 17 text

$POUFYUͷΠϯλϑΣʔεʢ࠶ܝʣ type Context interface { // …தུ // key:valueͰอ͍࣋ͯ͠Δ஋Λฦ͢ Value(key interface{}) interface{} } ※Contextʹ͸ఀࢭॲཧҎ֎ʹɺkey-valueܗࣜͰ஋Λอ࣋͢ΔೖΕ෺͕͋Γ·͢ɻ WebΞϓϦΛ࡞ΔࡍɺϦΫΤετͷத਎ʢϦΫΤετϔομʔ౳ʣΛcontext͔Βऔಘ͢Δͷ͸Α͋͘Δύλʔϯɻ ͭ·ΓɺWebΞϓϦʹ͓͍ͯcontext͸ʮϦΫΤετͷ஋͕֨ೲ͞ΕΔ৔ॴʯͱදݱͰ͖·͢ɻ ϩδοΫʹඞཁͳϝλσʔλΛ อ࣋͢Δ࢓૊Έ͕7BMVF

Slide 18

Slide 18 text

·ͱΊ w DPOUFYU͸αʔόʔͷϦΫΤετͷϝλσʔλΛॲཧ͢Δ໨తͰ࡞Β Εͨɻ w ʮϝλσʔλʯͱ͸ҎԼͷͭΛҙຯ͢Δɻ w ϦΫΤετΛॲཧ͢ΔϩδοΫʹඞཁͳϝλσʔλ w ϦΫΤετΛ͍ͭఀࢭ͢Δͷ͔Λ஌Δϝλσʔλ

Slide 19

Slide 19 text

ࢀߟࢿྉ w ެࣜυΩϡϝϯτ w IUUQTQLHHPEFWDPOUFYU w ʰ(P$VSSFODZ1BUUFSOT$POUFYUʱ w IUUQTHPEFWCMPHDPOUFYU w ʰվగ൛ΈΜͳͷ(Pݴޠʱ w IUUQTHJIZPKQCPPL w ʰ-FBSOJOH(P"O*EJPNBUJD"QQSPBDIUP3FBM8PSME(P1SPHSBNNJOHʱ w IUUQTXXXBNB[PODPKQEQ

Slide 20

Slide 20 text

ۦ͚଍ͷઆ໌Ͱ͕ͨ͠ɺ DPOUFYUΛཧղ͢Δ खॿ͚ʹͳΕ͹޾͍Ͱ͢ɻ

Slide 21

Slide 21 text

ൃදʹର͢ΔϑΟʔυόοΫ͸ େ׻ܴͰ͢ʂ

Slide 22

Slide 22 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ