{"id":1076,"date":"2026-08-16T23:12:44","date_gmt":"2026-08-16T23:12:44","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1076"},"modified":"2026-08-16T23:34:46","modified_gmt":"2026-08-16T23:34:46","slug":"go-tutorials-go-functions-master-guide","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/go-tutorials-go-functions-master-guide\/","title":{"rendered":"Go Tutorials: Go Functions Master Guide"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.devopsschool.com\/tutorials\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Aug-17-2026-05_04_12-AM.png\"><img loading=\"lazy\" decoding=\"async\" width=\"819\" height=\"1024\" src=\"https:\/\/www.devopsschool.com\/tutorials\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Aug-17-2026-05_04_12-AM-819x1024.png\" alt=\"\" class=\"wp-image-1078\" srcset=\"https:\/\/www.devopsschool.com\/tutorials\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Aug-17-2026-05_04_12-AM-819x1024.png 819w, https:\/\/www.devopsschool.com\/tutorials\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Aug-17-2026-05_04_12-AM-240x300.png 240w, https:\/\/www.devopsschool.com\/tutorials\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Aug-17-2026-05_04_12-AM-768x960.png 768w, https:\/\/www.devopsschool.com\/tutorials\/wp-content\/uploads\/2026\/08\/ChatGPT-Image-Aug-17-2026-05_04_12-AM.png 1122w\" sizes=\"auto, (max-width: 819px) 100vw, 819px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>function<\/strong> is one of the most important building blocks in Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you understand functions properly, concepts such as <strong>methods, interfaces, goroutines, error handling, <code>defer<\/code>, callbacks, HTTP handlers, and concurrency<\/strong> become much easier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The best mental model is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INPUT\n  \u2193\nFUNCTION\n  \u2193\nWORK\n  \u2193\nOUTPUT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) int {\n    return a + b\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>a = 10 \u2500\u2510\n        \u251c\u2500\u2500\u25ba add() \u2500\u2500\u2500\u25ba 30\nb = 20 \u2500\u2518<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What is a Function?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function is a <strong>named block of reusable code that performs a task<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of writing:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(10 + 20)\nfmt.Println(30 + 40)\nfmt.Println(50 + 60)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you can create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) int {\n    return a + b\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and reuse it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add(10, 20)\nadd(30, 40)\nadd(50, 60)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Why use functions?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Functions help you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>avoid duplicate code<\/li>\n\n\n\n<li>divide large programs into small pieces<\/li>\n\n\n\n<li>reuse logic<\/li>\n\n\n\n<li>test code more easily<\/li>\n\n\n\n<li>make code easier to understand<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Basic Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s start with the simplest possible function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc greet() {\n    fmt.Println(\"Hello!\")\n}\n\nfunc main() {\n    greet()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello!<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Understand it<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet() {<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func\n \u2502\n \u2514\u2500\u2500 create a function\n\ngreet\n \u2502\n \u2514\u2500\u2500 function name\n\n()\n \u2502\n \u2514\u2500\u2500 no input parameters<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The body is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    fmt.Println(\"Hello!\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Execute the <code>greet<\/code> function.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Function With One Parameter<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Functions can receive information.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc greet(name string) {\n    fmt.Println(\"Hello\", name)\n}\n\nfunc main() {\n    greet(\"Rajesh\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello Rajesh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(name string)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name     string\n \u2502         \u2502\n \u2502         \u2514\u2500\u2500 data type\n \u2502\n \u2514\u2500\u2500 parameter name<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When you call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(\"Rajesh\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name = \"Rajesh\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Parameter vs Argument<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This terminology is useful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Function definition:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(name string)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>name<\/code> is a <strong>parameter<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Function call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(\"Rajesh\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\"Rajesh\"<\/code> is an <strong>argument<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Parameter = variable declared by function\nArgument  = actual value sent to function<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Multiple Parameters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function can receive multiple values.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a int, b int) {\n    fmt.Println(a + b)\n}\n\nfunc main() {\n    add(10, 20)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The values are mapped by position:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add(10, 20)\n\n     \u2502   \u2502\n     \u2502   \u2514\u2500\u2500 b = 20\n     \u2502\n     \u2514\u2500\u2500\u2500\u2500\u2500\u2500 a = 10<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Short Parameter Syntax<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go allows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">because both parameters have the same type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a, b int) {\n    fmt.Println(a + b)\n}\n\nfunc main() {\n    add(10, 20)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both versions mean exactly the same thing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Function Returning a Value<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Functions can return results.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc main() {\n\n    result := add(10, 20)\n\n    fmt.Println(result)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Look at:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The final:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">This function returns an integer.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return a + b<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">sends the result back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>10 \u2500\u2500\u2510\n     \u251c\u2500\u2500\u25ba add() \u2500\u2500\u2500\u25ba 30\n20 \u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Return Value Directly<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t always need another variable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result := add(10, 20)\n\nfmt.Println(result)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you can write:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(add(10, 20))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Complete example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc main() {\n    fmt.Println(add(10, 20))\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Multiple Return Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go functions can return multiple values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is extremely common in Go.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc calculate(a, b int) (int, int) {\n\n    sum := a + b\n    product := a * b\n\n    return sum, product\n}\n\nfunc main() {\n\n    sum, product := calculate(10, 20)\n\n    fmt.Println(\"Sum:\", sum)\n    fmt.Println(\"Product:\", product)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Sum: 30\nProduct: 200<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(int, int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>first result  \u2192 int\nsecond result \u2192 int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return sum, product<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">returns both.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Ignoring a Return Value With <code>_<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(a, b int) (int, int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">returns:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sum\nproduct<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">but you only want the sum.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>_<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc calculate(a, b int) (int, int) {\n    return a + b, a * b\n}\n\nfunc main() {\n\n    sum, _ := calculate(10, 20)\n\n    fmt.Println(sum)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>_<\/code> is called the <strong>blank identifier<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">I received this value but don&#8217;t need it.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Named Return Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go allows return variables to be named.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(a, b int) (sum int, product int) {\n\n    sum = a + b\n    product = a * b\n\n    return\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Complete example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc calculate(a, b int) (sum int, product int) {\n\n    sum = a + b\n    product = a * b\n\n    return\n}\n\nfunc main() {\n\n    sum, product := calculate(10, 20)\n\n    fmt.Println(sum)\n    fmt.Println(product)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30\n200<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">has no values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s because <code>sum<\/code> and <code>product<\/code> were already declared as return variables.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Should you use named returns?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">They can be useful in small functions, but don&#8217;t overuse them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is usually clearer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return sum, product<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">than:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">especially in larger functions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Functions and Pass-by-Value<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is <strong>extremely important<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go passes function arguments <strong>by value<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc changeNumber(number int) {\n\n    number = 100\n\n    fmt.Println(\"Inside:\", number)\n}\n\nfunc main() {\n\n    number := 10\n\n    changeNumber(number)\n\n    fmt.Println(\"Outside:\", number)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Inside: 100\nOutside: 10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because Go creates a copy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main()\n\nnumber = 10\n    \u2502\n    \u2502 copy\n    \u25bc\n\nchangeNumber()\n\nnumber = 10\n\nnumber = 100<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The original variable is untouched.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Original\nnumber = 10\n\nCopy inside function\nnumber = 100<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is one of the fundamental rules of Go:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Go passes arguments by value.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Pointer Parameters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">What if the function really needs to change the original variable?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use a pointer.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc changeNumber(number *int) {\n\n    *number = 100\n}\n\nfunc main() {\n\n    number := 10\n\n    changeNumber(&amp;number)\n\n    fmt.Println(number)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>100<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Two important operators are involved:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operator<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>&amp;<\/code><\/td><td>get address<\/td><\/tr><tr><td><code>*<\/code><\/td><td>access value at address<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&amp;number<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Give me the memory address of <code>number<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*number<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">inside the function means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Access the value stored at that address.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main\n\nnumber = 10\n   \u2502\n   \u2502 address\n   \u25bc\n0x1000\n\n\nchangeNumber()\n\nnumber\n   \u2502\n   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba 0x1000\n                  \u2502\n                  \u25bc\n               original\n               number<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*number = 100<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">changes the original.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Incrementing Through a Pointer<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Your earlier example contained:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(*callCount)++<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc increment(count *int) {\n    (*count)++\n}\n\nfunc main() {\n\n    calls := 0\n\n    increment(&amp;calls)\n\n    fmt.Println(calls)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Breaking it down:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&amp;calls<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Address of <code>calls<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>count<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">stores that address.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*count<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Value stored at the address.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(*count)++<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Increase that original value by 1.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Variadic Functions \u2014 <code>...<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function sometimes needs an unknown number of arguments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go provides <strong>variadic functions<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc total(numbers ...int) int {\n\n    sum := 0\n\n    for _, number := range numbers {\n        sum += number\n    }\n\n    return sum\n}\n\nfunc main() {\n\n    fmt.Println(total(10))\n    fmt.Println(total(10, 20))\n    fmt.Println(total(10, 20, 30))\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>10\n30\n60<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers ...int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Accept zero or more integers.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the function, <code>numbers<\/code> behaves like a slice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;10, 20, 30]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Variadic Parameter Must Be Last<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is valid:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(name string, numbers ...int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is invalid:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(numbers ...int, name string)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Rule:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">A variadic parameter must always be the final parameter.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Passing a Slice to a Variadic Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers := &#91;]int{10, 20, 30}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can pass the slice using:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc total(numbers ...int) int {\n\n    sum := 0\n\n    for _, number := range numbers {\n        sum += number\n    }\n\n    return sum\n}\n\nfunc main() {\n\n    numbers := &#91;]int{10, 20, 30}\n\n    result := total(numbers...)\n\n    fmt.Println(result)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>60<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice the difference:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is a slice.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Expand the slice into individual arguments.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>total(numbers...)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">becomes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>total(10, 20, 30)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Your <code>summarize()<\/code> Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now your original function becomes much easier to understand.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func summarize(\n    label string,\n    callCount *int,\n    scores ...int,\n) (string, int) {\n\n    (*callCount)++\n\n    total := 0\n\n    for _, score := range scores {\n        total += score\n    }\n\n    return strings.ToUpper(label), total\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It contains:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>                 summarize\n                     \u2502\n      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n      \u2502              \u2502              \u2502\n      \u25bc              \u25bc              \u25bc\n normal param    pointer param   variadic param\n\nlabel string    callCount *int   scores ...int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And returns:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(string, int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Complete flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>summarize(\n    \"team score\",\n    &amp;calls,\n    10, 20, 30,\n)\n\n        \u2502\n        \u25bc\n\nlabel\n\"team score\"\n\ncallCount\npoints to calls\n\nscores\n&#91;10,20,30]\n\n        \u2502\n        \u25bc\n\ncalls++\ncalls = 1\n\n        \u2502\n        \u25bc\n\n10 + 20 + 30\ntotal = 60\n\n        \u2502\n        \u25bc\n\nstrings.ToUpper(\"team score\")\n\"TEAM SCORE\"\n\n        \u2502\n        \u25bc\n\nreturn\n\n\"TEAM SCORE\", 60<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Functions Can Call Other Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Functions aren&#8217;t isolated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One function can call another.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc printResult(a, b int) {\n\n    result := add(a, b)\n\n    fmt.Println(result)\n}\n\nfunc main() {\n    printResult(10, 20)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main()\n   \u2502\n   \u25bc\nprintResult()\n   \u2502\n   \u25bc\nadd()\n   \u2502\n   \u25bc\n30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is how real applications are built: many small functions working together.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Functions Are Values in Go<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is an important feature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A function can be stored inside a variable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc main() {\n\n    operation := add\n\n    result := operation(10, 20)\n\n    fmt.Println(result)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>operation := add<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">doesn&#8217;t execute <code>add<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It stores the function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>operation(10, 20)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">executes it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Function Type<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Functions themselves have types.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For this function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">the function type is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func(int, int) int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc main() {\n\n    var operation func(int, int) int\n\n    operation = add\n\n    fmt.Println(operation(10, 20))\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Passing a Function Into Another Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Because functions are values, you can pass them into other functions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is called a <strong>higher-order function<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add(a, b int) int {\n    return a + b\n}\n\nfunc calculate(\n    a int,\n    b int,\n    operation func(int, int) int,\n) int {\n\n    return operation(a, b)\n}\n\nfunc main() {\n\n    result := calculate(10, 20, add)\n\n    fmt.Println(result)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>calculate\n   \u2502\n   \u251c\u2500\u2500 10\n   \u251c\u2500\u2500 20\n   \u2502\n   \u2514\u2500\u2500 add function\n          \u2502\n          \u25bc\n      add(10,20)\n          \u2502\n          \u25bc\n         30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This pattern is used heavily for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>callbacks<\/li>\n\n\n\n<li>HTTP handlers<\/li>\n\n\n\n<li>middleware<\/li>\n\n\n\n<li>sorting<\/li>\n\n\n\n<li>concurrency<\/li>\n\n\n\n<li>event processing<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Anonymous Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function doesn&#8217;t always need a name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is called an <strong>anonymous function<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    add := func(a, b int) int {\n        return a + b\n    }\n\n    result := add(10, 20)\n\n    fmt.Println(result)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func(a, b int) int {\n    return a + b\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">has no name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is assigned to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Immediately Executed Anonymous Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can also execute an anonymous function immediately.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    func() {\n        fmt.Println(\"Hello\")\n    }()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>}()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The final <code>()<\/code> executes the function immediately.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Closures<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A closure is an anonymous function that remembers variables outside itself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    count := 0\n\n    increment := func() {\n\n        count++\n\n        fmt.Println(count)\n    }\n\n    increment()\n    increment()\n    increment()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1\n2\n3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The function can access:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>count<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">even though <code>count<\/code> was created outside the function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>count = 0\n   \u25b2\n   \u2502\nincrement()\n   \u2502\n   \u251c\u2500\u2500 count++\n   \u2514\u2500\u2500 remembers count<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Closures are commonly used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>callbacks<\/li>\n\n\n\n<li>middleware<\/li>\n\n\n\n<li>configuration<\/li>\n\n\n\n<li>state management<\/li>\n\n\n\n<li>goroutines<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Function Returning Another Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function can even return another function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc createMultiplier(multiplier int) func(int) int {\n\n    return func(number int) int {\n        return number * multiplier\n    }\n}\n\nfunc main() {\n\n    double := createMultiplier(2)\n\n    fmt.Println(double(10))\n    fmt.Println(double(20))\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>20\n40<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>double<\/code> remembers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>multiplier = 2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is another closure example.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Callback Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A callback is simply:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">A function passed to another function so it can be called later.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc process(number int, callback func(int)) {\n\n    result := number * 2\n\n    callback(result)\n}\n\nfunc printResult(result int) {\n\n    fmt.Println(\"Result:\", result)\n}\n\nfunc main() {\n\n    process(10, printResult)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Result: 20<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main\n \u2502\n \u25bc\nprocess(10, printResult)\n \u2502\n \u251c\u2500\u2500 10 \u00d7 2\n \u2502\n \u25bc\n20\n \u2502\n \u25bc\nprintResult(20)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Returning Errors From Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is perhaps the <strong>most common Go function pattern<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of exceptions, Go commonly returns:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>value + error<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"errors\"\n    \"fmt\"\n)\n\nfunc divide(a, b float64) (float64, error) {\n\n    if b == 0 {\n        return 0, errors.New(\"cannot divide by zero\")\n    }\n\n    return a \/ b, nil\n}\n\nfunc main() {\n\n    result, err := divide(10, 2)\n\n    if err != nil {\n        fmt.Println(\"Error:\", err)\n        return\n    }\n\n    fmt.Println(result)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func divide(a, b float64) (float64, error)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">returns:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result\nerror<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This pattern appears everywhere in Go:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>value, err := someFunction()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Early Return<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go code commonly uses <strong>early returns<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if something {\n    \/\/ lots of logic\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you often see:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if invalid {\n    return\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc checkAge(age int) {\n\n    if age &lt; 18 {\n        fmt.Println(\"Not allowed\")\n        return\n    }\n\n    fmt.Println(\"Allowed\")\n}\n\nfunc main() {\n\n    checkAge(20)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Allowed<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This style keeps Go code simple and flat.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. <code>defer<\/code> Inside Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><code>defer<\/code> means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Execute this function when the current function is about to finish.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc demo() {\n\n    defer fmt.Println(\"Goodbye\")\n\n    fmt.Println(\"Hello\")\n}\n\nfunc main() {\n    demo()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello\nGoodbye<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Although:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>defer fmt.Println(\"Goodbye\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">appears first, it runs when <code>demo()<\/code> finishes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>demo()\n \u2502\n \u251c\u2500\u2500 register deferred function\n \u2502\n \u251c\u2500\u2500 print Hello\n \u2502\n \u2514\u2500\u2500 finishing\n        \u2502\n        \u25bc\n     print Goodbye<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>defer<\/code> is commonly used for cleanup:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>file.Close()<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>rows.Close()<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>mutex.Unlock()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Multiple <code>defer<\/code> Calls<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Deferred functions run in <strong>reverse order<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    defer fmt.Println(\"One\")\n    defer fmt.Println(\"Two\")\n    defer fmt.Println(\"Three\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Three\nTwo\nOne<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Think of a stack:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>defer One\ndefer Two\ndefer Three\n\nfinish function\n\nThree\nTwo\nOne<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Recursive Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A recursive function calls itself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc countdown(number int) {\n\n    if number == 0 {\n        return\n    }\n\n    fmt.Println(number)\n\n    countdown(number - 1)\n}\n\nfunc main() {\n\n    countdown(5)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>5\n4\n3\n2\n1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>countdown(5)\n    \u2193\ncountdown(4)\n    \u2193\ncountdown(3)\n    \u2193\ncountdown(2)\n    \u2193\ncountdown(1)\n    \u2193\ncountdown(0)\n    \u2193\nreturn<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This condition:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if number == 0 {\n    return\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is called the <strong>base case<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without a base case, recursion would continue until the program fails.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Methods vs Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This distinction is extremely important.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Normal function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(name string) {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (user User) greet() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A method belongs to a type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype User struct {\n    Name string\n}\n\nfunc (user User) Greet() {\n\n    fmt.Println(\"Hello\", user.Name)\n}\n\nfunc main() {\n\n    user := User{\n        Name: \"Rajesh\",\n    }\n\n    user.Greet()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello Rajesh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The special part is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(user User)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is called the <strong>receiver<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FUNCTION\n\ngreet(user)\n\n\nMETHOD\n\nuser.Greet()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Pointer Receiver Methods<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A method that needs to change the original struct usually uses a pointer receiver.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype User struct {\n    Name string\n}\n\nfunc (user *User) ChangeName(name string) {\n\n    user.Name = name\n}\n\nfunc main() {\n\n    user := User{\n        Name: \"Rajesh\",\n    }\n\n    user.ChangeName(\"Kumar\")\n\n    fmt.Println(user.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Kumar<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pointer receiver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (user *User)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">allows modification of the original <code>User<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Function vs Method<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Function<\/th><th>Method<\/th><\/tr><\/thead><tbody><tr><td>Belongs to type<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Has receiver<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Called as<\/td><td><code>add()<\/code><\/td><td><code>user.Greet()<\/code><\/td><\/tr><tr><td>Can receive parameters<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Can return values<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Can be variadic<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Can return errors<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Can use pointers<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add(10, 20)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">versus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Greet()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Generic Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Modern Go supports <strong>generics<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose you want an <code>add<\/code> function that works with both integers and floats.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can write:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc add&#91;T int | float64](a, b T) T {\n\n    return a + b\n}\n\nfunc main() {\n\n    fmt.Println(add(10, 20))\n\n    fmt.Println(add(10.5, 20.5))\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30\n31<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;T int | float64]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><code>T<\/code> may be an <code>int<\/code> or <code>float64<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>a, b T<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means both parameters use that type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generics are useful, but I recommend learning ordinary functions thoroughly before going deep into them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. <code>main()<\/code> Is Also a Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Your Go program starts with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func main()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc main() {\n\n    fmt.Println(\"Hello\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>main()<\/code> is special because in a runnable Go program:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Operating System\n      \u2502\n      \u25bc\nGo program\n      \u2502\n      \u25bc\nmain()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The program starts executing from <code>main()<\/code> in <code>package main<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. <code>init()<\/code> Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go also has a special function named:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>init()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc init() {\n\n    fmt.Println(\"init\")\n}\n\nfunc main() {\n\n    fmt.Println(\"main\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>init\nmain<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>init()<\/code> executes before <code>main()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usually it is used sparingly for package initialization.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Functions Cannot Be Overloaded in Go<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Languages such as Java support:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add(int, int)\n\nadd(float, float)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">with the same function name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go does <strong>not<\/strong> support traditional function overloading.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You cannot write:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) {\n}\n\nfunc add(a float64, b float64) {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">because both functions are named <code>add<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usually you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>use different function names<\/li>\n\n\n\n<li>use interfaces<\/li>\n\n\n\n<li>use generics<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">depending on the situation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Go Has No Default Function Parameters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Some languages allow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(name=\"Rajesh\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go doesn&#8217;t support default parameters directly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You normally make them explicit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(name string) {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(\"Rajesh\")<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Go Has No Optional Parameters Directly<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go doesn&#8217;t have standard optional arguments like Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But variadic arguments sometimes provide similar behavior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func log(messages ...string)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>log()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>log(\"hello\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>log(\"hello\", \"world\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For complex configuration, Go often uses structs or the <strong>functional options pattern<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s an advanced topic for later.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Function Scope<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Variables created inside a function normally exist only inside that function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc test() {\n\n    message := \"Hello\"\n\n    fmt.Println(message)\n}\n\nfunc main() {\n\n    test()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You cannot access:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>message<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">directly from <code>main()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because its scope belongs to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>test()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main scope\n\u2502\n\u2502\n\u2514\u2500\u2500 test scope\n      \u2502\n      \u2514\u2500\u2500 message<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Local vs Package-Level Variables<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Variable outside a function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var count = 10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is package-level.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nvar count = 10\n\nfunc show() {\n\n    fmt.Println(count)\n}\n\nfunc main() {\n\n    show()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Functions inside the package can access <code>count<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But generally, prefer passing data to functions rather than relying heavily on global\/package variables.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Exported Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In Go, capitalization controls package visibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lowercase:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Only accessible within the same package.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Uppercase:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func Calculate()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Exported and accessible from other packages.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>calculator.Add()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here <code>Add<\/code> needs to start with a capital letter if another package uses it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This Go rule applies to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>functions<\/li>\n\n\n\n<li>methods<\/li>\n\n\n\n<li>structs<\/li>\n\n\n\n<li>fields<\/li>\n\n\n\n<li>interfaces<\/li>\n\n\n\n<li>variables<\/li>\n\n\n\n<li>constants<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. Function Signature<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You will often hear the term <strong>function signature<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Important parts are essentially:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function name\nparameters\nparameter types\nreturn types<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add(int, int) \u2192 int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Another:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func summarize(\n    label string,\n    callCount *int,\n    scores ...int,\n) (string, int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can mentally read its signature as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>summarize(\n    string,\n    pointer-to-int,\n    many-int\n)\n\u2192\n(string, int)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Function Anatomy \u2014 Master View<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func summarize(label string, callCount *int, scores ...int) (string, int) {\n    \/\/ body\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The anatomy is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func summarize(label string, callCount *int, scores ...int) (string, int)\n \u2502       \u2502          \u2502             \u2502              \u2502             \u2502\n \u2502       \u2502          \u2502             \u2502              \u2502             \u2502\n \u2502       \u2502          \u2502             \u2502              \u2502             \u2514 return types\n \u2502       \u2502          \u2502             \u2502              \u2502\n \u2502       \u2502          \u2502             \u2502              \u2514 variadic parameter\n \u2502       \u2502          \u2502             \u2502\n \u2502       \u2502          \u2502             \u2514 pointer parameter\n \u2502       \u2502          \u2502\n \u2502       \u2502          \u2514 normal parameter\n \u2502       \u2502\n \u2502       \u2514 function name\n \u2502\n \u2514 function declaration<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. The Most Important Function Patterns<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You will see these constantly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">No input, no output<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func hello() {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Input, no output<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func hello(name string) {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Input and output<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    return a + b\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Multiple outputs<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(a, b int) (int, int) {\n    return a + b, a * b\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Value + error<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func load() (string, error) {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Pointer parameter<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func update(value *int) {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Variadic<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func total(values ...int) int {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Function parameter<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(\n    operation func(int, int) int,\n) {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Method<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func (user User) Greet() {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Pointer receiver method<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func (user *User) Update() {\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">48. Master Comparison Table<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Concept<\/th><th>Syntax<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>Basic function<\/td><td><code>func hello()<\/code><\/td><td>reusable code<\/td><\/tr><tr><td>Parameter<\/td><td><code>name string<\/code><\/td><td>send data<\/td><\/tr><tr><td>Multiple parameters<\/td><td><code>a, b int<\/code><\/td><td>send multiple values<\/td><\/tr><tr><td>Return<\/td><td><code>func f() int<\/code><\/td><td>return result<\/td><\/tr><tr><td>Multiple return<\/td><td><code>(int, string)<\/code><\/td><td>return multiple values<\/td><\/tr><tr><td>Named return<\/td><td><code>(result int)<\/code><\/td><td>name result variable<\/td><\/tr><tr><td>Blank identifier<\/td><td><code>_<\/code><\/td><td>ignore value<\/td><\/tr><tr><td>Pointer parameter<\/td><td><code>value *int<\/code><\/td><td>modify indirectly<\/td><\/tr><tr><td>Address<\/td><td><code>&amp;value<\/code><\/td><td>get memory address<\/td><\/tr><tr><td>Dereference<\/td><td><code>*ptr<\/code><\/td><td>access pointed value<\/td><\/tr><tr><td>Variadic<\/td><td><code>values ...int<\/code><\/td><td>any number of arguments<\/td><\/tr><tr><td>Slice expansion<\/td><td><code>values...<\/code><\/td><td>pass slice as arguments<\/td><\/tr><tr><td>Anonymous function<\/td><td><code>func() {}<\/code><\/td><td>unnamed function<\/td><\/tr><tr><td>Closure<\/td><td>anonymous function + outer variable<\/td><td>preserve\/access state<\/td><\/tr><tr><td>Function variable<\/td><td><code>f := add<\/code><\/td><td>store function<\/td><\/tr><tr><td>Function parameter<\/td><td><code>func(int) int<\/code><\/td><td>callback<\/td><\/tr><tr><td>Higher-order function<\/td><td>function receives\/returns function<\/td><td>flexible behavior<\/td><\/tr><tr><td>Recursion<\/td><td>function calls itself<\/td><td>recursive problems<\/td><\/tr><tr><td><code>defer<\/code><\/td><td><code>defer cleanup()<\/code><\/td><td>run when function exits<\/td><\/tr><tr><td>Method<\/td><td><code>func (x T) F()<\/code><\/td><td>function associated with type<\/td><\/tr><tr><td>Pointer receiver<\/td><td><code>func (x *T) F()<\/code><\/td><td>mutate receiver<\/td><\/tr><tr><td>Generic function<\/td><td><code>func F[T ...]<\/code><\/td><td>work with multiple types<\/td><\/tr><tr><td>Exported function<\/td><td><code>func Add()<\/code><\/td><td>accessible from packages<\/td><\/tr><tr><td><code>main()<\/code><\/td><td><code>func main()<\/code><\/td><td>program entry<\/td><\/tr><tr><td><code>init()<\/code><\/td><td><code>func init()<\/code><\/td><td>package initialization<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">49. What You Should Learn First<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t try to master everything simultaneously.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Learn functions in this order:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>LEVEL 1\n\u2502\n\u251c\u2500\u2500 Basic function\n\u251c\u2500\u2500 Parameters\n\u251c\u2500\u2500 Return values\n\u2514\u2500\u2500 Multiple returns\n       \u2502\n       \u25bc\nLEVEL 2\n\u2502\n\u251c\u2500\u2500 Pass by value\n\u251c\u2500\u2500 Pointers\n\u251c\u2500\u2500 Blank identifier\n\u2514\u2500\u2500 Variadic parameters\n       \u2502\n       \u25bc\nLEVEL 3\n\u2502\n\u251c\u2500\u2500 Anonymous functions\n\u251c\u2500\u2500 Function variables\n\u251c\u2500\u2500 Callbacks\n\u2514\u2500\u2500 Closures\n       \u2502\n       \u25bc\nLEVEL 4\n\u2502\n\u251c\u2500\u2500 defer\n\u251c\u2500\u2500 recursion\n\u251c\u2500\u2500 errors\n\u2514\u2500\u2500 function types\n       \u2502\n       \u25bc\nLEVEL 5\n\u2502\n\u251c\u2500\u2500 Methods\n\u251c\u2500\u2500 Pointer receivers\n\u251c\u2500\u2500 Interfaces\n\u2514\u2500\u2500 Generics<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">50. The 10 Rules I Would Memorize<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re learning Go, these ten rules cover most function confusion:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A function is created using:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>func<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Parameters go inside:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>()<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Return type comes after the parameters:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Multiple values can be returned:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>func f() (int, string)<\/code><\/pre>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><code>_<\/code> means:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>ignore this value<\/code><\/pre>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>Go passes arguments <strong>by value<\/strong>.<\/li>\n\n\n\n<li><code>&amp;x<\/code> means:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>address of x<\/code><\/pre>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li><code>*ptr<\/code> means:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>value at that address<\/code><\/pre>\n\n\n\n<ol start=\"9\" class=\"wp-block-list\">\n<li><code>...int<\/code> means:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>zero or more integers<\/code><\/pre>\n\n\n\n<ol start=\"10\" class=\"wp-block-list\">\n<li>A method is basically a function with a <strong>receiver<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>func (user User) Greet()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">51. One Final Example Combining the Important Concepts<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now revisit your example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"fmt\"\n    \"strings\"\n)\n\nfunc summarize(\n    label string,\n    callCount *int,\n    scores ...int,\n) (string, int) {\n\n    \/\/ Modify the original calls variable\n    (*callCount)++\n\n    \/\/ Create total\n    total := 0\n\n    \/\/ Loop through all scores\n    for _, score := range scores {\n\n        \/\/ Add each score\n        total += score\n    }\n\n    \/\/ Return two values\n    return strings.ToUpper(label), total\n}\n\nfunc main() {\n\n    calls := 0\n\n    label, total := summarize(\n        \"team score\",\n        &amp;calls,\n        10,\n        20,\n        30,\n    )\n\n    fmt.Println(label)\n    fmt.Println(\"Total:\", total)\n    fmt.Println(\"Function calls:\", calls)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TEAM SCORE\nTotal: 60\nFunction calls: 1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This tiny program demonstrates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u2713 function declaration\n\n\u2713 normal parameter\n    label string\n\n\u2713 pointer parameter\n    callCount *int\n\n\u2713 variadic parameter\n    scores ...int\n\n\u2713 multiple return values\n    (string, int)\n\n\u2713 pointer dereferencing\n    (*callCount)++\n\n\u2713 local variable\n    total := 0\n\n\u2713 range loop\n    range scores\n\n\u2713 blank identifier\n    _\n\n\u2713 return\n    return ...\n\n\u2713 calling another package's function\n    strings.ToUpper()\n\n\u2713 receiving multiple values\n    label, total := ...\n\n\u2713 address operator\n    &amp;calls<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">The master mental model<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Whenever you see a Go function, don&#8217;t try to understand the entire line at once.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Read it in this order:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1. What is the function called?\n\n2. What goes IN?\n\n3. Does anything use a pointer?\n\n4. Is anything variadic?\n\n5. What happens inside?\n\n6. What comes OUT?<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func summarize(\n    label string,\n    callCount *int,\n    scores ...int,\n) (string, int)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">read it as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NAME\n\u2502\n\u2514\u2500\u2500 summarize\n\nINPUT\n\u2502\n\u251c\u2500\u2500 label      \u2192 string\n\u251c\u2500\u2500 callCount  \u2192 pointer to int\n\u2514\u2500\u2500 scores     \u2192 many integers\n\nOUTPUT\n\u2502\n\u251c\u2500\u2500 string\n\u2514\u2500\u2500 int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once you develop this habit, even complicated Go function declarations become much easier to read.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A function is one of the most important building blocks in Go. If you understand functions properly, concepts such as methods, interfaces, goroutines, error handling, defer, callbacks,&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1076","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1076","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/comments?post=1076"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1076\/revisions"}],"predecessor-version":[{"id":1079,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1076\/revisions\/1079"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}