{"version":3,"sources":["webpack:///./src/assets/images/deriving_context.png","webpack:///./src/assets/images/doWorkFunction.png","webpack:///./src/assets/images/linked_list_pointers.png","webpack:///./src/assets/images/cancellation_propagation.png","webpack:///./src/assets/images/request_context.png","webpack:///./src/assets/images/cancellation_propagation_2.png","webpack:///./src/assets/images/linked_list.png","webpack:///./src/views/Chap37Context.vue?123b","webpack:///src/views/Chap37Context.vue","webpack:///./src/views/Chap37Context.vue?a59c","webpack:///./src/views/Chap37Context.vue","webpack:///./src/assets/images/timeout_deadline.png","webpack:///./src/assets/images/withCancel.png","webpack:///./src/assets/images/withCancel3Derivatin.png","webpack:///./src/assets/images/ctx_4_levels.png","webpack:///./src/assets/images/serverWithTimeout.png","webpack:///./src/assets/images/server_client_timeout.png"],"names":["module","exports","render","_vm","this","_h","$createElement","_c","_self","staticClass","attrs","_v","directives","name","rawName","pre","staticRenderFns","components","FeedbackInvite","BuyCopyInvite","NewsletterInput","ChapterHeading","ChapterBibliography","TOCChapter","NavBar","BIconLink45deg","Footer","created","window","data","publicPath","metaInfo","title","htmlAttrs","lang","meta","charset","content","property","link","rel","href","component"],"mappings":"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","file":"js/chunk-2736db0e.09682023.js","sourcesContent":["module.exports = __webpack_public_path__ + \"img/deriving_context.ad1f8dc6.png\";","module.exports = __webpack_public_path__ + \"img/doWorkFunction.15397b29.png\";","module.exports = __webpack_public_path__ + \"img/linked_list_pointers.3614379a.png\";","module.exports = __webpack_public_path__ + \"img/cancellation_propagation.7f4e0613.png\";","module.exports = __webpack_public_path__ + \"img/request_context.77c1b04c.png\";","module.exports = __webpack_public_path__ + \"img/cancellation_propagation_2.51cb103e.png\";","module.exports = __webpack_public_path__ + \"img/linked_list.2f868379.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('NavBar'),_c('div',{staticClass:\"container-fluid\"},[_c('b-row',[_c('TOCChapter',{attrs:{\"chapter-id\":\"Chap37Context\"}}),_c('b-col'),_c('b-col',{attrs:{\"role\":\"main\",\"md\":\"6\"}},[_c('ChapterHeading',{attrs:{\"chapter-title\":\"Chapter 37: Context\",\"image-name\":\"context.jpg\",\"image-alt\":\"Context\"}}),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"what-will-you-learn-in-this-chapter\"}}),_c('h1',{attrs:{\"data-number\":\"1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"1\")]),_vm._v(\" What will you learn in this chapter? \"),_c('a',{attrs:{\"href\":\"#what-will-you-learn-in-this-chapter\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"What is context?\")])]),_c('li',[_c('p',[_vm._v(\"What is a linked list?\")])]),_c('li',[_c('p',[_vm._v(\"How to use the context package.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"technical-concepts-covered\"}}),_c('h1',{attrs:{\"data-number\":\"2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"2\")]),_vm._v(\" Technical concepts covered \"),_c('a',{attrs:{\"href\":\"#technical-concepts-covered\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Context derivation\")])]),_c('li',[_c('p',[_vm._v(\"Linked list\")])]),_c('li',[_c('p',[_vm._v(\"Context key-value pair\")])]),_c('li',[_c('p',[_vm._v(\"Cancellation\")])]),_c('li',[_c('p',[_vm._v(\"Timeout\")])]),_c('li',[_c('p',[_vm._v(\"Deadline\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"introduction\"}}),_c('h1',{attrs:{\"data-number\":\"3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"3\")]),_vm._v(\" Introduction \"),_c('a',{attrs:{\"href\":\"#introduction\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"This chapter is dedicated to the context package. In the first part of this chapter, we will discover what is a “context” and what its purposes are. In the second part, we will see how we can use the context package in real-life programs.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"what-is-context-oriented-programming\"}}),_c('BuyCopyInvite'),_c('h1',{attrs:{\"data-number\":\"4\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4\")]),_vm._v(\" What is Context Oriented Programming? \"),_c('a',{attrs:{\"href\":\"#what-is-context-oriented-programming\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"definition\"}}),_c('h2',{attrs:{\"data-number\":\"4.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.1\")]),_vm._v(\" Definition \"),_c('a',{attrs:{\"href\":\"#definition\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Context comes from the Latin word “contexo”. It means to unite, connect, link something with a group of other things. We have here the idea that the context of something is a set of links and connections with other things. In the day to day language, we use expressions like :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Take something out of context.\")])]),_c('li',[_c('p',[_vm._v(\"In the context of something.\")])])]),_c('p',[_vm._v(\"Things, actions, words have a context, have links with other things. And if we take something out of its context, we reduce it to something that we can misunderstand. Context is an aggregation of information that improves decisions. What is part of context? Here is a partial list :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Location\")])]),_c('li',[_c('p',[_vm._v(\"Date\")])]),_c('li',[_c('p',[_vm._v(\"History\")])]),_c('li',[_c('p',[_vm._v(\"People\")])])]),_c('p',[_vm._v(\"To better understand why context is important to us, let’s take some examples :\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"context-increase-the-understanding-of-an-event\"}}),_c('h2',{attrs:{\"data-number\":\"4.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.2\")]),_vm._v(\" Context increase the understanding of an event \"),_c('a',{attrs:{\"href\":\"#context-increase-the-understanding-of-an-event\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Imagine that during a walk, you hear a conversation between two people :\")]),_c('dl',[_c('dt',[_vm._v(\"Alice\")]),_c('dd',[_c('p',[_vm._v(\"Did you see the match last week?\")])]),_c('dt',[_vm._v(\"Bob\")]),_c('dd',[_c('p',[_vm._v(\"Yes!\")])]),_c('dt',[_vm._v(\"Alice\")]),_c('dd',[_c('p',[_vm._v(\"After this, I’m sure they will win the next one!\")])]),_c('dt',[_vm._v(\"Bob\")]),_c('dd',[_c('p',[_vm._v(\"Sure, I will bet one thousand on that\")])])]),_c('p',[_vm._v(\"They speak about a “match”. A team has won a match last week and has a lot of chance to win another match next week. We have no idea about which team and which kind of sport it is.\")]),_c('p',[_vm._v(\"The context of the conversation can help us to understand it. If the conversation is happening in New York, we can guess that it has to do with baseball or basketball because those sports are very popular there. If this conversation happens in Paris, the chance that they are speaking about football is very high.\")]),_c('p',[_vm._v(\"What we are doing here is that we add context to understand something. Here we spoke about the place. We can also add the time factor in the context of the conversation. If we know when it happened, we will be able to browse through the week’s sports results to understand better.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"context-change-behaviors\"}}),_c('h2',{attrs:{\"data-number\":\"4.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.3\")]),_vm._v(\" Context change behaviors \"),_c('a',{attrs:{\"href\":\"#context-change-behaviors\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The analysis of the context of an event will change actors’ behavior. Try to answer some of those questions :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Do you have better manners when you are in your home country and in another country?\")])]),_c('li',[_c('p',[_vm._v(\"Do you use the same language level at the office and with your family?\")])]),_c('li',[_c('p',[_vm._v(\"Do you dress like every day when you go to a job interview?\")])])]),_c('p',[_vm._v(\"The response is probably “No” to those three questions. That’s because of context. We are acting differently depending on the context. Context is affecting our behaviors. The environment has an impact on our actions and reactions.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"context-in-computer-science\"}}),_c('h2',{attrs:{\"data-number\":\"4.4\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.4\")]),_vm._v(\" Context in computer science \"),_c('a',{attrs:{\"href\":\"#context-in-computer-science\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Usually, we design computer programs to execute a predefined task. The specified routines that we have implemented are always executing the same way. The program is not changing depending on the user that is using it. Its behavior is not changing when its environment change.\")]),_c('p',[_vm._v(\"The idea of context-oriented programming is to introduce variations in programs that are influenced by context. Abowd gives an interesting definition of context in 1999 : “Context is any information that we can use to characterize the situation of an entity. An entity is a person, place, or object that is considered relevant to the interaction between a user and an application, including the user and applications themselves.”\"),_c('b-link',{staticClass:\"citation\",attrs:{\"data-cites\":\"abowd1999towards\",\"href\":\"#abowd1999towards\"}},[_vm._v(\"[@abowd1999towards]\")]),_vm._v(\".\")],1),_c('p',[_vm._v(\"Implicit and explicit information are the building blocks of the context. Programmers should consider context to build applications that can adapt their behavior at runtime.\")]),_c('p',[_vm._v(\"What does it mean to be intelligent? The word “intelligence” comes from the Latin root “intellego” which means to discern, to unravel, to notice, to realize. Something is intelligent if it can discern and understand. Introducing context into applications does not make them intelligent, but they tend to make them aware of their environment and their users.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-context-package-history-and-use-cases\"}}),_c('h1',{attrs:{\"data-number\":\"5\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5\")]),_vm._v(\" The “context” package: history and use cases \"),_c('a',{attrs:{\"href\":\"#the-context-package-history-and-use-cases\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"package-history\"}}),_c('h2',{attrs:{\"data-number\":\"5.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.1\")]),_vm._v(\" Package history \"),_c('a',{attrs:{\"href\":\"#package-history\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"This package was first developed internally by Google developers. It has been introduced in the standard library of Go. Before that, it was available in Go sub repositories\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn1\",\"id\":\"fnref1\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"1\")])]),_vm._v(\".\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"usages\"}}),_c('h2',{attrs:{\"data-number\":\"5.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.2\")]),_vm._v(\" Usages \"),_c('a',{attrs:{\"href\":\"#usages\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The context package has two main usages :\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"cancellation-propagation\"}}),_c('h4',{attrs:{\"data-number\":\"5.2.0.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.2.0.1\")]),_vm._v(\" Cancellation propagation \"),_c('a',{attrs:{\"href\":\"#cancellation-propagation\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"To understand this usage, let’s take the example of an imaginary construction company named FooBar.\")]),_c('p',[_vm._v(\"Paris’s city has missioned this company to build a gigantic pool. The mayor of Paris has defended its idea among representants of the population, and the project has been approved. The company begins to work on the project; the project manager has ordered all the raw materials needed to build the pool. Four months have passed, but the mayor has changed, and the project has been canceled!\")]),_c('p',[_vm._v(\"The project manager from FooBar is mad; the company has to cancel 156 orders. He starts to join them by phone one by one. Some of them have also ordered raw materials from other construction companies. Everybody is suffering from this rapid situation evolution.\")]),_c('p',[_vm._v(\"Now let’s imagine that the project manager does not cancel subcontractors’ orders. The other companies will produce the desired goods, but they will not be paid. This is a big waste of resources.\")]),_c('p',[_vm._v(\"As you can visualize in figure \"),_c('a',{attrs:{\"href\":\"#fig:Cancellation-propagation\",\"data-reference-type\":\"ref\",\"data-reference\":\"fig:Cancellation-propagation\"}},[_vm._v(\"1\")]),_vm._v(\" cancellation of the project is propagating to all the workers that were involved indirectly. The city Council cancels the project; the FooBar company is also canceling the orders to contractors.\")]),_c('p',[_vm._v(\"In construction and other human activities, we always have a way to cancel work. We can introduce a cancellation policy into our programs with the context package. When a request is made to a web server, we can cancel all the work chain if the client has dropped the connection!\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/cancellation_propagation.png'),\"alt\":\"Cancellation propagation[fig:Cancellation-propagation]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Cancellation propagation\"),_c('span',{attrs:{\"id\":\"fig:Cancellation-propagation\",\"label\":\"fig:Cancellation-propagation\"}},[_vm._v(\"[fig:Cancellation-propagation]\")])])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"transmission-of-request-scoped-data-along-with-the-call-stack\"}}),_c('h4',{attrs:{\"data-number\":\"5.2.0.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.2.0.2\")]),_vm._v(\" Transmission of request-scoped data along with the call stack \"),_c('a',{attrs:{\"href\":\"#transmission-of-request-scoped-data-along-with-the-call-stack\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"When a request is made to a web server, the web server function responsible for its treatment will not do the job alone. The request will pass through a chain of functions and methods, and then the response will be sent. A single request can generate new requests to other microservices in a microservice architecture! This chain of a function call is the “call stack”. We will see in this section why it can be useful to transmit data along with the call stack.\")]),_c('p',[_vm._v(\"We will take another example: the development of a web server for a shopping application. We have a user that interacts with our application.\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The user will go to the login page with its web browser\")])]),_c('li',[_c('p',[_vm._v(\"Fill it’s login details\")])]),_c('li',[_c('p',[_vm._v(\"The web browser will send an authentication request to the server that will forward the request to the Authentication Service\")])]),_c('li',[_c('p',[_vm._v(\"The server will build the “My Account” page (via a template, for instance) and send the user’s response.\")])]),_c('li',[_c('p',[_vm._v(\"If the user requests the “last orders” page then, the server will need to call the Order Service to retrieve them.\")])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/request_context.png'),\"alt\":\"An application sequence\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"An application sequence\")])],1),_c('p',[_vm._v(\"Which data can we add to our context?\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We can keep into context the \"),_c('strong',[_vm._v(\"type of device that sent the request\")]),_vm._v(\".\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"If the device is a cellphone, we can choose to load a lightweight template to improve the user experience.\")])]),_c('li',[_c('p',[_vm._v(\"The order service can also load only the last five orders to reduce the page’s rendering time.\")])])])]),_c('li',[_c('p',[_vm._v(\"We can keep into the context the id of the authenticated user.\")])]),_c('li',[_c('p',[_vm._v(\"We can also keep the IP of the incoming request.\")]),_c('ul',[_c('li',[_vm._v(\"The authentication layer can use it to block suspicious activity (introduction of a blocklist, detection of false, multiple login attempts)\")])])]),_c('li',[_c('p',[_vm._v(\"Another very common use case is to generate a single request id. The requestId is passed to each layer of the application. With the id, the team that will cope with maintenance will have the ability to trace in logs the request.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"set-deadlines-and-timeouts\"}}),_c('h4',{attrs:{\"data-number\":\"5.2.0.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.2.0.3\")]),_vm._v(\" Set deadlines and timeouts \"),_c('a',{attrs:{\"href\":\"#set-deadlines-and-timeouts\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A deadline is a time at which a task should be finished. A timeout is a very similar notion. Instead of considering a precise date and time in the calendar, we consider a max allowed duration. We can use a context to define a time limit for long-running processes. Here is an example:\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"You develop a server, and your client has a specified timeout of 1 second.\")])]),_c('li',[_c('p',[_vm._v(\"You can set a context with a timeout of 1 second; after this duration, you know that the client will drop the connection.\")])]),_c('li',[_c('p',[_vm._v(\"In this case, again, we want to avoid wasting resources.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-context-interface\"}}),_c('h2',{attrs:{\"data-number\":\"5.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.3\")]),_vm._v(\" The Context interface \"),_c('a',{attrs:{\"href\":\"#the-context-interface\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The context package exposes an interface that is composed of four methods :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"type Context interface {\\n Deadline() (deadline time.Time, ok bool)\\n Done() <-chan struct{}\\n Err() error\\n Value(key interface{}) interface{}\\n}\")])]),_c('p',[_vm._v(\"In the next section, we will see how to use the package\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"linked-list\"}}),_c('h1',{attrs:{\"data-number\":\"6\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6\")]),_vm._v(\" Linked list \"),_c('a',{attrs:{\"href\":\"#linked-list\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The context package is built with a standard data structure: the linked list. To fully understand how context works, we first need to understand linked lists.\")]),_c('p',[_vm._v(\"A linked list is a collection of data elements. The type of data stored in the list is not restricted; it can be integers, strings, structs, floats ...etc. Each element of the list is a node. Each node contains two things :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The data value\")])]),_c('li',[_c('p',[_vm._v(\"The address in memory of the next element in the list. In other words, this is a pointer to the next value.\")])])]),_c('p',[_vm._v(\"You can see a visual representation of a linked list in the figure \"),_c('a',{attrs:{\"href\":\"#fig:Linkedl-pointers-and-values\",\"data-reference-type\":\"ref\",\"data-reference\":\"fig:Linkedl-pointers-and-values\"}},[_vm._v(\"3\")]),_vm._v(\".\")]),_c('p',[_vm._v(\"The list is “linked”, nodes in the list have a child (the next element in the list) and a parent (the last element in the list). Note that this remark is not true; the first node in the list has no parent. It’s the root, the origin, the head of the list. There is another notable exception the final node does not have any child.\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/linked_list.png'),\"alt\":\"Linked List[fig:Linked-List]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Linked List\"),_c('span',{attrs:{\"id\":\"fig:Linked-List\",\"label\":\"fig:Linked-List\"}},[_vm._v(\"[fig:Linked-List]\")])])],1),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/linked_list_pointers.png'),\"alt\":\"Linked List : pointers and values[fig:Linkedl-pointers-and-values]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Linked List : pointers and values\"),_c('span',{attrs:{\"id\":\"fig:Linkedl-pointers-and-values\",\"label\":\"fig:Linkedl-pointers-and-values\"}},[_vm._v(\"[fig:Linkedl-pointers-and-values]\")])])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-root-context-background\"}}),_c('h1',{attrs:{\"data-number\":\"7\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"7\")]),_vm._v(\" The root context: Background \"),_c('a',{attrs:{\"href\":\"#the-root-context-background\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"In most programs, we create a Background concept at our program’s root. For instance, in the main function that will launch our application. To create the root context, you can use the following syntax :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ctx := context.Background()\")])]),_c('p',[_vm._v(\"The call to the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Background()\")])]),_vm._v(\" function will return a pointer to an empty context. Internally the call to \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Background()\")])]),_vm._v(\" will create a new \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"context.emptyCtx\")])]),_vm._v(\".\")]),_c('p',[_vm._v(\"This type is not exposed :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"type emptyCtx int\")])]),_c('p',[_vm._v(\"The underlying type of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"emptyCtx\")])]),_vm._v(\" is \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"int\")])]),_vm._v(\". This type implements the four methods that are required by the Context interface:\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func (*emptyCtx) Deadline() (deadline time.Time, ok bool) {\\n return\\n}\\n\\nfunc (*emptyCtx) Done() <-chan struct{} {\\n return nil\\n}\\n\\nfunc (*emptyCtx) Err() error {\\n return nil\\n}\\n\\nfunc (*emptyCtx) Value(key interface{}) interface{} {\\n return nil\\n}\")])]),_c('p',[_vm._v(\"Note that the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"emptyCtx\")])]),_vm._v(\" type also implements the interface \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"fmt.Stringer\")])]),_vm._v(\". This allows us to do a \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"fmt.Println(ctx)\")])]),_vm._v(\":\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"fmt.Println(reflect.TypeOf(ctx))\\n// *context.emptyCtx\\nfmt.Println(ctx)\\n// context.Background\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"add-context-to-your-functionmethods\"}}),_c('BuyCopyInvite'),_c('h1',{attrs:{\"data-number\":\"8\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"8\")]),_vm._v(\" Add context to your function/methods \"),_c('a',{attrs:{\"href\":\"#add-context-to-your-functionmethods\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"When your root context is created, we can pass it to functions or methods.\")]),_c('p',[_vm._v(\"But before that, we have to add to our function a context parameter :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func foo1(ctx context.Context, a int) {\\n //...\\n}\")])]),_c('p',[_vm._v(\"In the previous listing, you note two Go idioms that are widely used inside go projects :\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"The context is the first argument of a function\")])]),_c('li',[_c('p',[_vm._v(\"The context argument is named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx\")])])])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"deriving-context\"}}),_c('h1',{attrs:{\"data-number\":\"9\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"9\")]),_vm._v(\" Deriving context \"),_c('a',{attrs:{\"href\":\"#deriving-context\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"We have created our root context in the previous section. This context is empty; it does nothing. What we can do is derive another child context from our empty context :\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/deriving_context.png'),\"alt\":\"Deriving Contexts[fig:Deriving-Contexts]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Deriving Contexts\"),_c('span',{attrs:{\"id\":\"fig:Deriving-Contexts\",\"label\":\"fig:Deriving-Contexts\"}},[_vm._v(\"[fig:Deriving-Contexts]\")])])],1),_c('p',[_vm._v(\"To derive a context, you can use the following functions :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"WithCancel\")])]),_c('li',[_c('p',[_vm._v(\"WithTimeout\")])]),_c('li',[_c('p',[_vm._v(\"WithDeadline\")])]),_c('li',[_c('p',[_vm._v(\"WithValue\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"withcancel\"}}),_c('h1',{attrs:{\"data-number\":\"10\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10\")]),_vm._v(\" WithCancel \"),_c('a',{attrs:{\"href\":\"#withcancel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithCancel\")])]),_vm._v(\" takes only one argument named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"parent\")])]),_vm._v(\". This argument represents the context that we want to derive. We will create a new context, and the parent context will keep a reference to this new child context.\")]),_c('p',[_vm._v(\"Let’s take a look at the signature of the WithCancel function :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func WithCancel(parent Context) (ctx Context, cancel CancelFunc)\")])]),_c('p',[_vm._v(\"This function returns the next child context and a CancelFunc. CancelFunc is a custom type of the context package :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"type CancelFunc func()\")])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"CancelFunc\")])]),_vm._v(\" is a named type, its underlying type is \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"func()\")])]),_vm._v(\". This function “tells an operation to abandon its work” (Golang sources). Calling \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithCancel\")])]),_vm._v(\" will give us a way to cancel an operation. Here is how to create a derived context :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ctx, cancel := context.WithCancel(context.Background())\")])]),_c('p',[_vm._v(\"To cancel the operation, you need to call cancel :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"cancel()\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"withtimeout-withdeadline\"}}),_c('h1',{attrs:{\"data-number\":\"11\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"11\")]),_vm._v(\" WithTimeout / WithDeadline \"),_c('a',{attrs:{\"href\":\"#withtimeout-withdeadline\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_vm._v(\"A timeout is the maximum amount of time attributed to a process to finish normally. For any process that takes a variable amount of time to execute, we can add a timeout, i.e., a fixed amount of time allowed to wait. Without timeouts, our application can wait indefinitely for a process to finish.\")])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)\")])]),_c('ul',[_c('li',[_vm._v(\"A deadline is a specified point in time. When you set a deadline, you specify that a process will not exceed it.\")])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"deadline := time.Date(2021, 12, 12, 3, 30, 30, 30, time.UTC)\\nctx, cancel := context.WithDeadline(context.Background(), deadline)\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-usage\"}}),_c('BuyCopyInvite'),_c('h1',{attrs:{\"data-number\":\"12\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12\")]),_vm._v(\" Example usage \"),_c('a',{attrs:{\"href\":\"#example-usage\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"without-context\"}}),_c('h2',{attrs:{\"data-number\":\"12.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.1\")]),_vm._v(\" Without context \"),_c('a',{attrs:{\"href\":\"#without-context\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Let’s take an example: we will design an application that has to make an HTTP request to a web server to get data and then display it to its user. We will first consider the application without context then we will add context to it.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"client\"}}),_c('h3',{attrs:{\"data-number\":\"12.1.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.1.1\")]),_vm._v(\" Client \"),_c('a',{attrs:{\"href\":\"#client\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"package main\\n\\nimport (\\n \\\"log\\\"\\n \\\"net/http\\\"\\n)\\n\\nfunc main() {\\n req, err := http.NewRequest(\\\"GET\\\", \\\"http://127.0.0.1:8989\\\", nil)\\n if err != nil {\\n panic(err)\\n }\\n resp, err := http.DefaultClient.Do(req)\\n if err != nil {\\n panic(err)\\n }\\n log.Println(\\\"resp received\\\", resp)\\n}\")])]),_c('p',[_vm._v(\"We have here a simple http client. We create a GET request that will call \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"\\\"http://127.0.0.1:8989\\\"\")])]),_vm._v(\". If we cannot create the request, we make our program panic. Then we use the default HTTP client (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"http.DefaultClient\")])]),_vm._v(\") to send the request to the server (with the method \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Do\")])]),_vm._v(\").\")]),_c('p',[_vm._v(\"The response received is then printed to the user.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"server\"}}),_c('h3',{attrs:{\"data-number\":\"12.1.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.1.2\")]),_vm._v(\" Server \"),_c('a',{attrs:{\"href\":\"#server\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"We have set up our client. We now have to set up our fake server.\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"package main\\n\\nimport (\\n \\\"fmt\\\"\\n \\\"log\\\"\\n \\\"net/http\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n http.HandleFunc(\\\"/\\\", func(w http.ResponseWriter, r *http.Request) {\\n log.Println(\\\"request received\\\")\\n time.Sleep(time.Second * 3)\\n fmt.Fprintf(w, \\\"Response\\\") // send data to client side\\n log.Println(\\\"response sent\\\")\\n\\n })\\n err := http.ListenAndServe(\\\"127.0.0.1:8989\\\", nil) // set listen port\\n if err != nil {\\n panic(err)\\n }\\n}\")])]),_c('p',[_vm._v(\"The code is simple. We first begin by setting our http handler with the function.\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"http.HandleFunc\")])]),_vm._v(\". This function takes two parameters, the path and the function that will respond to requests.\")]),_c('p',[_vm._v(\"We wait 3 seconds with the instruction \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"time.Sleep(time.Second * 3)\")])]),_vm._v(\" then we write the response. This sleep is here to fake the time needed for the server to answer. In this case, the response is simply \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"\\\"Response\\\"\")])]),_vm._v(\".\")]),_c('p',[_vm._v(\"Then we launch our server that will listen to \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"127.0.0.1:8989\")])]),_vm._v(\" (localhost, port 8989).\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"first-test\"}}),_c('h3',{attrs:{\"data-number\":\"12.1.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.1.3\")]),_vm._v(\" First test \"),_c('a',{attrs:{\"href\":\"#first-test\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"First, we launch the server; then, we launch the client. After 3 seconds, the client has received the response.\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"$ go run server.go\\n2019/04/22 12:17:11 request received\\n2019/04/22 12:17:14 response sent\\n\\n$ go run client.go\\n2019/04/22 12:17:14 resp received &{200 OK 200 HTTP/1.1 1 1 map[Content-Length:[8] Content-Type:[text/plain; charset=utf-8] Date:[Mon, 22 Apr 2019 10:17:14 GMT]] 0xc000132180 8 [] false false map[] 0xc00011c000 }\")])]),_c('p',[_vm._v(\"As you can see, our client has to deal with 3 seconds latency. Let’s increase this in the server’s cod; let’s say that we now sleep for 1 minute. Our client will wait for 1 minute; it will block our application for 1 minute.\")]),_c('p',[_vm._v(\"We can note here that our client application is condemned to wait for the server even if it takes an infinite amount of time. This is not a very good design. The user will not be happy to wait indefinitely for the application to answer. In my opinion, it is better to say to the user that something wrong happened than to let him wait indefinitely.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"context-on-the-client-side\"}}),_c('h2',{attrs:{\"data-number\":\"12.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.2\")]),_vm._v(\" Context on the client-side \"),_c('a',{attrs:{\"href\":\"#context-on-the-client-side\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"We will keep the base of the code that we previously created. We will start by creating a root context :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"rootCtx := context.Background()\")])]),_c('p',[_vm._v(\"Then we will derive this context into a new one called ctx :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ctx, cancel := context.WithTimeout(rootCtx, 50*time.Millisecond)\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithTimeout\")])]),_vm._v(\" takes two arguments a context and a \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"time.Duration\")])]),_vm._v(\".\")])]),_c('li',[_c('p',[_vm._v(\"The second argument is the timeout duration.\")])]),_c('li',[_c('p',[_vm._v(\"Here we have set it to 50 milliseconds.\")])]),_c('li',[_c('p',[_vm._v(\"I suggest you create a config variable in a real-world application to hold the timeout duration. By doing so, you avoid the need to recompile your program to change the timeout.\")])])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"context.WithTimeout\")])]),_vm._v(\" will return:\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"the derived context\")])]),_c('li',[_c('p',[_vm._v(\"a cancel function\")])])]),_c('p',[_vm._v(\"The cancel function can be called to warn a sub-process that it should abandon what it is doing. Calling cancel will free resources that are associated with the context. To be sure that the cancel function will be called at the end of our program, we will use a defer statement :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"defer cancel()\")])]),_c('p',[_vm._v(\"The next step consists of creating the request and attach to it our brand new context :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"req, err := http.NewRequest(\\\"GET\\\", \\\"http://127.0.0.1:8989\\\", nil)\\nif err != nil {\\n panic(err)\\n}\\n// add context to our request\\nreq = req.WithContext(ctx)\")])]),_c('p',[_vm._v(\"The other lines are the same as the version without context.\")]),_c('p',[_vm._v(\"Here is the complete client code :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/client-side/main.go\\npackage main\\n\\nimport (\\n \\\"context\\\"\\n \\\"fmt\\\"\\n \\\"net/http\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n rootCtx := context.Background()\\n req, err := http.NewRequest(\\\"GET\\\", \\\"http://127.0.0.1:8989\\\", nil)\\n if err != nil {\\n panic(err)\\n }\\n // create context\\n ctx, cancel := context.WithTimeout(rootCtx, 50*time.Millisecond)\\n defer cancel()\\n // attach context to our request\\n req = req.WithContext(ctx)\\n resp, err := http.DefaultClient.Do(req)\\n if err != nil {\\n panic(err)\\n }\\n fmt.Println(\\\"resp received\\\", resp)\\n}\")])]),_c('p',[_vm._v(\"Now let’s test our new client. Here are the logs of the server :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2019/04/24 00:52:08 request received\\n2019/04/24 00:52:11 response sent\")])]),_c('p',[_vm._v(\"We see that we have received a request and sent a response 3 seconds later. Here are the logs of our client :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"panic: Get http://127.0.0.1:8989: context deadline exceeded\")])]),_c('p',[_vm._v(\"We see that that \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"http.DefaultClient.Do\")])]),_vm._v(\" has returned an \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"error\")])]),_vm._v(\".\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The text says that the deadline is exceeded.\")])]),_c('li',[_c('p',[_vm._v(\"Our request has been canceled because our server took 3 seconds to do its job. Even if the client has canceled the request, the server continued to do the job. We have to find a way to share that context between the client and the server.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"context-on-the-server-side\"}}),_c('h2',{attrs:{\"data-number\":\"12.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.3\")]),_vm._v(\" Context on the server-side \"),_c('a',{attrs:{\"href\":\"#context-on-the-server-side\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"headers\"}}),_c('h3',{attrs:{\"data-number\":\"12.3.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.3.1\")]),_vm._v(\" Headers \"),_c('a',{attrs:{\"href\":\"#headers\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"An HTTP request comprises a set of Headers, a body, and a query string. When we send the request, Go will not transmit any information about the request context.\")]),_c('p',[_vm._v(\"If you want to visualize the headers of the request, you can add the following lines in the server code :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"fmt.Println(\\\"headers :\\\")\\nfor name, headers := range r.Header {\\n for _, h := range headers {\\n fmt.Printf(\\\"%s: %s\\\\n\\\", name, h)\\n }\\n}\")])]),_c('p',[_vm._v(\"We iterate through the request’s headers with a loop and print them. Here are the headers that are transmitted with our client :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"headers :\\nUser-Agent: Go-http-client/1.1\\nAccept-Encoding: gzip\")])]),_c('p',[_vm._v(\"We have just two headers. The first one gives more information about the client used. The second informs the server that the client can accept gzipped data. Nothing about an eventual timeout.\")]),_c('p',[_vm._v(\"But if we take a look at the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"http.Request\")])]),_vm._v(\"object, we can note that there is a method named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Context()\")])]),_vm._v(\". This method will retrieve the context of the request. If it has not been defined, it will return an empty context :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func (r *Request) Context() context.Context {\\n if r.ctx != nil {\\n return r.ctx\\n }\\n return context.Background()\\n}\")])]),_c('p',[_vm._v(\"The documentation says that “the context is canceled when the client’s connection closes”. This means that inside the go server implementation, when the client connection is closed, the cancel function is called.\")]),_c('p',[_vm._v(\"It means that inside our server, we have to listen to the channel returned by ctx.Done(). When we receive a message on that channel, we have to stop what we are currently doing.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-dowork-function\"}}),_c('h3',{attrs:{\"data-number\":\"12.3.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.3.2\")]),_vm._v(\" The doWork function \"),_c('a',{attrs:{\"href\":\"#the-dowork-function\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Let’s see how to introduce that into our server.\")]),_c('p',[_vm._v(\"For the example, we will introduce a new function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\". It will represent a compute-intensive task handled by our server. This \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" is a placeholder for a CPU-intensive operation.\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/serverWithTimeout.png'),\"alt\":\"Http server handler with context activity diagram\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Http server handler with context activity diagram\")])],1),_c('p',[_vm._v(\"We will launch the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" function in a separate goroutine. This function will take as parameter the context and a channel where it will write its result. Let’s take a look at the code of this function :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/server-side/main.go \\n//...\\n\\nfunc doWork(ctx context.Context, resChan chan int) {\\n log.Println(\\\"[doWork] launch the doWork\\\")\\n sum := 0\\n for {\\n log.Println(\\\"[doWork] one iteration\\\")\\n time.Sleep(time.Millisecond)\\n select {\\n case <-ctx.Done():\\n log.Println(\\\"[doWork] ctx Done is received inside doWork\\\")\\n return\\n default:\\n sum++\\n if sum > 1000 {\\n log.Println(\\\"[doWork] sum has reached 1000\\\")\\n resChan <- sum\\n return\\n }\\n }\\n }\\n\\n}\")])]),_c('p',[_vm._v(\"In the figure \"),_c('a',{attrs:{\"href\":\"#fig:doWork-fct\",\"data-reference-type\":\"ref\",\"data-reference\":\"fig:doWork-fct\"}},[_vm._v(\"5\")]),_vm._v(\" you can see the activity diagram for the doWork function.\")]),_c('p',[_vm._v(\"In this function, we will use a channel to communicate with the caller. We create a for loop, and inside that loop, we will put a select statement. In this select statement, we have two cases :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The channel returned by \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx.Done()\")])]),_vm._v(\" has been closed. It means that we receive the order to finish our work\")]),_c('ul',[_c('li',[_vm._v(\"In this case, we will interrupt the loop, log a message and return.\")])])]),_c('li',[_c('p',[_vm._v(\"The default case (executed if any previous case are not executed)\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"In this default case, we will increment the sum.\")])]),_c('li',[_c('p',[_vm._v(\"If the variable sum is becoming greater strictly than 1.000, we will send the result on the result channel (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"resChan\")])]),_vm._v(\")\")])])])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/doWorkFunction.png'),\"alt\":\"Activity diagram of the doWork function[fig:doWork-fct]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Activity diagram of the doWork function\"),_c('span',{attrs:{\"id\":\"fig:doWork-fct\",\"label\":\"fig:doWork-fct\"}},[_vm._v(\"[fig:doWork-fct]\")])])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-server-handler\"}}),_c('h3',{attrs:{\"data-number\":\"12.3.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.3.3\")]),_vm._v(\" The server handler \"),_c('a',{attrs:{\"href\":\"#the-server-handler\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Let’s see how we will use the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" function inside our server handler :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/server-side/main.go \\n//...\\n\\nfunc main() {\\n http.HandleFunc(\\\"/\\\", func(w http.ResponseWriter, r *http.Request) {\\n log.Println(\\\"[Handler] request received\\\")\\n // retrieve the context of the request\\n rCtx := r.Context()\\n // create the result channel\\n resChan := make(chan int)\\n // launch the function doWork in a goroutine\\n go doWork(rCtx, resChan)\\n // Wait for\\n // 1. the client drops the connection.\\n // 2. the function doWork to finish it works\\n select {\\n case <-rCtx.Done():\\n log.Println(\\\"[Handler] context canceled in main handler, client has diconnected\\\")\\n return\\n case result := <-resChan:\\n log.Println(\\\"[Handler] Received 1000\\\")\\n log.Println(\\\"[Handler] Send response\\\")\\n fmt.Fprintf(w, \\\"Response %d\\\", result) // send data to client side\\n return\\n }\\n })\\n err := http.ListenAndServe(\\\"127.0.0.1:8989\\\", nil) // set listen port\\n if err != nil {\\n panic(err)\\n }\\n}\")])]),_c('p',[_vm._v(\"We have changed the code of the handler to use the request context. The first thing to do here is to retrieve the context of the request :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"rCtx := r.Context()\")])]),_c('p',[_vm._v(\"Then we set up a channel of integers (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"resChan\")])]),_vm._v(\") that will allow you to communicate with the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" function. We will launch the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" function in a separate goroutine.\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"resChan := make(chan int)\\n// launch the function doWork in a goroutine\\ngo doWork(rCtx, resChan)\")])]),_c('p',[_vm._v(\"Then we will use a select statement to wait for two possible events :\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"The client closes the connection; consequently, the cancel channel will be closed.\")])]),_c('li',[_c('p',[_vm._v(\"The function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" has finished its job. (We receive an integer from the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"resChan\")])]),_vm._v(\" channel)\")])])]),_c('p',[_vm._v(\"In option 1, we log a message, and then we return. When option 2 occurs, we use the result from the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"resChan\")])]),_vm._v(\" channel, and we write it to the response writer. Our client will receive the result of the doWork function computation.\")]),_c('p',[_vm._v(\"Let’s run our server and our client. On figure \"),_c('a',{attrs:{\"href\":\"#fig:Execution-logs-client-server-context\",\"data-reference-type\":\"ref\",\"data-reference\":\"fig:Execution-logs-client-server-context\"}},[_vm._v(\"6\")]),_vm._v(\" you can see the execution logs of the client and the server program.\")]),_c('p',[_vm._v(\"You can see that the handler receives a request, then launch the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" function. Then the handler receives the cancellation signal. This signal is then propagated to the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doWork\")])]),_vm._v(\" function.\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/server_client_timeout.png'),\"alt\":\"Execution logs for the client and the server[fig:Execution-logs-client-server-context]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Execution logs for the client and the server\"),_c('span',{attrs:{\"id\":\"fig:Execution-logs-client-server-context\",\"label\":\"fig:Execution-logs-client-server-context\"}},[_vm._v(\"[fig:Execution-logs-client-server-context]\")])])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"withdeadline\"}}),_c('h1',{attrs:{\"data-number\":\"13\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"13\")]),_vm._v(\" WithDeadline \"),_c('a',{attrs:{\"href\":\"#withdeadline\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"definition-1\"}}),_c('h2',{attrs:{\"data-number\":\"13.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"13.1\")]),_vm._v(\" Definition \"),_c('a',{attrs:{\"href\":\"#definition-1\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithDeadline\")])]),_vm._v(\" and \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithTimeout\")])]),_vm._v(\" are very similar. If we look at the source code of the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"context\")])]),_vm._v(\" package, we can see that the function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithTimeout\")])]),_vm._v(\" is just a wrapper of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithDeadline\")])]),_vm._v(\" :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// source : context.go (in the standard library)\\nfunc WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {\\n return WithDeadline(parent, time.Now().Add(timeout))\\n}\")])]),_c('p',[_vm._v(\"If you look at the previous snippet you can see that the timeout duration is added to the current time. Let’s see the signature of the WithDeadline function :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)\")])]),_c('p',[_vm._v(\"The function takes two arguments :\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"A parent context\")])]),_c('li',[_c('p',[_vm._v(\"A specific time.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"usage\"}}),_c('h2',{attrs:{\"data-number\":\"13.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"13.2\")]),_vm._v(\" Usage \"),_c('a',{attrs:{\"href\":\"#usage\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"As we said in the previous section, deadline and timeout are similar notions. A timeout is expressed as a duration, but a deadline is expressed as a particular point in time (see figure \"),_c('a',{attrs:{\"href\":\"#fig:Timeout-vs-Deadline\",\"data-reference-type\":\"ref\",\"data-reference\":\"fig:Timeout-vs-Deadline\"}},[_vm._v(\"7\")]),_vm._v(\")\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/timeout_deadline.png'),\"alt\":\"Timeout vs Deadline[fig:Timeout-vs-Deadline]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Timeout vs Deadline\"),_c('span',{attrs:{\"id\":\"fig:Timeout-vs-Deadline\",\"label\":\"fig:Timeout-vs-Deadline\"}},[_vm._v(\"[fig:Timeout-vs-Deadline]\")])])],1),_c('p',[_vm._v(\"WithDeadline can be used where you use WithTimeout. Here is an example of the standard library :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// golang standard library\\n// src/net/dnsclient_unix.go\\n// line 133\\n\\n// exchange sends a query on the connection and hopes for a response.\\nfunc (r *Resolver) exchange(ctx context.Context, server string, q dnsmessage.Question, timeout time.Duration) (dnsmessage.Parser, dnsmessage.Header, error) {\\n //....\\n for _, network := range []string{\\\"udp\\\", \\\"tcp\\\"} {\\n ctx, cancel := context.WithDeadline(ctx, time.Now().Add(timeout))\\n defer cancel()\\n\\n c, err := r.dial(ctx, network, server)\\n if err != nil {\\n return dnsmessage.Parser{}, dnsmessage.Header{}, err\\n }\\n //...\\n }\\n return dnsmessage.Parser{}, dnsmessage.Header{}, errNoAnswerFromDNSServer\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Here the function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"exchange\")])]),_vm._v(\" takes a context as first parameter.\")])]),_c('li',[_c('p',[_vm._v(\"For each network (UDP or TCP), it derives the context passed as parameter.\")])]),_c('li',[_c('p',[_vm._v(\"The input context is derived by calling \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"context.WithDeadline\")])]),_vm._v(\". The deadline time is created by adding the timeout duration to the current time : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"time.Now().Add(timeout)\")])])])]),_c('li',[_c('p',[_vm._v(\"Note that \"),_c('strong',[_vm._v(\"immediately\")]),_vm._v(\" after creating the derived context, there is a deferred call to the cancel function returned by \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"context.WithDeadline\")])]),_vm._v(\". It means that when the function exchange will return the cancel function will be called.\")])]),_c('li',[_c('p',[_vm._v(\"For instance, if the dial function returns an error for some reason, the exchange function will return, the cancel function will be called, and the cancellation signal will be propagated to the child context.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"cancellation-propagation-1\"}}),_c('h1',{attrs:{\"data-number\":\"14\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"14\")]),_vm._v(\" Cancellation propagation \"),_c('a',{attrs:{\"href\":\"#cancellation-propagation-1\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"This section will dive deeper into the mechanism of cancellation propagation. Let’s take an example :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func main(){\\n ctx1 := context.Background()\\n ctx2, c := context.WithCancel(ctx1)\\n defer c()\\n}\")])]),_c('p',[_vm._v(\"In this small program, we begin by defining a root context : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx1\")])]),_vm._v(\". Then we derive this context with a call to \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"context.WithCancel\")])]),_vm._v(\".\")]),_c('p',[_vm._v(\"Go will create a new structure. The function that will be called is the following one :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// src/context/context.go\\n\\n// newCancelCtx returns an initialized cancelCtx.\\nfunc newCancelCtx(parent Context) cancelCtx {\\n return cancelCtx{Context: parent}\\n}\")])]),_c('p',[_vm._v(\"A \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"cancelCtx\")])]),_vm._v(\" struct is created, and our root context is embedded inside. Here the type struct \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"cancelCtx\")])]),_vm._v(\" :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// src/context/context.go\\n\\ntype cancelCtx struct {\\n Context\\n\\n mu sync.Mutex // protects the following fields\\n done chan struct{} // created lazily, closed by the first cancel call\\n children map[canceler]struct{} // set to nil by the first cancel call\\n err error // set to non-nil by the first cancel call\\n}\")])]),_c('p',[_vm._v(\"We have five fields :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Context\")])]),_vm._v(\" (the parent) which is an embedded filed (it has no explicit field name)\")])]),_c('li',[_c('p',[_vm._v(\"A mutex (named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"mu\")])]),_vm._v(\")\")])]),_c('li',[_c('p',[_vm._v(\"A channel named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"done\")])])])]),_c('li',[_c('p',[_vm._v(\"A field named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"children\")])]),_vm._v(\" that is a map. Keys are of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"canceller\")])]),_vm._v(\" and value of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"struct{}\")])])])]),_c('li',[_c('p',[_vm._v(\"And an error named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"err\")])])])])]),_c('p',[_vm._v(\"Canceller is an interface :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// A canceler is a context type that can be canceled directly. The\\n// implementations are *cancelCtx and *timerCtx.\\ntype canceler interface {\\n cancel(removeFromParent bool, err error)\\n Done() <-chan struct{}\\n}\")])]),_c('p',[_vm._v(\"A type that implements the interface canceller must implement to functions : a cancel function and a \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Done\")])]),_vm._v(\" function.\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/withCancel.png'),\"alt\":\"WithCancel create a derived context and a cancel function[fig:WithCancel-create-a]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"WithCancel create a derived context and a cancel function\"),_c('span',{attrs:{\"id\":\"fig:WithCancel-create-a\",\"label\":\"fig:WithCancel-create-a\"}},[_vm._v(\"[fig:WithCancel-create-a]\")])])],1),_c('p',[_vm._v(\"What happens when we execute the cancel function ? What happens to \"),_c('strong',[_vm._v(\"ctx2\")]),_vm._v(\" ?\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The mutex (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"mu\")])]),_vm._v(\") will be locked. Hence no other goroutine will be able to modify this context.\")])]),_c('li',[_c('p',[_vm._v(\"The channel (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"done\")])]),_vm._v(\") will be closed\")])]),_c('li',[_c('p',[_vm._v(\"All children of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx2\")])]),_vm._v(\" will also be canceled (in this case, we have no children...)\")])]),_c('li',[_c('p',[_vm._v(\"The mutex will be unlocked.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"second-derivation\"}}),_c('h4',{attrs:{\"data-number\":\"14.0.0.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"14.0.0.1\")]),_vm._v(\" Second derivation \"),_c('a',{attrs:{\"href\":\"#second-derivation\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Let’s extend our example and derive ctx2:\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/withCancel3Derivatin.png'),\"alt\":\"Derive a derived context[fig:3-contexts]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Derive a derived context\"),_c('span',{attrs:{\"id\":\"fig:3-contexts\",\"label\":\"fig:3-contexts\"}},[_vm._v(\"[fig:3-contexts]\")])])],1),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func main() {\\n ctx1 := context.Background()\\n ctx2, c2 := context.WithCancel(ctx1)\\n ctx3, c3 := context.WithCancel(ctx2)\\n //...\\n}\")])]),_c('p',[_vm._v(\"Here we create \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx3\")])]),_c('strong',[_vm._v(\",\")]),_vm._v(\" a new object of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"cancelCtx\")])]),_vm._v(\". The children context \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx3\")])]),_vm._v(\" will be added to the parent (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx2\")])]),_vm._v(\"). The parent context \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx2\")])]),_vm._v(\" will keep memory of its children. For the moment, it only has one child \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx3\")])]),_vm._v(\" (see \"),_c('a',{attrs:{\"href\":\"#fig:3-contexts\",\"data-reference-type\":\"ref\",\"data-reference\":\"fig:3-contexts\"}},[_vm._v(\"9\")]),_vm._v(\").\")]),_c('p',[_vm._v(\"Now let’s see what is going on when we call the cancel function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"c2\")])]),_vm._v(\".\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The mutex (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"mu\")])]),_vm._v(\") will be locked. Hence no other goroutine will be able to modify this context.\")])]),_c('li',[_c('p',[_vm._v(\"The channel (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"done\")])]),_vm._v(\") will be closed\")])]),_c('li',[_c('p',[_vm._v(\"All children of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx2\")])]),_vm._v(\" will also be canceled (in this case, we have no children...)\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx3\")])]),_vm._v(\" will be canceled with the same process\")])]),_c('li',[_c('p',[_vm._v(\"Here \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx1\")])]),_vm._v(\" (the parent of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx2\")])]),_vm._v(\") is an \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"emptyCtx\")])]),_vm._v(\", hence \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx2\")])]),_vm._v(\" will not be removed from \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx1\")])]),_vm._v(\".\")])]),_c('li',[_c('p',[_vm._v(\"The mutex will be unlocked.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"third-derivation\"}}),_c('h4',{attrs:{\"data-number\":\"14.0.0.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"14.0.0.2\")]),_vm._v(\" Third derivation \"),_c('a',{attrs:{\"href\":\"#third-derivation\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Now let’s create another derived context.\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func main() {\\n ctx1 := context.Background()\\n ctx2, c2 := context.WithCancel(ctx1)\\n ctx3, c3 := context.WithCancel(ctx2)\\n ctx4, c4 := context.WithCancel(ctx3)\\n}\")])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/ctx_4_levels.png'),\"alt\":\"3 derived contexts[fig:3-derived-contexts]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"3 derived contexts\"),_c('span',{attrs:{\"id\":\"fig:3-derived-contexts\",\"label\":\"fig:3-derived-contexts\"}},[_vm._v(\"[fig:3-derived-contexts]\")])])],1),_c('ul',[_c('li',[_c('p',[_vm._v(\"As you can see in figure \"),_c('a',{attrs:{\"href\":\"#fig:3-derived-contexts\",\"data-reference-type\":\"ref\",\"data-reference\":\"fig:3-derived-contexts\"}},[_vm._v(\"10\")]),_vm._v(\" we have one root context and three descendants.\")])]),_c('li',[_c('p',[_vm._v(\"The last one is \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx4\")])]),_vm._v(\".\")])]),_c('li',[_c('p',[_vm._v(\"When we call \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"c2\")])]),_vm._v(\" it will cancel \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx2\")])]),_vm._v(\" but also its children (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx3\")])]),_vm._v(\").\")])]),_c('li',[_c('p',[_vm._v(\"When \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx3\")])]),_vm._v(\" will be canceled it will also cancel all its children, and \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx4\")])]),_vm._v(\" will be canceled.\")])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/cancellation_propagation_2.png'),\"alt\":\"Cancellation propagation[fig:Cancellation-propagation-1]\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Cancellation propagation\"),_c('span',{attrs:{\"id\":\"fig:Cancellation-propagation-1\",\"label\":\"fig:Cancellation-propagation-1\"}},[_vm._v(\"[fig:Cancellation-propagation-1]\")])])],1),_c('p',[_vm._v(\"The key information of this section is “when you cancel a context, the cancel operation will be propagated from parent to children”.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"an-important-idiom-defer-cancel\"}}),_c('h1',{attrs:{\"data-number\":\"15\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"15\")]),_vm._v(\" An important idiom : defer cancel() \"),_c('a',{attrs:{\"href\":\"#an-important-idiom-defer-cancel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The following two lines of code are very common :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ctx, cancel = context.WithCancel(ctx)\\ndefer cancel()\")])]),_c('p',[_vm._v(\"You can encounter those lines in the standard library but also in many libraries. As soon as we derive an existing context, the cancel function is called in a defer statement.\")]),_c('p',[_vm._v(\"As we have seen before, the cancellation instruction propagates from parents to children; why do we need to call cancel explicitly? When building a library, you are not sure that somebody will effectively execute the cancel function in a parent context. By adding the call to cancel in a deferred statement, you ensure that cancel will be called :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"when the function returns (or reach the end of its body)\")])]),_c('li',[_c('p',[_vm._v(\"or when the goroutine that runs the function panics.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"goroutine-leak\"}}),_c('h2',{attrs:{\"data-number\":\"15.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"15.1\")]),_vm._v(\" Goroutine leak \"),_c('a',{attrs:{\"href\":\"#goroutine-leak\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"To understand this phenomenon, we will take an example.\")]),_c('p',[_vm._v(\"First, we define two functions: \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doSth\")])]),_vm._v(\" and \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doSth2\")])]),_vm._v(\". Those two functions are dummy. They are taking a context as first parameter. Then they are waiting indefinitely for the channel returned by \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx.Done()\")])]),_vm._v(\" close :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/goroutine-leak/main.go \\n// ...\\n\\nfunc doSth2(ctx context.Context) {\\n select {\\n case <-ctx.Done():\\n log.Println(\\\"second goroutine return\\\")\\n return\\n }\\n}\\n\\nfunc doSth(ctx context.Context) {\\n select {\\n case <-ctx.Done():\\n log.Println(\\\"first goroutine return\\\")\\n return\\n }\\n}\")])]),_c('p',[_vm._v(\"We will now use those two functions in a third function called \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"launch\")])]),_vm._v(\":\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/goroutine-leak/main.go \\n// ...\\n\\nfunc launch() {\\n ctx := context.Background()\\n ctx, _ = context.WithCancel(ctx)\\n log.Println(\\\"launch first goroutine\\\")\\n go doSth(ctx)\\n log.Println(\\\"launch second goroutine\\\")\\n go doSth2(ctx)\\n}\")])]),_c('p',[_vm._v(\"In this function, we are first creating a root context (returned by \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"context.Background\")])]),_vm._v(\"). Then we derive this root context. We call the method \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"WithCancel()\")])]),_vm._v(\" to get a context that can be canceled.\")]),_c('p',[_vm._v(\"Then we launch our two goroutines. Let’s now take a look at our main function :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/goroutine-leak/main.go \\n// ...\\n\\nfunc main() {\\n log.Println(\\\"begin program\\\")\\n go launch()\\n time.Sleep(time.Millisecond)\\n log.Printf(\\\"Gouroutine count: %d\\\\n\\\", runtime.NumGoroutine())\\n for {\\n }\\n}\")])]),_c('p',[_vm._v(\"We start the function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"launch\")])]),_vm._v(\" in a goroutine. Then we make a small pause (1 millisecond), and we count the number of goroutines. There is a very convenient function that is defined in the runtime package :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"runtime.NumGoroutine()\")])]),_c('p',[_vm._v(\"The number of goroutines here should be 3: 1 main goroutine + 1 goroutine that execute doSth + 1 goroutine that execute \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"doSth2\")])]),_vm._v(\". If we do not call cancel, the two last goroutines will be running indefinitely. Note that we have created another goroutine in the program: the one that starts \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"launch\")])]),_c('strong',[_vm._v(\".\")]),_vm._v(\" This goroutine will not be counted because it will return almost instantaneously.\")]),_c('p',[_vm._v(\"When we cancel the context, our two goroutines are returning. Hence the number of goroutines will be reduced to 1 (the main). But here, we do not call the cancel function at all.\")]),_c('p',[_vm._v(\"Here is the standard output :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2019/05/04 19:01:16 begin program\\n2019/05/04 19:01:16 launch first goroutine\\n2019/05/04 19:01:16 launch second goroutine\\n2019/05/04 19:01:16 Gouroutine count: 3\")])]),_c('p',[_vm._v(\"In the main function, we have no way to cancel our context (because it was defined inside the launch function). We have 2 leaked goroutine! To fix that, we can just modify the function launch and add a deferred statement :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/goroutine-leak-fixed/main.go \\n// ...\\n\\nfunc launch() {\\n ctx := context.Background()\\n ctx, cancel := context.WithCancel(ctx)\\n defer cancel()\\n log.Println(\\\"launch first goroutine\\\")\\n go doSth(ctx)\\n log.Println(\\\"launch second goroutine\\\")\\n go doSth2(ctx)\\n}\")])]),_c('p',[_vm._v(\"Now let’s take a look at the logs that are obtained by running this modified version of our program :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2019/05/04 19:15:09 begin program\\n2019/05/04 19:15:09 launch first goroutine\\n2019/05/04 19:15:09 launch second goroutine\\n2019/05/04 19:15:09 first goroutine return\\n2019/05/04 19:15:09 second goroutine return\\n2019/05/04 19:15:09 Gouroutine count: 1\")])]),_c('p',[_vm._v(\"Here we have killed our two leaked goroutine!\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"withvalue\"}}),_c('BuyCopyInvite'),_c('h1',{attrs:{\"data-number\":\"16\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"16\")]),_vm._v(\" WithValue \"),_c('a',{attrs:{\"href\":\"#withvalue\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A Context can \"),_c('strong',[_vm._v(\"carry data\")]),_vm._v(\" with it. This feature is intended to be used with \"),_c('strong',[_c('u',[_vm._v(\"request-scoped\")])]),_vm._v(\" data like :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"credentials (a JSON Web Token, for instance)\")])]),_c('li',[_c('p',[_vm._v(\"request id (to trace the request in the system)\")])]),_c('li',[_c('p',[_vm._v(\"the IP of the request\")])]),_c('li',[_c('p',[_vm._v(\"Some headers (ex: the user agent)\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example\"}}),_c('h2',{attrs:{\"data-number\":\"16.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"16.1\")]),_vm._v(\" Example \"),_c('a',{attrs:{\"href\":\"#example\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// context/with-value/main.go \\npackage main\\n\\nimport (\\n \\\"context\\\"\\n \\\"fmt\\\"\\n \\\"log\\\"\\n \\\"net/http\\\"\\n\\n uuid \\\"github.com/satori/go.uuid\\\"\\n)\\n\\nfunc main() {\\n http.HandleFunc(\\\"/status\\\", status)\\n err := http.ListenAndServe(\\\":8091\\\", nil)\\n if err != nil {\\n log.Fatal(err)\\n }\\n}\\n\\ntype key int\\n\\nconst (\\n requestID key = iota\\n jwt\\n)\\n\\nfunc status(w http.ResponseWriter, req *http.Request) {\\n // Add request id to context\\n ctx := context.WithValue(req.Context(), requestID, uuid.NewV4().String())\\n // add credentials to context\\n ctx = context.WithValue(ctx, jwt, req.Header.Get(\\\"Authorization\\\"))\\n\\n\\n upDB, err := isDatabaseUp(ctx)\\n if err != nil {\\n http.Error(w, \\\"Internal server error\\\", http.StatusInternalServerError)\\n return\\n }\\n upAuth, err := isMonitoringUp(ctx)\\n if err != nil {\\n http.Error(w, \\\"Internal server error\\\", http.StatusInternalServerError)\\n return\\n }\\n fmt.Fprintf(w, \\\"DB up: %t | Monitoring up: %t\\\\n\\\", upDB, upAuth)\\n}\\n\\n\\nfunc isDatabaseUp(ctx context.Context) (bool, error) {\\n // retrieve the request ID value\\n reqID, ok := ctx.Value(requestID).(string)\\n if !ok {\\n return false, fmt.Errorf(\\\"requestID in context does not have the expected type\\\")\\n }\\n log.Printf(\\\"req %s - checking db status\\\", reqID)\\n return true, nil\\n}\\n\\nfunc isMonitoringUp(ctx context.Context) (bool, error) {\\n // retrieve the request ID value\\n reqID, ok := ctx.Value(requestID).(string)\\n if !ok {\\n return false, fmt.Errorf(\\\"requestID in context does not have the expected type\\\")\\n }\\n log.Printf(\\\"req %s - checking monitoring status\\\", reqID)\\n return true, nil\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We have created a server that is listening on localhost:8091\")])]),_c('li',[_c('p',[_vm._v(\"This server has one route : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"\\\"/status\\\"\")])])])]),_c('li',[_c('p',[_vm._v(\"We derive the request context (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"req.Context()\")])]),_vm._v(\") with \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx := context.WithValue(req.Context(), requestID, uuid.NewV4().String())\")])])]),_c('ul',[_c('li',[_vm._v(\"We add a key-value pair to the context: the requestID\")])])]),_c('li',[_c('p',[_vm._v(\"Then we renew the operation. We add a new key pair to hold the request credentials : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx = context.WithValue(ctx, jwt, req.Header.Get(\\\"Authorization\\\"))\")])])])])]),_c('p',[_vm._v(\"The context values are then accessible into \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"isMonitoringUp\")])]),_vm._v(\" and \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"isMonitoringUp\")])]),_vm._v(\" :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"reqID, ok := ctx.Value(requestID).(string)\\nif !ok {\\n return false, fmt.Errorf(\\\"requestID in context does not have the expected type\\\")\\n}\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"key-type\"}}),_c('h2',{attrs:{\"data-number\":\"16.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"16.2\")]),_vm._v(\" Key type \"),_c('a',{attrs:{\"href\":\"#key-type\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Here is the header of the method WithValue :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func WithValue(parent Context, key, val interface{}) Context\")])]),_c('p',[_vm._v(\"The arguments \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"key\")])]),_vm._v(\" and \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"val\")])]),_vm._v(\" are of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"interface{}\")])]),_vm._v(\". In other words, they can have any type. Only one restriction should be respected, the type of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"key\")])]),_vm._v(\" should be \"),_c('strong',[_vm._v(\"comparable\")]),_vm._v(\".\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We can share a context across several packages.\")])]),_c('li',[_c('p',[_vm._v(\"You might want to restrict the access to context values outside the package where values were added.\")])]),_c('li',[_c('p',[_vm._v(\"To do that, you can create an unexported type\")])]),_c('li',[_c('p',[_vm._v(\"All keys will be of this type.\")])]),_c('li',[_c('p',[_vm._v(\"We will define keys globally inside the package :\")])])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"type key int\\n\\nconst (\\n requestID key = iota\\n jwt\\n)\")])]),_c('p',[_vm._v(\"In the previous example, we created a type key with underlying type int (comparable). Then we defined two unexported global constants. Those constants are then used to add a value and to retrieve a value from the context :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// add a value\\nctx := context.WithValue(req.Context(), requestID, uuid.NewV4().String())\\n\\n// get a value\\nreqID, ok := ctx.Value(requestID).(string)\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"missing-value-type-expected-different-than-the-actual-type\"}}),_c('h4',{attrs:{\"data-number\":\"16.2.0.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"16.2.0.1\")]),_vm._v(\" Missing value & type expected different than the actual type \"),_c('a',{attrs:{\"href\":\"#missing-value-type-expected-different-than-the-actual-type\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"When the key-value pair is not found in the context, \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx.Value\")])]),_vm._v(\" will return \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"nil\")])]),_vm._v(\".\")])]),_c('li',[_c('p',[_vm._v(\"That’s why we are making a \"),_c('strong',[_vm._v(\"type assertion\")]),_vm._v(\": to protect us against missing values or values that have not the required type.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"questions\"}}),_c('h2',{attrs:{\"data-number\":\"16.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"16.3\")]),_vm._v(\" Questions \"),_c('a',{attrs:{\"href\":\"#questions\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"What is the difference between a deadline and a timeout ?\")])]),_c('li',[_c('p',[_vm._v(\"Fill in the blanks. Each node of a linked list contains a ____ value and an ____.\")])]),_c('li',[_c('p',[_vm._v(\"How to create an empty context?\")])]),_c('li',[_c('p',[_vm._v(\"With which method(s) can you derive a context?\")])]),_c('li',[_c('p',[_vm._v(\"When the key-value pair is not found in the context, what is returned by\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx.Value(key)\")])]),_vm._v(\" ?\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"answers\"}}),_c('h2',{attrs:{\"data-number\":\"16.4\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"16.4\")]),_vm._v(\" Answers \"),_c('a',{attrs:{\"href\":\"#answers\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"What is the difference between a deadline and a timeout?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"Deadline: a precise point in time. ex: 12 December 2027\")])]),_c('li',[_c('p',[_vm._v(\"Timeout: a duration. ex: 12 seconds\")])])])]),_c('li',[_c('p',[_vm._v(\"Fill in the blanks. Each node of a linked list contains a ____ value and an ____.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"Each node of a linked list contains a \"),_c('u',[_vm._v(\"data\")]),_vm._v(\" value and an the \"),_c('u',[_vm._v(\"address in memory of the next element\")])])]),_c('li',[_c('p',[_vm._v(\"Except for the final node. It has no address set.\")])])])]),_c('li',[_c('p',[_vm._v(\"How to create an empty context?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_vm._v(\"ctx := context.Background()\")])])]),_c('li',[_c('p',[_vm._v(\"With which method(s) can you derive a context?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"WithCancel\")])]),_c('li',[_c('p',[_vm._v(\"WithTimeout\")])]),_c('li',[_c('p',[_vm._v(\"WithDeadline\")])]),_c('li',[_c('p',[_vm._v(\"WithValue\")])])])]),_c('li',[_c('p',[_vm._v(\"When the key-value pair is not found in the context, what is returned by\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx.Value(key)\")])])]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_vm._v(\"nil\")])])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"key-takeaways\"}}),_c('h1',{attrs:{\"data-number\":\"17\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"17\")]),_vm._v(\" Key Takeaways \"),_c('a',{attrs:{\"href\":\"#key-takeaways\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Context is a package from the standard library\")])]),_c('li',[_c('p',[_vm._v(\"We can use context to :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Cancellation propagation (ex: cancel all the work chain if the API consumer has dropped the connection)\")])]),_c('li',[_c('p',[_vm._v(\"Transmission of request-scoped data along with the call stack.\")])]),_c('li',[_c('p',[_vm._v(\"Set deadlines and timeouts.\")])])])]),_c('li',[_c('p',[_vm._v(\"Deadline = a precise point in time\")])]),_c('li',[_c('p',[_vm._v(\"Timeout = a duration\")])]),_c('li',[_c('p',[_vm._v(\"Internally the package context is built with a linked list.\")])]),_c('li',[_c('p',[_vm._v(\"A linked list is a collection of data. Each node of a linked list contains a data value and an address in memory of the next element.\")])]),_c('li',[_c('p',[_vm._v(\"To create an empty context, use :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ctx := context.Background()\")])])]),_c('li',[_c('p',[_vm._v(\"We can derive each context with the following methods :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"WithCancel : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx, cancel := context.WithCancel(context.Background())\")])])])]),_c('li',[_c('p',[_vm._v(\"WithTimeout : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)\")])])])]),_c('li',[_c('p',[_vm._v(\"WithDeadline : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx, cancel := context.WithDeadline(context.Background(), deadline)\")])])])]),_c('li',[_c('p',[_vm._v(\"WithValue : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx := context.WithValue(context.Background(),\\\"key\\\",\\\"value\\\")\")])])])])])]),_c('li',[_c('p',[_vm._v(\"By deriving a context, you create a node in the linked list of contexts.\")])]),_c('li',[_c('p',[_vm._v(\"When you cancel a context, the cancel operation will be propagated from parent to children contexts.\")])]),_c('li',[_c('p',[_vm._v(\"Context can carry request-scoped values.\")])]),_c('li',[_c('p',[_vm._v(\"To \"),_c('strong',[_vm._v(\"add\")]),_vm._v(\" a value, derive the context like this : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx := context.WithValue(req.Context(), requestID, uuid.NewV4().String())\")])])])]),_c('li',[_c('p',[_vm._v(\"To \"),_c('strong',[_vm._v(\"retrieve\")]),_vm._v(\" a value from context use this syntax : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"reqID, ok := ctx.Value(requestID).(string)\")])])])]),_c('li',[_c('p',[_vm._v(\"When no values are retrieved with the given key \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ctx.Value\")])]),_vm._v(\" will return \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"nil\")])])])]),_c('li',[_c('p',[_vm._v(\"Usually, a global unexported variable/constant of an unexported type is used as key.\")])])]),_c('section',{staticClass:\"footnotes\",attrs:{\"role\":\"doc-endnotes\"}},[_c('hr'),_c('ol',[_c('li',{attrs:{\"id\":\"fn1\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"https://github.com/golang/go/wiki/SubRepositories\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref1\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])])])]),_c('h1',[_vm._v(\"Bibliography\")]),_c('ChapterBibliography',{attrs:{\"chapter-id\":\"Chap37Context\"}}),_c('b-row',{staticClass:\"ml-1 mr-1 \"},[_c('b-col',{staticClass:\"text-center border mr-1 p-2\"},[_c('router-link',{attrs:{\"to\":{name:'Chap36ProgramProfiling'}}},[_c('p',[_c('u',[_c('small',[_vm._v(\"Previous\")])])]),_c('p',[_c('small',[_vm._v(\"Program Profiling\")])])])],1),_c('b-col',{staticClass:\"text-center border p-1 \"},[_c('router-link',{attrs:{\"to\":{name:'Chap38Generics'}}},[_c('p',[_c('u',[_c('small',[_vm._v(\"Next\")])])]),_c('p',[_c('small',[_vm._v(\"Generics\")])])])],1)],1),_c('b-row',{staticClass:\"mt-1 ml-1 mr-1\"},[_c('b-col',{staticClass:\"text-center border p-1 \"},[_c('b-link',{attrs:{\"to\":{name:'Home'}}},[_vm._v(\"Table of contents\")])],1)],1),_c('FeedbackInvite'),_c('NewsletterInput'),_c('Footer')],1),_c('b-col')],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Chap37Context.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Chap37Context.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Chap37Context.vue?vue&type=template&id=ea7e565a&scoped=true&\"\nimport script from \"./Chap37Context.vue?vue&type=script&lang=js&\"\nexport * from \"./Chap37Context.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ea7e565a\",\n null\n \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/timeout_deadline.b1d54bad.png\";","module.exports = __webpack_public_path__ + \"img/withCancel.150ca94b.png\";","module.exports = __webpack_public_path__ + \"img/withCancel3Derivatin.c23d2f44.png\";","module.exports = __webpack_public_path__ + \"img/ctx_4_levels.f46f9ff9.png\";","module.exports = __webpack_public_path__ + \"img/serverWithTimeout.78b3d9c5.png\";","module.exports = __webpack_public_path__ + \"img/server_client_timeout.4e32a6a4.png\";"],"sourceRoot":""}