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

ふんわり理解するcontext

 ふんわり理解するcontext

https://connehito.connpass.com/event/251002/ で使用したLTの資料です。

参考書籍のURL
・公式ドキュメント
https://pkg.go.dev/context
・『Go Currency Patterns : Context』
https://go.dev/blog/context
・『改訂2版 みんなのGo言語』
https://gihyo.jp/book/2019/978-4-297-10727-7
・『Learning Go: An Idiomatic Approach to Real-World Go Programming』
https://www.amazon.co.jp/dp/1492077216

438799c739f93d00abc30fa2da33c543?s=128

TwitterID:@rukiadia

July 06, 2022
Tweet

More Decks by TwitterID:@rukiadia

Other Decks in Programming

Transcript

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

  2. ܰࣗ͘ݾ঺հ • ࢁాɹ঵ʢ΍·ͩɹ͠ΐ͏ʣ • Twitter : @rukiadia • גࣜձࣾάϥϑΝʔͱ͍͏ձࣾͰProduct Developerͱ͍͏ݞॻ͖Ͱ

    ಇ͍ͯ·͢ɻ • ʮGo / GinʯɺʮTypeScript / React ʯΛॻ͘৔໘͕ଟΊɻ
  3. ࠓ೔ͷ-5ͷϞνϕʔγϣϯ w งғؾͰ(PΛॻ͚ΔΑ͏ʹ͸ͳͬͨɻ w ˠ͋Δ೔ɺ$POUFYUΛ࢖ͬͯԿ͕خ͍͠ͷ͔ؾʹͳΓ࢝Ίͨɻ w ˠԿΛ໨తͱٕज़ͳͷ͔Λௐ΂ͨ͘ͳͬͨɻ

  4. ͦΕͰ͸ຊ୊΁

  5. ͜͏͍͏ίʔυɺݟͨ͜ͱ͋Γ·ͤΜ͔ʁ func logic(ctx context.Context, info string) (string, error) { //

    ctxΛ༻͍ͯԿ͔͠ΒͷॲཧΛ࣮ߦ return "", nil } ༨ஊ DPOUFYU$POUFYUΛୈҰҾ਺ʹ౉͢ͷ͸ (Pͷ׳श
  6. DPOUFYUΛௐ΂ͯ໨ʹೖͬͨϑϨʔζ w DPOUFYU͸ฒߦॲཧͷͨΊͷ࢓૊Έ w DPOUFYU͸HPSPVUJOFʢΰϧʔνϯʣΛ੍ޚ͢ΔͨΊͷ࢓૊Έ w ˠʮHPSPVUJOFͷͨΊʹ࡞ΒΕͨʯͱ͍͏ҙຯͷଊ͑ํ΋Ͱ͖ͯ͠ ·͏ͷͰɺͦͷଊ͑ํ͸ਖ਼֬Ͱ͸ͳ͍ɻ

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

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

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

  10. DPOUFYUͷΠϯλϑΣʔε type Context interface { // ఀࢭ͕εέδϡʔϧ͞Εͨ࣌ؒɺεέδϡʔϧ͞Ε͍ͯΔ͔Ͳ͏͔ͷbooleanΛฦ٫ Deadline() (deadline time.Time,

    ok bool) // λΠϜΞ΢τɺΩϟϯηϧͳͲʹΑΔcontextͷ׬ྃΛ௨஌͢Δνϟωϧ Done() <-chan struct{} // ׬ྃͨ͠ཧ༝Λฦ٫͢Δ Err() error // key:valueͰอ͍࣋ͯ͠Δ஋Λฦ͢ Value(key interface{}) interface{} }
  11. λΠϜΞ΢τͤ͞Δ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 ͱදࣔ͞ΕΔ }
  12. )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ʹݶఆ͞Εͳ͍ ͜ͱ͕ݟͯͱΕΔ
  13. )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ʹ఻͑Δ͜ͱ͕Մೳͱͳ͍ͬͯ Δɻ
  14. OFUIUUQύοέʔδʹؔ͢Δิ଍ w DPOUFYU͕(PͰඪ४ʹͳͬͨͷ͸(P͔ΒͰɺOFUIUUQύοέʔ δ͕࡞੒͞Εͨޙͷग़དྷࣄɻ w DPOUFYUΛ༻͍ͨΩϟϯηϧͷ࢓૊ΈΛIUUQʹఏڙ͍͕ͨ͠ɺ(Pͷޓ ׵ੑ͸ҡ࣋͞Εͳ͚Ε͹ͳΒͳ͍ɻ w ͦͷ݁ՌɺΠϯλϑΣʔεΛมߋ͢Δ͜ͱ͸ͤͣɺIUUQ3FRVFTUʹ ৽ͨͳϝιουΛ௥Ճ͢Δͱ͍͏Ξϓϩʔν͕બ୒͞Εͨɻ

    w ˞௥Ճ͞Εͨϝιουͷ͕ͭઌఔ৮ΕͨʮIUUQ3FRVFTU8JUI$POUFYUʯ
  15. ϩδοΫʹඞཁͳϝλσʔλͷ࿩Λ গ͚ͩ͠͠·͢

  16. ͜͏͍͏ίʔυɺݟͨ͜ͱ͋Γ·ͤΜ͔ʁʢճ໨ʣ 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 }
  17. $POUFYUͷΠϯλϑΣʔεʢ࠶ܝʣ type Context interface { // …தུ // key:valueͰอ͍࣋ͯ͠Δ஋Λฦ͢ Value(key

    interface{}) interface{} } ※Contextʹ͸ఀࢭॲཧҎ֎ʹɺkey-valueܗࣜͰ஋Λอ࣋͢ΔೖΕ෺͕͋Γ·͢ɻ WebΞϓϦΛ࡞ΔࡍɺϦΫΤετͷத਎ʢϦΫΤετϔομʔ౳ʣΛcontext͔Βऔಘ͢Δͷ͸Α͋͘Δύλʔϯɻ ͭ·ΓɺWebΞϓϦʹ͓͍ͯcontext͸ʮϦΫΤετͷ஋͕֨ೲ͞ΕΔ৔ॴʯͱදݱͰ͖·͢ɻ ϩδοΫʹඞཁͳϝλσʔλΛ อ࣋͢Δ࢓૊Έ͕7BMVF
  18. ·ͱΊ w DPOUFYU͸αʔόʔͷϦΫΤετͷϝλσʔλΛॲཧ͢Δ໨తͰ࡞Β Εͨɻ w ʮϝλσʔλʯͱ͸ҎԼͷͭΛҙຯ͢Δɻ w ϦΫΤετΛॲཧ͢ΔϩδοΫʹඞཁͳϝλσʔλ w ϦΫΤετΛ͍ͭఀࢭ͢Δͷ͔Λ஌Δϝλσʔλ

  19. ࢀߟࢿྉ w ެࣜυΩϡϝϯτ w IUUQTQLHHPEFWDPOUFYU w ʰ(P$VSSFODZ1BUUFSOT$POUFYUʱ w IUUQTHPEFWCMPHDPOUFYU w

    ʰվగ൛ΈΜͳͷ(Pݴޠʱ w IUUQTHJIZPKQCPPL w ʰ-FBSOJOH(P"O*EJPNBUJD"QQSPBDIUP3FBM8PSME(P1SPHSBNNJOHʱ w IUUQTXXXBNB[PODPKQEQ
  20. ۦ͚଍ͷઆ໌Ͱ͕ͨ͠ɺ DPOUFYUΛཧղ͢Δ खॿ͚ʹͳΕ͹޾͍Ͱ͢ɻ

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

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