{"id":242,"date":"2024-09-14T09:46:44","date_gmt":"2024-09-14T02:46:44","guid":{"rendered":"https:\/\/gotutorial.org\/?page_id=242"},"modified":"2024-09-27T11:28:23","modified_gmt":"2024-09-27T04:28:23","slug":"go-defer","status":"publish","type":"page","link":"https:\/\/www.gotutorial.org\/go-tutorial\/go-defer\/","title":{"rendered":"Go defer"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you will learn how to use the Go <code>defer<\/code> keyword to defer the execution of a function until the surrounding function completes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to Go defer keyword<\/h2>\n\n\n\n<p>The <code>defer<\/code> keyword schedules a <a href=\"https:\/\/gotutorial.org\/go-tutorial\/go-functions\/\">function<\/a> call to be executed after the surrounding function completes.<\/p>\n\n\n\n<p>Here&#8217;s the syntax of the <code>defer<\/code> keyword:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">outer<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    <span class=\"hljs-keyword\">defer<\/span> inner()\n    <span class=\"hljs-comment\">\/\/ function body<\/span>\n    <span class=\"hljs-comment\">\/\/ ...<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this syntax, the <code>defer<\/code> keyword schedules the <code>inner()<\/code> function to run at the <code>outer()<\/code> <em>function exit<\/em>.<\/p>\n\n\n\n<p>Go will execute the <code>outer()<\/code> function body first and then run the <code>inner()<\/code> function.<\/p>\n\n\n\n<p>It&#8217;s important to notice that Go always executes the <code>inner()<\/code> function regardless of how the <code>outer()<\/code> function returns. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"fmt\"<\/span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">exit<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Bye!\"<\/span>)\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">sayHi<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-title\">bool<\/span><\/span> {\n    <span class=\"hljs-keyword\">defer<\/span> exit()\n    fmt.Println(<span class=\"hljs-string\">\"Hi there\"<\/span>)\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>\n    <span class=\"hljs-comment\">\/\/ always execute the exit function<\/span>\n    <span class=\"hljs-comment\">\/\/ exit()<\/span>\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    sayHi()\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">Hi there\nBye!<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define the <code>exit()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">exit<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n   fmt.Println(<span class=\"hljs-string\">\"Bye!\"<\/span>)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define the <code>sayHi()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">sayHi<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-title\">bool<\/span><\/span> {\n   <span class=\"hljs-keyword\">defer<\/span> exit()\n   fmt.Println(<span class=\"hljs-string\">\"Hi there\"<\/span>)\n   <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>\n   <span class=\"hljs-comment\">\/\/ always execute the exit function<\/span>\n   <span class=\"hljs-comment\">\/\/ exit()<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Inside the <code>sayHi()<\/code> function:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Defer the <code>exit()<\/code> function. <\/li>\n\n\n\n<li>Display a message <code>\"Hi there\"<\/code> on the screen<\/li>\n\n\n\n<li>Return <code>true<\/code><\/li>\n<\/ul>\n\n\n\n<p>Third, call the <code>sayHi()<\/code> function inside the <code>main()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n   sayHi()\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>After executing the <code>sayHi()<\/code> function, Go executes the <code>exit()<\/code> function.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Argument evaluation<\/h2>\n\n\n\n<p>Go evaluates arguments <strong>immediately<\/strong> at the <code>defer<\/code> statement but executes the function until the surrounding function completes. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"fmt\"<\/span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">exit<\/span><span class=\"hljs-params\">(name <span class=\"hljs-keyword\">string<\/span>)<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Bye\"<\/span>, name)\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">sayHi<\/span><span class=\"hljs-params\">(name <span class=\"hljs-keyword\">string<\/span>)<\/span><\/span> {\n    <span class=\"hljs-keyword\">defer<\/span> exit(name)\n    name = <span class=\"hljs-string\">\"Alice\"<\/span>\n    fmt.Println(<span class=\"hljs-string\">\"Hi\"<\/span>, name)\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    sayHi(<span class=\"hljs-string\">\"Bob\"<\/span>)\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">Hi Alice\nBye Bob<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define the <code>exit()<\/code> function that accepts a string argument:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">exit<\/span><span class=\"hljs-params\">(name <span class=\"hljs-keyword\">string<\/span>)<\/span><\/span> {\n   fmt.Println(<span class=\"hljs-string\">\"Bye\"<\/span>, name)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>exit()<\/code> argument displays a message Bye <code>name<\/code> <\/p>\n\n\n\n<p>Second, define the <code>sayHi()<\/code> function that also accepts a string argument:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">sayHi<\/span><span class=\"hljs-params\">(name <span class=\"hljs-keyword\">string<\/span>)<\/span><\/span> {\n   <span class=\"hljs-keyword\">defer<\/span> exit(name)\n   name = <span class=\"hljs-string\">\"Alice\"<\/span>\n   fmt.Println(<span class=\"hljs-string\">\"Hi\"<\/span>, name)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the <code>sayHi()<\/code> function:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Defer the <code>exit()<\/code> function. Go evaluates the <code>name<\/code> argument in the first line of the <code>sayHi()<\/code> function.<\/li>\n\n\n\n<li>Change the value of the <code>name<\/code> parameter to <code>\"Alice\"<\/code><\/li>\n\n\n\n<li>Display the <code>Hi Alice<\/code> message.<\/li>\n<\/ul>\n\n\n\n<p>Third, call the <code>sayHi()<\/code> function with the &#8220;Bob&#8221; argument inside the <code>main()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n   sayHi(<span class=\"hljs-string\">\"Bob\"<\/span>)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Since Go evaluates the <code>name<\/code> argument at the first line of the <code>sayHi<\/code> function, the output shows the message Bye Bob, not Bye Alice even though we changed the name to <code>Alice<\/code> after deferring the call.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using multiple defer statements<\/h2>\n\n\n\n<p>Go allows you to have multiple <code>defer<\/code> statements in a function. Go will execute them in the reverse order of their appearance:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">outer<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    <span class=\"hljs-keyword\">defer<\/span> inner1()\n    <span class=\"hljs-keyword\">defer<\/span> inner2()\n    <span class=\"hljs-comment\">\/\/ function body<\/span>\n    <span class=\"hljs-comment\">\/\/ ...<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Inside the outer function, we have two defer statements that schedule the <code>inner1()<\/code> and <code>inner2()<\/code> functions to execute after the outer function completes. Go will execute the <code>inner2()<\/code> function first and then the <code>inner1()<\/code> function.<\/p>\n\n\n\n<p>Behind the scenes, Go pushes deferred function calls onto a stack. When the surrounding function returns, Go executes the deferred calls in the last-in, first-out (LIFO) order. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"fmt\"<\/span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">closeDbConnection<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Close the database connection\"<\/span>)\n}\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">closeFile<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Close the file\"<\/span>)\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">writeDataToFile<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    <span class=\"hljs-keyword\">defer<\/span> closeDbConnection()\n    <span class=\"hljs-keyword\">defer<\/span> closeFile()\n    <span class=\"hljs-comment\">\/\/<\/span>\n    fmt.Println(<span class=\"hljs-string\">\"Open a database connection\"<\/span>)\n    fmt.Println(<span class=\"hljs-string\">\"Retrieving data from the database\"<\/span>)\n    fmt.Println(<span class=\"hljs-string\">\"Write data to the file\"<\/span>)\n    fmt.Println(<span class=\"hljs-string\">\"Open a file\"<\/span>)\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    writeDataToFile()\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">Open a database connection\nOpen a file\nRetrieving data from the database\nWrite data to the file\nClose the file\nClose the database connection<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>Step 1. Define the <code>closeDbConnection<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">closeDbConnection<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Close the database connection\"<\/span>)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Step 2. Define the <code>closeFile()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">closeFile<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Close the file\"<\/span>)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Step 3. Define the <code>writeDataToFile<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">writeDataToFile<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    <span class=\"hljs-keyword\">defer<\/span> closeDbConnection()\n    <span class=\"hljs-keyword\">defer<\/span> closeFile()\n    <span class=\"hljs-comment\">\/\/<\/span>\n    fmt.Println(<span class=\"hljs-string\">\"Open a database connection\"<\/span>)\n    fmt.Println(<span class=\"hljs-string\">\"Retrieving data from the database\"<\/span>)\n    fmt.Println(<span class=\"hljs-string\">\"Write data to the file\"<\/span>)\n    fmt.Println(<span class=\"hljs-string\">\"Open a file\"<\/span>)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How <code>writeDataToFile<\/code> works.<\/p>\n\n\n\n<p>First, defer the <code>closeDbConnection<\/code> and <code>closeFile<\/code> functions to ensure that the file and database connection are closed after the function returns:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">defer<\/span> closeDbConnection()\n<span class=\"hljs-keyword\">defer<\/span> closeFile()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Go will execute the <code>closeFile<\/code> function before the <code>closeDbConnection<\/code> function.<\/p>\n\n\n\n<p>Step 4. Call the <code>writeDataToFile()<\/code> function inside the <code>main()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    writeDataToFile()\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Go defer use cases<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Resource cleanup<\/strong>: you can use the <code>defer<\/code> keyword to always clean up properly resources such as closing files and database connection.<\/li>\n\n\n\n<li><strong>Logging<\/strong>: you can use the defer keyword to ensure that a certain log statement executes when a function returns.<\/li>\n\n\n\n<li><strong>Locking<\/strong>: you can use the defer keyword to ensure a lock is unlocked when a function exits.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Measure function execution time<\/h2>\n\n\n\n<p>The following example uses the <code>defer<\/code> keyword defer a function call to measure the execution time of a function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> (\n    <span class=\"hljs-string\">\"fmt\"<\/span>\n    <span class=\"hljs-string\">\"time\"<\/span>\n)\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">fn<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(<span class=\"hljs-string\">\"Called the fn function\"<\/span>)\n    <span class=\"hljs-keyword\">for<\/span> i := <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1<\/span>_000_000_000; i++ {\n    }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    start := time.Now()\n    <span class=\"hljs-keyword\">defer<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n        elapsed := time.Since(start)\n        fmt.Printf(<span class=\"hljs-string\">\"It took %d ms\\n\"<\/span>, elapsed.Milliseconds())\n    }()\n\n    <span class=\"hljs-comment\">\/\/ measure execution time of the fn<\/span>\n    fn()\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">Called the fn function\nIt took <span class=\"hljs-number\">411<\/span> ms<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define <code>fn<\/code> function that performs 1 billion loop iterations:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">fn<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n   fmt.Println(<span class=\"hljs-string\">\"Called the fn function\"<\/span>)\n   <span class=\"hljs-keyword\">for<\/span> i := <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">1<\/span>_000_000_000; i++ {\n   }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, declare the <code>start<\/code> variable and initialize its values to the current local time:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">start := time.Now()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Now()<\/code> function from the time module returns the current local time.<\/p>\n\n\n\n<p>Third, defer a call to an anonymous function inside the main function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">defer<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    elapsed := time.Since(start)\n    fmt.Printf(<span class=\"hljs-string\">\"It took %d ms\\n\"<\/span>, elapsed.Milliseconds())\n}()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The function literal gets the duration using the <code>Since()<\/code> function of the <code>time<\/code> module and displays the elapsed time in milliseconds.<\/p>\n\n\n\n<p>Finally, call the <code>fn()<\/code> function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\">fn()<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>After executing the <code>fn()<\/code> function, the <code>main()<\/code> function returns. In turn, Go will execute the defer anonymous function call to print out the duration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">defer scope<\/h2>\n\n\n\n<p>The scope of the defer statement is function. It means that the deferred calls must wait until the function exits. <\/p>\n\n\n\n<p>Sometimes, you may not want to use the defer keyword. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">package main\n\n<span class=\"hljs-keyword\">import<\/span> (\n    <span class=\"hljs-string\">\"fmt\"<\/span>\n    <span class=\"hljs-string\">\"io\"<\/span>\n    <span class=\"hljs-string\">\"os\"<\/span>\n)\n\nfunc main() {\n    <span class=\"hljs-attr\">filenames<\/span> := &#91;]string{<span class=\"hljs-string\">\"1.txt\"<\/span>, <span class=\"hljs-string\">\"2.txt\"<\/span>, <span class=\"hljs-string\">\"3.txt\"<\/span>}\n\n    <span class=\"hljs-keyword\">for<\/span> _, <span class=\"hljs-attr\">filename<\/span> := range filenames {\n        file, <span class=\"hljs-attr\">err<\/span> := os.Open(filename)\n        <span class=\"hljs-keyword\">if<\/span> err != nil {\n            fmt.Println(err)\n            <span class=\"hljs-keyword\">continue<\/span>\n        }\n        <span class=\"hljs-comment\">\/\/ read file<\/span>\n        data, <span class=\"hljs-attr\">err<\/span> := io.ReadAll(file)\n        <span class=\"hljs-keyword\">if<\/span> err != nil {\n            fmt.Println(err)\n            <span class=\"hljs-keyword\">continue<\/span>\n        }\n        fmt.Println(string(data))\n        <span class=\"hljs-comment\">\/\/ Close the file<\/span>\n        file.Close()\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this example, the program iterates over <code>filenames<\/code>, reads each file, and displays the contents on the screen.<\/p>\n\n\n\n<p>After each iteration, we call the <code>Close()<\/code> method to close the file without using the <code>defer<\/code> keyword. <\/p>\n\n\n\n<p>If we used the <code>defer<\/code> keyword, then the file would close when the function exits, not after each iteration, potentially causing an error of running out of file descriptors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defer Gotcha<\/h2>\n\n\n\n<p>A <code>defer<\/code> statement executes before the return is done. See the following example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"Go\" data-shcb-language-slug=\"go\"><span><code class=\"hljs language-go\"><span class=\"hljs-keyword\">package<\/span> main\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"fmt\"<\/span>\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">getX<\/span><span class=\"hljs-params\">()<\/span> <span class=\"hljs-params\">(x <span class=\"hljs-keyword\">int<\/span>)<\/span><\/span> {\n    <span class=\"hljs-keyword\">defer<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n        x = <span class=\"hljs-number\">10<\/span>\n    }()\n    x = <span class=\"hljs-number\">5<\/span>\n    <span class=\"hljs-keyword\">return<\/span>\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\n    fmt.Println(getX())\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Go<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">go<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">10<\/code><\/span><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define <code>getX()<\/code> function that returns an integer. It has a named return value.<\/p>\n\n\n\n<p>Second, call the <code>defer<\/code> function that sets the return value to 10:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">defer func() {\n   x = 10\n}()<\/code><\/span><\/pre>\n\n\n<p>Third, set the return value to 5 and return:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">x = <span class=\"hljs-number\">5<\/span>\n<span class=\"hljs-keyword\">return<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, call the <code>getX()<\/code> function in the main function and print out the return value.<\/p>\n\n\n\n<p>The return value in this case is 10, not 5 because the <code>defer<\/code> statement executes a function literal that sets <code>x<\/code> to 10 before the return is done.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the <code>defer<\/code> keyword to schedule a function call at the surrounding function exit.<\/li>\n\n\n\n<li>A function may have multiple <code>defer<\/code> statements. Go executes the deferred function calls in the reverse order of their appearance.<\/li>\n\n\n\n<li>Use the <code>defer<\/code> keyword for resource cleanup, logging, and locking.<\/li>\n\n\n\n<li>The scope of the <code>defer<\/code> statement is its surrounding <em>function<\/em>.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<div class=\"wth-question\">Was this tutorial helpful?<\/div>\n\t<div class=\"wth-thumbs\">\n\t\t<button\n\t\t\tdata-post=\"242\"\n\t\t\tdata-post-url=\"https:\/\/www.gotutorial.org\/go-tutorial\/go-defer\/\"\n\t\t\tdata-post-title=\"Go defer\"\n\t\t\tdata-response=\"1\"\n\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t>\n\t\t\t<svg\n\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\"\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t><\/path>\n\t\t\t<\/svg>\n\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t<\/button>\n\n\t\t<button\n\t\t\tdata-response=\"0\"\n\t\t\tdata-post=\"242\"\n\t\t\tdata-post-url=\"https:\/\/www.gotutorial.org\/go-tutorial\/go-defer\/\"\n\t\t\tdata-post-title=\"Go defer\"\n\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t>\n\t\t\t<svg\n\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstroke-width=\"2\"\n\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t><\/path>\n\t\t\t<\/svg>\n\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t<\/button>\n\t<\/div>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\t\t\t<input type=\"button\" name=\"wth-submit\" class=\"wth-btn wth-btn-submit\" id=\"wth-submit\" \/>\n\t\t\t<input type=\"button\" class=\"wth-btn wth-btn-cancel\" value=\"Cancel\" \/>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summary: in this tutorial, you will learn how to use the Go defer keyword to defer the execution of a function until the surrounding function completes. Introduction to Go defer keyword The defer keyword schedules a function call to be executed after the surrounding function completes. Here&#8217;s the syntax of the defer keyword: In this [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":10,"menu_order":16,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-242","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/comments?post=242"}],"version-history":[{"count":12,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/242\/revisions"}],"predecessor-version":[{"id":488,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/242\/revisions\/488"}],"up":[{"embeddable":true,"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/pages\/10"}],"wp:attachment":[{"href":"https:\/\/www.gotutorial.org\/wp-json\/wp\/v2\/media?parent=242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}