{"id":1049,"date":"2026-08-16T18:49:01","date_gmt":"2026-08-16T18:49:01","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1049"},"modified":"2026-08-17T06:25:55","modified_gmt":"2026-08-17T06:25:55","slug":"go-tutorial-go-functions-and-methods","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/go-tutorial-go-functions-and-methods\/","title":{"rendered":"Go Tutorial: Go Functions and Methods"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go programs are built from small pieces of reusable behavior. Two of the most important pieces are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Functions<\/strong><\/li>\n\n\n\n<li><strong>Methods<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">At first they look almost identical.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) int {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (c Calculator) Add(a int, b int) int {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The important difference is this part:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(c Calculator)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It is called the <strong>receiver<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A method is therefore essentially a function associated with a receiver type. In Go&#8217;s specification, a method is defined as a function with a receiver.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. The Big Picture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Think about functions like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Input\n  |\n  v\nFunction\n  |\n  v\nOutput\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result := add(10, 20)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The function doesn&#8217;t need to belong to anything.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Methods are different:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        Object \/ Value\n              |\n              v\n          +--------+\n          | Method |\n          +--------+\n              |\n              v\n           Result\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(500)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Deposit<\/code> represents behavior associated with an <code>account<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The easiest mental model is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FUNCTION\n-------\nDo something.\n\nMETHOD\n------\nAsk a particular type\/value to do something.\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\">2. Function vs Method in One Example<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Consider calculating a rectangle&#8217;s area.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using a function<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func area(width float64, height float64) float64 {\n    return width * height\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result := area(10, 5)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Using a method<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>type Rectangle struct {\n    Width  float64\n    Height float64\n}\n\nfunc (r Rectangle) Area() float64 {\n    return r.Width * r.Height\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rect := Rectangle{\n    Width:  10,\n    Height: 5,\n}\n\nresult := rect.Area()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both approaches work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But they communicate different ideas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The function says:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Calculate an area using these two numbers.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The method says:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Rectangle, calculate your area.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That distinction becomes extremely useful as programs become larger.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART I \u2014 GO FUNCTIONS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">3. What Is a Function?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function is a reusable block of code designed to perform a particular task.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Basic syntax:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func functionName(parameters) returnType {\n    \/\/ statements\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet() {\n    fmt.Println(\"Hello!\")\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet()\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\">4. Your First Go Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Complete program:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc greet() {\n    fmt.Println(\"Hello, Go!\")\n}\n\nfunc main() {\n    greet()\n}\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, Go!\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Line-by-line explanation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Line 1<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Every Go source file belongs to a package.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>main<\/code> is special because it is used for executable programs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Line 2<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import \"fmt\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Imports Go&#8217;s <code>fmt<\/code> package.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We need it because we use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println()\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\">Line 3<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet() {\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>func<\/code> tells Go that we&#8217;re declaring a function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>greet<\/code> is the function&#8217;s name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The empty parentheses:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">mean the function receives no parameters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>{<\/code> begins the function body.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Line 4<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(\"Hello, Go!\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Prints text.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Line 5<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ends the <code>greet<\/code> function.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Line 6<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func main() {\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Every executable Go program starts execution from the <code>main<\/code> function in package <code>main<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Line 7<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>greet()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Calls our function.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Function Parameters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Functions become much more useful when we give them input.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(name string) {\n    fmt.Println(\"Hello,\", name)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(\"Alice\")\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, Alice\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding the parameter<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>name string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>parameter name : name\nparameter type : string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The value:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Alice\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is called an <strong>argument<\/strong> when we call the function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Technically:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Parameter = variable declared by function\n\nArgument = actual value supplied when calling it\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\">6. Multiple Parameters<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) {\n    fmt.Println(a + b)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>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\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go also allows parameters of the same type to be shortened:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) {\n    fmt.Println(a + b)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both 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. Returning a Value<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of printing the result inside a function, it is usually more reusable to return it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result := add(10, 20)\n\nfmt.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\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Line-by-line<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first <code>int<\/code> describes the parameters:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>a, b int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The final <code>int<\/code> describes the returned value:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int\n                       ^\n                    return type\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return a + b\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">calculates the value and gives it back to the caller.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Why Returning Is Usually Better Than Printing<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Compare these functions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Version A<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) {\n    fmt.Println(a + b)\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Version B<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Version B is much more reusable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>total := add(10, 20)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(add(10, 20))\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>finalPrice := add(10, 20) * 2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if add(10, 20) &gt; 25 {\n    fmt.Println(\"Large result\")\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A useful design principle is:<\/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\">Functions that calculate values should generally return those values rather than deciding how they are displayed.<\/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\">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 feature is used extensively in idiomatic Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func divide(a, b float64) (float64, bool) {\n    if b == 0 {\n        return 0, false\n    }\n\n    return a \/ b, true\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result, ok := divide(10, 2)\n\nfmt.Println(result)\nfmt.Println(ok)\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\ntrue\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\">10. Multiple Returns and Errors<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most important Go patterns is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>value, err := function()\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 (\n    \"errors\"\n    \"fmt\"\n)\n\nfunc divide(a, b float64) (float64, error) {\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    result, err := divide(10, 2)\n\n    if err != nil {\n        fmt.Println(\"Error:\", err)\n        return\n    }\n\n    fmt.Println(\"Result:\", result)\n}\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: 5\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\">11. Understanding the Error Pattern<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Look carefully at:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func divide(a, b float64) (float64, error)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The function returns two things:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>float64<\/code><\/li>\n\n\n\n<li><code>error<\/code><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">On failure:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return 0, errors.New(\"cannot divide by zero\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On success:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return a \/ b, nil\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>nil<\/code> means there is no error.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The caller checks:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if err != nil {\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This pattern appears everywhere in Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples include:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>file, err := os.Open(...)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>data, err := os.ReadFile(...)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>value, err := strconv.Atoi(...)\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\">12. Ignoring a Return Value<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>value, err := divide(10, 2)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">but you don&#8217;t need <code>value<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use the blank identifier:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>_, err := divide(10, 2)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Similarly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>value, _ := divide(10, 2)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is syntactically possible, although ignoring errors without a reason is usually a bad practice.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Named Return Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go allows returned values to have names.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(a, b int) (sum int, product int) {\n    sum = a + b\n    product = a * b\n\n    return\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s, p := calculate(5, 3)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Result:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s = 8\np = 15\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because the results were declared as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(sum int, product int)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">the function can use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">without explicitly listing them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is called a <strong>naked return<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Recommendation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Named returns are useful when they make a function&#8217;s meaning clearer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For short functions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func dimensions() (width int, height int)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">can be helpful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But avoid large functions full of naked returns because they become difficult to understand.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Functions Are Passed Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">An important Go concept is:<\/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\">Function arguments are passed by value.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func changeNumber(n int) {\n    n = 100\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>number := 10\n\nchangeNumber(number)\n\nfmt.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>10\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The function receives its own copy of <code>number<\/code>.<\/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\n        copy\n         |\n         v\n\nchangeNumber:\n\nn = 10\nn = 100\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The original <code>number<\/code> remains <code>10<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Functions with Pointer Parameters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you want a function to modify the caller&#8217;s value, you can pass a pointer.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func changeNumber(n *int) {\n    *n = 100\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>number := 10\n\nchangeNumber(&amp;number)\n\nfmt.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\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Important symbols<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>&amp;number\n<\/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 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>*n\n<\/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\">Access the value stored at the address contained in <code>n<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">This same concept becomes extremely important when we study pointer receiver methods.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Variadic Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes you don&#8217;t know how many arguments a function will receive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func sum(numbers ...int) int {\n    total := 0\n\n    for _, number := range numbers {\n        total += number\n    }\n\n    return total\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Calls:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(sum())\nfmt.Println(sum(10))\nfmt.Println(sum(10, 20))\nfmt.Println(sum(10, 20, 30, 40))\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Outputs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0\n10\n30\n100\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The specification defines a function whose final parameter uses <code>...<\/code> as a <strong>variadic function<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">behaves like a slice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;]int\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\">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>values := &#91;]int{10, 20, 30}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You cannot simply write:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sum(values)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sum(values...)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The trailing:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">expands the slice into arguments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sum(values...)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">becomes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sum(10, 20, 30)\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\">18. Functions Are Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is where Go functions become much more powerful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A function can be stored in a variable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    return a + b\n}\n\nfunc main() {\n    operation := add\n\n    result := operation(10, 20)\n\n    fmt.Println(result)\n}\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\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The official Go documentation describes Go as supporting first-class functions, including function values, higher-order functions, function literals, and closures.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Function Types<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function has a type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int\n<\/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\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So this is legal:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var operation func(int, int) int\n\noperation = add\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result := operation(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\">20. Passing a Function to Another Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Functions can receive 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<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 multiply(a, b int) int {\n    return a * b\n}\n\nfunc calculate(a, b int, operation func(int, int) int) int {\n    return operation(a, b)\n}\n\nfunc main() {\n    fmt.Println(calculate(10, 5, add))\n    fmt.Println(calculate(10, 5, multiply))\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>15\n50\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\">21. Understanding the Higher-Order Function<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Look at:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(\n    a, b int,\n    operation func(int, int) int,\n) int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>operation<\/code> is a parameter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But instead of being:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">its type is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func(int, int) int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore <code>calculate<\/code> can execute:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>operation(a, b)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The caller decides what <code>operation<\/code> means.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This pattern is useful for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>callbacks<\/li>\n\n\n\n<li>filtering<\/li>\n\n\n\n<li>sorting<\/li>\n\n\n\n<li>middleware<\/li>\n\n\n\n<li>event handlers<\/li>\n\n\n\n<li>retry logic<\/li>\n\n\n\n<li>testing<\/li>\n\n\n\n<li>configurable algorithms<\/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\">22. Anonymous Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function does not always need a name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func() {\n    fmt.Println(\"Hello\")\n}()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This declares and immediately executes an anonymous function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">More commonly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet := func(name string) {\n    fmt.Println(\"Hello,\", name)\n}\n\ngreet(\"Alice\")\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, Alice\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\">23. Anonymous Functions as Callbacks<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func multiply(a, b int) int {\n    return a * b\n}\n\ncalculate(10, 5, multiply)\n<\/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>result := calculate(\n    10,\n    5,\n    func(a, b int) int {\n        return a * b\n    },\n)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful when the behavior is small and only needed in one place.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Closures<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">An anonymous function can remember variables from its surrounding scope.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func makeCounter() func() int {\n    count := 0\n\n    return func() int {\n        count++\n        return count\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>counter := makeCounter()\n\nfmt.Println(counter())\nfmt.Println(counter())\nfmt.Println(counter())\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\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s happening?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>makeCounter()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">runs, it creates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>count := 0\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then it returns another function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That returned function continues to access <code>count<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>counter\n   |\n   v\nreturned function\n   |\n   +---- remembers ----&gt; count\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Each call modifies the remembered variable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Closures are useful for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>counters<\/li>\n\n\n\n<li>configuration<\/li>\n\n\n\n<li>middleware<\/li>\n\n\n\n<li>stateful callbacks<\/li>\n\n\n\n<li>function factories<\/li>\n\n\n\n<li>test helpers<\/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\">25. Functions Returning Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can also deliberately create functions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func multiplier(factor int) func(int) int {\n    return func(value int) int {\n        return value * factor\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>double := multiplier(2)\ntriple := multiplier(3)\n\nfmt.Println(double(10))\nfmt.Println(triple(10))\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\n30\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>double<\/code> closure remembers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>factor = 2\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">while <code>triple<\/code> remembers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>factor = 3\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\">26. Recursion<\/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>func factorial(n int) int {\n    if n &lt;= 1 {\n        return 1\n    }\n\n    return n * factorial(n-1)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(factorial(5))\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>factorial(5)\n= 5 * factorial(4)\n\n= 5 * 4 * factorial(3)\n\n= 5 * 4 * 3 * factorial(2)\n\n= 5 * 4 * 3 * 2 * factorial(1)\n\n= 5 * 4 * 3 * 2 * 1\n\n= 120\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The condition:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if n &lt;= 1\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the <strong>base case<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without a correct base case, recursion continues until the program runs out of resources.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. <code>defer<\/code> and Function Calls<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go&#8217;s <code>defer<\/code> schedules a function call to execute when the surrounding function returns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func example() {\n    defer fmt.Println(\"Second\")\n\n    fmt.Println(\"First\")\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>First\nSecond\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A common real-world pattern is resource cleanup:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>file, err := os.Open(\"data.txt\")\nif err != nil {\n    return err\n}\n\ndefer file.Close()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This keeps acquisition and cleanup close together.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Generic Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Modern Go supports type parameters for generic functions. The current language specification explicitly includes type parameters in function declarations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose we want a function that returns the first element of any slice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without generics, we might need separate functions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With generics:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func first&#91;T any](values &#91;]T) T {\n    return values&#91;0]\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers := &#91;]int{10, 20, 30}\nnames := &#91;]string{\"Alice\", \"Bob\"}\n\nfmt.Println(first(numbers))\nfmt.Println(first(names))\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\nAlice\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\">29. Understanding the Generic Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func first&#91;T any](values &#91;]T) T\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Break it apart.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Declares a function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>first\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Function name.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;T any]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Declares type parameter <code>T<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>any<\/code> means <code>T<\/code> can represent any permitted type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>values &#91;]T\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means the parameter is a slice containing <code>T<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>T\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">after the parentheses means the function returns a value of type <code>T<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Generic Function with a Constraint<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose you want to add values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You cannot necessarily add arbitrary <code>any<\/code> values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Define a constraint:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Number interface {\n    ~int | ~int64 | ~float64\n}\n\nfunc addNumbers&#91;T Number](a, b T) T {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(addNumbers(10, 20))\nfmt.Println(addNumbers(2.5, 3.5))\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">works with the allowed numeric types.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generics are particularly useful for reusable algorithms and containers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART II \u2014 GO METHODS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">31. What Is a Method?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A method is a function associated with a type through a <strong>receiver<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Person struct {\n    Name string\n}\n\nfunc (p Person) Greet() {\n    fmt.Println(\"Hello, my name is\", p.Name)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person := Person{Name: \"Alice\"}\n\nperson.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, my name is Alice\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\">32. Line-by-Line Method Explanation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Start with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Person struct {\n    Name string\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This creates a new type named:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Person\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It contains one field:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) Greet() {\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Break this apart.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">declares a function or method.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(p Person)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the receiver.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>p\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the variable through which the method accesses the receiver value.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Person\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the receiver&#8217;s type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Greet\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the method name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(\"Hello, my name is\", p.Name)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">accesses:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>p.Name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Finally:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person.Greet()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">calls the method using normal selector syntax.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Method Syntax<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">General form:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (receiver ReceiverType) MethodName(parameters) returnType {\n    \/\/ body\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) FullName() string {\n    return p.Name\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver appears:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>between func and method name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Compare:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func FullName(p Person) string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) FullName() string\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\">34. Function and Method Doing the Same Thing<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Rectangle struct {\n    Width  float64\n    Height float64\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Function<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func rectangleArea(r Rectangle) float64 {\n    return r.Width * r.Height\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rectangleArea(rect)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Method<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func (r Rectangle) Area() float64 {\n    return r.Width * r.Height\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rect.Area()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both are valid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rect.Area()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">usually makes more conceptual sense because area is naturally behavior associated with a rectangle.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Methods Can Have Parameters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Receivers do not replace normal parameters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Calculator struct{}\n\nfunc (c Calculator) Add(a, b int) int {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>calculator := Calculator{}\n\nresult := calculator.Add(10, 20)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>c Calculator\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The normal parameters are:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>a, b int\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\">36. Methods Can Return Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Circle struct {\n    Radius float64\n}\n\nfunc (c Circle) Area() float64 {\n    return 3.14159 * c.Radius * c.Radius\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>circle := Circle{Radius: 5}\n\nfmt.Println(circle.Area())\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\">37. Methods Are Not Limited to Structs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This surprises many beginners.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Methods can be associated with appropriate defined types; they are not limited to structs. The receiver base type has to satisfy Go&#8217;s receiver rules and must be defined in the same package as the method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Celsius float64\n\nfunc (c Celsius) Fahrenheit() float64 {\n    return float64(c)*9\/5 + 32\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>temperature := Celsius(25)\n\nfmt.Println(temperature.Fahrenheit())\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>77\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is extremely useful for creating domain-specific types.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. You Cannot Add Methods to Arbitrary External Types<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose another package defines some type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You generally cannot simply write:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (x SomeExternalType) MyMethod() {\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">for that external receiver type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver base type must be defined in the same package as the method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you need custom behavior, commonly you:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>create your own type<\/li>\n\n\n\n<li>wrap the external type<\/li>\n\n\n\n<li>embed it where appropriate<\/li>\n\n\n\n<li>use a standalone function<\/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\">PART III \u2014 VALUE RECEIVERS AND POINTER RECEIVERS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">39. The Most Important Method Topic<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods can use two main receiver styles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Value receiver<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) Greet() {\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Pointer receiver<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p *Person) Rename(name string) {\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>*<\/code> makes a huge difference.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Value Receiver<\/h1>\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 Person struct {\n    Name string\n}\n\nfunc (p Person) Rename(name string) {\n    p.Name = name\n}\n\nfunc main() {\n    person := Person{Name: \"Alice\"}\n\n    person.Rename(\"Bob\")\n\n    fmt.Println(person.Name)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">What will it print?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Alice\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Not:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Bob\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The method receives a copy of the <code>Person<\/code> value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Original:\n\nperson.Name = \"Alice\"\n\n       copy\n        |\n        v\n\nMethod receiver:\n\np.Name = \"Alice\"\n\nthen:\n\np.Name = \"Bob\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The copy changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original does not.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Pointer Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Change the method to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p *Person) Rename(name string) {\n    p.Name = name\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person := Person{Name: \"Alice\"}\n\nperson.Rename(\"Bob\")\n\nfmt.Println(person.Name)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">outputs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Bob\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>p<\/code> is a pointer to the original <code>Person<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Changes affect the original value.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Pointer Receiver Line by Line<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p *Person) Rename(name string) {\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>p<\/code> is the receiver variable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*Person\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means <code>p<\/code> points to a <code>Person<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>p.Name = name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">updates the original <code>Person<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You could think about it conceptually as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(*p).Name = name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go allows the simpler:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>p.Name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">syntax.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. When Should You Use a Pointer Receiver?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use a pointer receiver when the method needs to modify receiver state.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type BankAccount struct {\n    Balance float64\n}\n\nfunc (a *BankAccount) Deposit(amount float64) {\n    a.Balance += amount\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Calling:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(500)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">should change the account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So a pointer receiver is appropriate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Another Reason for Pointer Receivers<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type HugeData struct {\n    \/\/ lots of fields\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A value receiver conceptually works with a value copy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A pointer receiver passes the pointer value rather than requiring the method receiver to represent an independent copy of the entire struct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For larger mutable types, pointer receivers are often appropriate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. When Should You Use a Value Receiver?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Value receivers work well when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the type is small<\/li>\n\n\n\n<li>the method doesn&#8217;t need to modify it<\/li>\n\n\n\n<li>the type naturally behaves like a value<\/li>\n\n\n\n<li>copying is expected<\/li>\n\n\n\n<li>immutable-style semantics make sense<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Point struct {\n    X float64\n    Y float64\n}\n\nfunc (p Point) DistanceFromOrigin() float64 {\n    return math.Sqrt(p.X*p.X + p.Y*p.Y)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The method calculates information.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It doesn&#8217;t need to modify the point.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Go Often Automatically Takes the Address<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p *Person) Rename(name string) {\n    p.Name = name\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person := Person{Name: \"Alice\"}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can normally write:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person.Rename(\"Bob\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(&amp;person).Rename(\"Bob\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For an addressable value, Go can automatically take the address for the pointer-receiver method call. The language specification also distinguishes this call convenience from the actual method-set rules.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This convenience is important because beginners sometimes conclude:<\/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\">&#8220;If <code>person.Rename()<\/code> works, <code>Person<\/code> must contain the pointer method in its method set.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">That conclusion is incorrect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Which leads us to the next advanced concept.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART IV \u2014 METHOD SETS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">47. What Is a Method Set?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>method set<\/strong> is the collection of methods associated with a type for purposes including interface implementation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a defined type <code>T<\/code>, its method set contains methods declared with receiver <code>T<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For <code>*T<\/code>, its method set contains methods declared with receiver <code>T<\/code> <strong>and<\/strong> <code>*T<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Simplified:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Receiver declaration        Method belongs to method set of\n\nfunc (t T) A()              T and *T\nfunc (t *T) B()             *T\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. Method Set Example<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct{}\n\nfunc (u User) Read() {\n}\n\nfunc (u *User) Write() {\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Think of the method sets as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User\n----\nRead\n\n*User\n-----\nRead\nWrite\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This becomes extremely important when interfaces are involved.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART V \u2014 METHODS AND INTERFACES<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">49. Why Methods Become So Powerful<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Interfaces are one of the main reasons methods matter so much in Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Speaker interface {\n    Speak() string\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This interface says:<\/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\">Anything that has a <code>Speak() string<\/code> method can behave as a Speaker.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Person struct {\n    Name string\n}\n\nfunc (p Person) Speak() string {\n    return \"Hello, I am \" + p.Name\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Person<\/code> satisfies <code>Speaker<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t explicitly write:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Person implements Speaker\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The relationship is determined by the methods provided by the type.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">50. Complete Interface Example<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Speaker interface {\n    Speak() string\n}\n\ntype Person struct {\n    Name string\n}\n\nfunc (p Person) Speak() string {\n    return \"Hello, I am \" + p.Name\n}\n\nfunc introduce(s Speaker) {\n    fmt.Println(s.Speak())\n}\n\nfunc main() {\n    person := Person{Name: \"Alice\"}\n\n    introduce(person)\n}\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, I am Alice\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\">51. Line-by-Line Interface Explanation<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>type Speaker interface {\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Declares an interface.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Speak() string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">specifies required behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anything whose method set satisfies that requirement can be used as a <code>Speaker<\/code>. Go interfaces specify behavior through methods.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func introduce(s Speaker)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">doesn&#8217;t care whether <code>s<\/code> is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Person<\/code><\/li>\n\n\n\n<li><code>Robot<\/code><\/li>\n\n\n\n<li><code>Dog<\/code><\/li>\n\n\n\n<li><code>AI<\/code><\/li>\n\n\n\n<li>another future type<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">It only cares that:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s.Speak()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">exists with the required signature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is one of Go&#8217;s most important forms of polymorphism.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">52. Pointer Receivers and Interfaces<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Notifier interface {\n    Notify()\n}\n\ntype User struct {\n    Email string\n}\n\nfunc (u *User) Notify() {\n    fmt.Println(\"Notifying:\", u.Email)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This works:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user := &amp;User{Email: \"alice@example.com\"}\n\nvar notifier Notifier = user\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">because <code>*User<\/code> has the <code>Notify<\/code> method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But a plain <code>User<\/code> value does not have that pointer-receiver method in its method set.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So this conceptually fails:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var notifier Notifier = User{\n    Email: \"alice@example.com\",\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This distinction is one of the most common sources of confusion for new Go programmers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">53. Compile-Time Interface Checks<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A common Go technique is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var _ Notifier = (*User)(nil)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This doesn&#8217;t create a useful runtime value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, it asks the compiler:<\/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\">Does <code>*User<\/code> satisfy <code>Notifier<\/code>?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If not, compilation fails.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful in larger codebases.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART VI \u2014 METHODS AS FUNCTION VALUES<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">54. Method Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods can themselves become function values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct {\n    Name string\n}\n\nfunc (u User) Greet() string {\n    return \"Hello, \" + u.Name\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user := User{Name: \"Alice\"}\n\ngreet := user.Greet\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(greet())\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">works.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>user.Greet<\/code> is called a <strong>method value<\/strong>. The receiver is captured as part of that function value.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">55. Understanding Method Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Normally:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Greet()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">But:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet := user.Greet\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">binds <code>user<\/code> to the method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So <code>greet<\/code> effectively behaves like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func() string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t need to pass <code>user<\/code> again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>callbacks<\/li>\n\n\n\n<li>handlers<\/li>\n\n\n\n<li>dependency injection<\/li>\n\n\n\n<li>event processing<\/li>\n\n\n\n<li>scheduling work<\/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\">56. Method Expressions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A related advanced concept is a <strong>method expression<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Given:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct {\n    Name string\n}\n\nfunc (u User) Greet() string {\n    return \"Hello, \" + u.Name\n}\n<\/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>greet := User.Greet\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now the receiver is not captured.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You provide it explicitly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user := User{Name: \"Alice\"}\n\nfmt.Println(greet(user))\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The specification describes a method expression such as <code>T.M<\/code> as producing a function whose first argument represents the receiver.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">57. Method Value vs Method Expression<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Method value:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet := user.Greet\ngreet()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Receiver already selected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Method expression:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet := User.Greet\ngreet(user)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Receiver supplied later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>METHOD VALUE\n\nuser.Greet\n^^^^\nreceiver already attached\n\n\nMETHOD EXPRESSION\n\nUser.Greet\n     ^\nreceiver becomes function argument\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\">PART VII \u2014 METHODS AND GENERICS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">58. Methods on Generic Types<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods can be defined on generic receiver types.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Pair&#91;A, B any] struct {\n    First  A\n    Second B\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Pair&#91;A, B]) Swap() Pair&#91;B, A] {\n    return Pair&#91;B, A]{\n        First:  p.Second,\n        Second: p.First,\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pair := Pair&#91;string, int]{\n    First:  \"Age\",\n    Second: 30,\n}\n\nswapped := pair.Swap()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The current Go specification explicitly allows the receiver specification of a generic receiver base type to declare the corresponding receiver type parameters for the method to use.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">59. Important Generic Method Rule<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Box&#91;T any] struct {\n    Value T\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A method can use the receiver&#8217;s <code>T<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (b Box&#91;T]) Get() T {\n    return b.Value\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">But Go method declaration syntax does not provide a separate independent type-parameter list after the method name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In practical terms, prefer generic functions when you need an operation with its own independent type parameters.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART VIII \u2014 EMBEDDING AND PROMOTED METHODS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">60. Struct Embedding<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go uses composition rather than traditional class inheritance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Logger struct{}\n\nfunc (Logger) Log(message string) {\n    fmt.Println(\"LOG:\", message)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Embed it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Service struct {\n    Logger\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>service := Service{}\n\nservice.Log(\"Server started\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">works through method promotion.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Service\n  |\n  +-- Logger\n        |\n        +-- Log()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is composition.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">61. Why Embedding Matters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Embedding allows larger types to compose behavior from smaller types.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Database struct{}\n\nfunc (Database) Save() {\n    fmt.Println(\"saving\")\n}\n\ntype UserService struct {\n    Database\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>service.Save()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">can use the promoted method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Embedding should express a meaningful composition relationship\u2014not merely be used to imitate inheritance from another language.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART IX \u2014 FUNCTION VS METHOD COMPARISON<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">62. Side-by-Side Comparison<\/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>Declared with <code>func<\/code><\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Has parameters<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Returns values<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Can return errors<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Belongs to receiver 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 <code>name()<\/code><\/td><td>Yes<\/td><td>Usually<\/td><\/tr><tr><td>Called as <code>value.Name()<\/code><\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Can naturally modify state through pointer<\/td><td>Yes, with pointer parameter<\/td><td>Yes, with pointer receiver<\/td><\/tr><tr><td>Participates in type method set<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Can satisfy interface methods<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Can be stored in variable<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><tr><td>Can be callback<\/td><td>Yes<\/td><td>Yes, via method value\/expression<\/td><\/tr><tr><td>Can be generic<\/td><td>Yes<\/td><td>Receiver type can be generic<\/td><\/tr><tr><td>Good for package-level operations<\/td><td>Excellent<\/td><td>Sometimes<\/td><\/tr><tr><td>Good for type-specific behavior<\/td><td>Sometimes<\/td><td>Excellent<\/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\">63. Same Problem as Function and Method<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Account struct {\n    Balance float64\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Function version<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func deposit(account *Account, amount float64) {\n    account.Balance += amount\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>deposit(&amp;account, 500)\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Method version<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func (account *Account) Deposit(amount float64) {\n    account.Balance += amount\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(500)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Neither approach is automatically &#8220;better.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The question is:<\/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\">Does this operation conceptually belong to <code>Account<\/code>?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">For depositing money into an account, the answer is probably yes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(500)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">expresses the domain nicely.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART X \u2014 WHEN TO USE FUNCTIONS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">64. Use Function: Pure Calculation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculateTax(price, taxRate float64) float64 {\n    return price * taxRate\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This doesn&#8217;t necessarily belong to one particular object.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A function is natural.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">65. Use Function: Conversion<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func CelsiusToFahrenheit(c float64) float64 {\n    return c*9\/5 + 32\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Excellent function use case.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;ve created a domain-specific <code>Celsius<\/code> type, a method could also make sense:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (c Celsius) Fahrenheit() float64\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Design depends on the abstraction you want.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">66. Use Function: Constructor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go frequently uses functions to construct values.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Server struct {\n    Host string\n    Port int\n}\n\nfunc NewServer(host string, port int) *Server {\n    return &amp;Server{\n        Host: host,\n        Port: port,\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server := NewServer(\"localhost\", 8080)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The convention:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>NewType(...)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is common when initialization logic is needed.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">67. Use Function: Operation Involving Multiple Types<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func Transfer(\n    source *Account,\n    destination *Account,\n    amount float64,\n) error\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Transfer involves two accounts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on your domain, a standalone function may express that relationship better than arbitrarily attaching the operation to one account.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">68. Use Function: Utility<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func IsValidEmail(email string) bool\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>func ParseConfig(data &#91;]byte) (*Config, error)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>func GenerateID() string\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>func HashPassword(password string) (&#91;]byte, error)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These frequently make sense as package-level functions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">69. Use Function: Generic Algorithms<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Generic reusable algorithms are particularly natural as functions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func Map&#91;T, R any](items &#91;]T, transform func(T) R) &#91;]R {\n    result := make(&#91;]R, len(items))\n\n    for i, item := range items {\n        result&#91;i] = transform(item)\n    }\n\n    return result\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers := &#91;]int{1, 2, 3}\n\nstrings := Map(numbers, func(n int) string {\n    return strconv.Itoa(n)\n})\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\">PART XI \u2014 WHEN TO USE METHODS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">70. Use Method: Behavior Belongs to a Type<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>user.FullName()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is more expressive than:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>calculateUserFullName(user)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">when full-name behavior naturally belongs to <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\">71. Use Method: Modify Object State<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(100)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>cart.AddItem(item)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>player.Move(10, 5)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>server.Start()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These operations naturally affect receiver state.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">72. Use Method: Implement an Interface<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Stringer interface {\n    String() string\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your type can provide the required behavior through a method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Interfaces are fundamentally method-oriented in Go.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">73. Use Method: Domain Modeling<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods can create very readable domain code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>withdrawFromBankAccount(account, 100)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you can use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Withdraw(100)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>calculateInvoiceTotal(invoice)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you might use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>invoice.Total()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>activateUser(user)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you might use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Activate()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Good APIs often read naturally.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XII \u2014 COMPLETE REAL-WORLD EXAMPLE<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">74. Building a Bank Account API<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s combine functions and methods.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n    \"errors\"\n    \"fmt\"\n)\n\ntype BankAccount struct {\n    owner   string\n    balance float64\n}\n\nfunc NewBankAccount(owner string) *BankAccount {\n    return &amp;BankAccount{\n        owner:   owner,\n        balance: 0,\n    }\n}\n\nfunc (a *BankAccount) Deposit(amount float64) error {\n    if amount &lt;= 0 {\n        return errors.New(\"deposit must be greater than zero\")\n    }\n\n    a.balance += amount\n\n    return nil\n}\n\nfunc (a *BankAccount) Withdraw(amount float64) error {\n    if amount &lt;= 0 {\n        return errors.New(\"withdrawal must be greater than zero\")\n    }\n\n    if amount &gt; a.balance {\n        return errors.New(\"insufficient balance\")\n    }\n\n    a.balance -= amount\n\n    return nil\n}\n\nfunc (a BankAccount) Balance() float64 {\n    return a.balance\n}\n\nfunc (a BankAccount) Owner() string {\n    return a.owner\n}\n\nfunc formatMoney(amount float64) string {\n    return fmt.Sprintf(\"$%.2f\", amount)\n}\n\nfunc main() {\n    account := NewBankAccount(\"Alice\")\n\n    if err := account.Deposit(1000); err != nil {\n        fmt.Println(\"Deposit error:\", err)\n        return\n    }\n\n    if err := account.Withdraw(250); err != nil {\n        fmt.Println(\"Withdrawal error:\", err)\n        return\n    }\n\n    fmt.Println(\"Owner:\", account.Owner())\n    fmt.Println(\"Balance:\", formatMoney(account.Balance()))\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Owner: Alice\nBalance: $750.00\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\">75. Why <code>NewBankAccount<\/code> Is a Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func NewBankAccount(owner string) *BankAccount\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">At creation time we don&#8217;t have an account receiver yet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The purpose of the function is to create one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore a constructor-style function is natural:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account := NewBankAccount(\"Alice\")\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\">76. Why <code>Deposit<\/code> Is a Method<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a *BankAccount) Deposit(amount float64) error\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A deposit affects a specific account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(1000)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is natural.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It uses a pointer receiver because the account&#8217;s balance must change.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">77. Why <code>Withdraw<\/code> Is a Method<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Same reasoning:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Withdraw(250)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The operation acts on one particular account and modifies it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore a pointer receiver is appropriate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">78. Why <code>Balance<\/code> Uses a Value Receiver<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a BankAccount) Balance() float64 {\n    return a.balance\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Balance()<\/code> only reads information.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It doesn&#8217;t mutate the account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a small value, a value receiver can be reasonable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In real APIs, however, receiver consistency is also worth considering. Go&#8217;s official guidance recommends carefully considering pointer-versus-value receiver consistency when methods of a type need pointer receivers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, a real production <code>BankAccount<\/code> might simply use pointer receivers consistently across its methods:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a *BankAccount) Balance() float64\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\">79. Why <code>formatMoney<\/code> Is a Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func formatMoney(amount float64) string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Formatting money isn&#8217;t necessarily intrinsic behavior of <code>BankAccount<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It could be used for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>account balances<\/li>\n\n\n\n<li>invoices<\/li>\n\n\n\n<li>product prices<\/li>\n\n\n\n<li>salaries<\/li>\n\n\n\n<li>payments<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">So a standalone function can make more sense.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This illustrates an important principle:<\/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\">Don&#8217;t make everything a method.<\/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\">PART XIII \u2014 ADVANCED API DESIGN<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">80. Don&#8217;t Turn Structs into &#8220;Classes&#8221;<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Developers coming from Java, C++, C#, or similar languages sometimes try to turn every Go struct into a class with dozens of methods.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That isn&#8217;t necessary.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go encourages simple composition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct {\n    Name string\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Methods should exist when they add meaningful behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You don&#8217;t need a method merely because a function happens to accept that type.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">81. Functions Can Be More Flexible<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func Distance(a, b Point) float64\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is symmetric.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neither point is obviously more important.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A function communicates that nicely:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Distance(pointA, pointB)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You could technically design:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pointA.DistanceTo(pointB)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That can also be good.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The right choice depends on the domain and intended API.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">82. Ask &#8220;Who Owns This Behavior?&#8221;<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A useful design question is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Does this behavior naturally belong to one specific type?\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If yes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Consider a method.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If no:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Consider a function.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Activate()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>file.Close()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ParseDate()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GenerateUUID()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SortUsers()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Potentially function.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>invoice.Total()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XIV \u2014 COMMON BEGINNER MISTAKES<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">83. Mistake: Forgetting the Return Type<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Wrong:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The function claims to return nothing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return a + b\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">returns a value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Correct:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    return a + b\n}\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\">84. Mistake: Forgetting to Return<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Wrong:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    result := a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The function promises:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">but doesn&#8217;t return one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Correct:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    result := a + b\n\n    return result\n}\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\">85. Mistake: Expecting a Value Parameter to Change<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func change(n int) {\n    n = 100\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Calling:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>x := 10\nchange(x)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">does not change <code>x<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use a pointer if mutation is intended:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func change(n *int) {\n    *n = 100\n}\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\">86. Mistake: Using Value Receiver for Intended Mutation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Wrong:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a Account) Deposit(amount float64) {\n    a.Balance += amount\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you expect the original account to change, use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a *Account) Deposit(amount float64) {\n    a.Balance += amount\n}\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\">87. Mistake: Confusing Call Convenience with Interface Method Sets<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This may work:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Notify()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">even when <code>Notify<\/code> has a pointer receiver and <code>user<\/code> is an addressable value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But that does <strong>not<\/strong> mean the value type necessarily satisfies an interface requiring <code>Notify<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Method-call shorthand and method sets are related but distinct rules.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">88. Mistake: Making Everything a Pointer Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pointer receivers are useful, but not automatically correct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a small immutable-style type:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Coordinate struct {\n    X int\n    Y int\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">something like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (c Coordinate) IsOrigin() bool {\n    return c.X == 0 &amp;&amp; c.Y == 0\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">can reasonably use a value receiver.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">89. Mistake: Mixing Receivers Without Thinking<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid randomly creating:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Name()\nfunc (u *User) Save()\nfunc (u User) Email()\nfunc (u *User) Validate()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There may be valid reasons, but receiver choice affects method sets and interface implementation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choose receivers deliberately.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">90. Mistake: Creating Huge Functions<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func ProcessEverything() {\n    \/\/ 500 lines\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Functions should usually have a focused responsibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func validateOrder(...)\nfunc calculateTotal(...)\nfunc saveOrder(...)\nfunc sendConfirmation(...)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then combine them in higher-level logic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Small functions are easier to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>read<\/li>\n\n\n\n<li>test<\/li>\n\n\n\n<li>reuse<\/li>\n\n\n\n<li>debug<\/li>\n\n\n\n<li>maintain<\/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\">91. Mistake: Ignoring Errors<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result, _ := doSomething()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">unless ignoring the error is genuinely intentional and safe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result, err := doSomething()\n\nif err != nil {\n    return err\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Error returns are a central part of Go function and method design.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XV \u2014 FUNCTION AND METHOD NAMING<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">92. Function Names<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use names that describe behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ParseConfig\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>LoadUser\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>CalculateTax\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ValidateEmail\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Poor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DoThing\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>ProcessStuff\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>HandleData\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">unless the surrounding context genuinely makes them precise.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">93. Method Names<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods already have receiver context.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.GetUserName()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you can often use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Name()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.GetAccountBalance()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">prefer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Balance()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Official Go guidance specifically recommends concise getter names such as <code>Owner()<\/code> rather than <code>GetOwner()<\/code>, with setters such as <code>SetOwner()<\/code> where appropriate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">94. Exported Functions and Methods<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go uses capitalization for visibility outside a package.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lowercase:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculateTax() {\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is unexported.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uppercase:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func CalculateTax() {\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is exported.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Same with methods:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) name()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">unexported.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Name()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">exported.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XVI \u2014 FUNCTIONS, METHODS, AND CONCURRENCY<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">95. Calling Functions in Goroutines<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Any appropriate function call can be launched with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func sendEmail() {\n    fmt.Println(\"Sending email\")\n}\n\nfunc main() {\n    go sendEmail()\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can similarly launch a method call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go worker.Process()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The Go documentation notes that prefixing a function or method call with <code>go<\/code> runs that call in a new goroutine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Concurrency introduces synchronization and lifetime concerns beyond the scope of basic functions and methods, but syntactically both participate naturally.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XVII \u2014 TESTABILITY<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">96. Functions Are Easy to Unit Test<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    return a + b\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Test:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func TestAdd(t *testing.T) {\n    result := add(2, 3)\n\n    if result != 5 {\n        t.Fatalf(\"expected 5, got %d\", result)\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pure functions are particularly easy to test because output depends only on input.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">97. Methods Are Also Easy to Test<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Counter struct {\n    Value int\n}\n\nfunc (c *Counter) Increment() {\n    c.Value++\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Test:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func TestIncrement(t *testing.T) {\n    counter := Counter{}\n\n    counter.Increment()\n\n    if counter.Value != 1 {\n        t.Fatalf(\"expected 1, got %d\", counter.Value)\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Methods often require creating receiver state before testing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XVIII \u2014 DESIGN PATTERNS USING FUNCTIONS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">98. Functional Options<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">An advanced Go API pattern uses functions for configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Server struct {\n    Host string\n    Port int\n}\n\ntype Option func(*Server)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create an option:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func WithPort(port int) Option {\n    return func(s *Server) {\n        s.Port = port\n    }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Constructor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func NewServer(options ...Option) *Server {\n    server := &amp;Server{\n        Host: \"localhost\",\n        Port: 8080,\n    }\n\n    for _, option := range options {\n        option(server)\n    }\n\n    return server\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server := NewServer(\n    WithPort(9000),\n)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This combines:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>function types<\/li>\n\n\n\n<li>higher-order functions<\/li>\n\n\n\n<li>closures<\/li>\n\n\n\n<li>variadic functions<\/li>\n\n\n\n<li>pointer mutation<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">It is a good example of how powerful functions become in real Go APIs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XIX \u2014 A CLEANER REAL-WORLD SERVICE EXAMPLE<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">99. User Service<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct {\n    ID     int\n    Name   string\n    Active bool\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Behavior naturally belonging to a user:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) Activate() {\n    u.Active = true\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Behavior belonging to formatting:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func FormatUser(u User) string {\n    return fmt.Sprintf(\"%d: %s\", u.ID, u.Name)\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Behavior belonging to data storage might instead live behind an abstraction:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type UserRepository interface {\n    Save(user *User) error\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This produces cleaner separation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User\n |\n +-- domain behavior\n\nFormatting functions\n |\n +-- representation\n\nRepository\n |\n +-- persistence behavior\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do not simply attach every possible operation to <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\">PART XX \u2014 QUICK DECISION TREE<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">100. Should I Create a Function or Method?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Start here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Does the behavior naturally belong to one type?\n                |\n        +-------+-------+\n        |               |\n       YES              NO\n        |               |\n        v               v\n    METHOD          FUNCTION\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then ask:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Does it need to modify the receiver?\n                |\n        +-------+-------+\n        |               |\n       YES              NO\n        |               |\n        v               v\nPointer receiver    Consider value\n                    or pointer receiver\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then ask:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Must the type satisfy an interface?\n                |\n                v\nCheck the exact method set.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Is it a generic reusable algorithm involving\nmultiple independent types?\n                |\n                v\nA generic function is often a strong choice.\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\">PART XXI \u2014 PRACTICAL COMPARISON<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">101. Example: User Validation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Possible function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func ValidateUser(user User) error\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Possible method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Validate() error\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Which is better?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If validation rules fundamentally belong to <code>User<\/code>, this reads beautifully:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Validate()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If validation depends heavily on external policy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>validator.Validate(user)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ValidateUser(user, policy)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">may provide better separation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The decision is architectural\u2014not simply syntactic.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">102. Example: Password Hashing<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer something like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func HashPassword(password string) (&#91;]byte, error)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">rather than forcing the operation onto an unrelated object merely to make it a method.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">103. Example: Shopping Cart<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods are natural:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cart.Add(item)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>cart.Remove(productID)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>cart.Total()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">because those behaviors naturally belong to the cart.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">104. Example: Parsing JSON<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A package function may make sense:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ParseUser(data)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">because the operation converts external data into a user.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively, standard interfaces or package conventions may lead to methods depending on the API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The important point is to choose based on the abstraction rather than blindly preferring one syntax.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XXII \u2014 BEST PRACTICES<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">105. Function Best Practices<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">1. Give functions one clear job<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ValidateOrder()\nCalculateTotal()\nSaveOrder()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">over:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DoEverythingWithOrder()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Keep inputs clear<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid unnecessary global state.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Return useful values<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Prefer reusable functions over functions that always print results.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Return errors where callers can recover<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid using panic for normal application errors.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Use descriptive names<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The caller should understand:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ParseConfig()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">without reading its entire implementation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Use higher-order functions when behavior genuinely needs to be configurable<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t introduce callbacks just to make simple code look sophisticated.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. Use generics when they eliminate meaningful duplication<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t use generics when a concrete function would be clearer.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">106. Method Best Practices<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">1. Associate methods with meaningful receiver behavior<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Withdraw()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Use pointer receivers when mutation is required<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a *Account) Deposit(...)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Understand interface method sets<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Especially when pointer receivers are involved.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Keep receiver names short and consistent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Common:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Name()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (theCurrentUser User) Name()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. Don&#8217;t treat Go types like traditional classes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use composition.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Don&#8217;t create methods simply to reduce function count<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Architecture matters more than syntax.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. Consider receiver consistency<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Especially when the type contains mutating methods or implements interfaces.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XXIII \u2014 INTERVIEW-STYLE QUESTIONS<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">107. What Is a Function in Go?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A function is a reusable block of code declared using <code>func<\/code> that may accept parameters and return zero or more results.<\/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, b int) int {\n    return a + b\n}\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\">108. What Is a Method in Go?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A method is a function with a receiver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Name() string {\n    return u.name\n}\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\">109. What Is the Main Difference?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Calculate(user)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Calculate()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A method is associated with a receiver type and participates in that type&#8217;s method-set\/interface behavior.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">110. What Is a Receiver?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver is the parameter appearing between <code>func<\/code> and the method name.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet()\n     ^^^^^^^^\n     receiver\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\">111. Value Receiver vs Pointer Receiver?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Value:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Method()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">works with a receiver value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pointer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) Method()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">works through a pointer and can directly modify the receiver&#8217;s original state.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">112. Can Functions Return Multiple Values?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Yes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func divide(a, b int) (int, error)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is commonly used for error handling.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">113. Can Functions Be Passed Around?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Yes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func execute(operation func()) {\n    operation()\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Functions are first-class values in Go.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">114. Can Methods Be Passed Around?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Yes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using a method value:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>f := user.Save\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or a method expression:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>f := User.Name\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method values and expressions are formally part of Go&#8217;s language semantics.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">115. Can Methods Exist on Non-Struct Types?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, methods are not limited to structs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Celsius float64\n\nfunc (c Celsius) Fahrenheit() float64 {\n    return float64(c)*9\/5 + 32\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver still has to satisfy Go&#8217;s receiver declaration rules.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">116. Does Go Support Function Overloading?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go doesn&#8217;t use traditional function overloading where several package functions share the same name but differ only by parameter types.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, Go favors:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>distinct names<\/li>\n\n\n\n<li>interfaces<\/li>\n\n\n\n<li>variadic functions where appropriate<\/li>\n\n\n\n<li>generic functions<\/li>\n\n\n\n<li>methods on different receiver types<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Different receiver types can, of course, have methods with the same method name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dog.Speak()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person.Speak()\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\">PART XXIV \u2014 PRACTICE EXERCISES<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">117. Beginner Exercise 1<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func subtract(a, b int) int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>subtract(10, 3)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">returns:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>7\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\">118. Beginner Exercise 2<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func fullName(firstName, lastName string) string\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Calling:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fullName(\"Alice\", \"Smith\")\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">should return:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Alice Smith\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\">119. Beginner Exercise 3<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>divide(a, b float64)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">that returns:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(float64, error)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Return an error when <code>b == 0<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">120. Method Exercise 1<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Rectangle struct {\n    Width  float64\n    Height float64\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Area()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Perimeter()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">methods.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rectangle.Area()\nrectangle.Perimeter()\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\">121. Method Exercise 2<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Counter struct {\n    Value int\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Increment()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">using a pointer receiver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>counter.Increment()\ncounter.Increment()\ncounter.Increment()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">should result in:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>3\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\">122. Intermediate Exercise<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type BankAccount struct {\n    balance float64\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Methods:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Deposit(amount float64) error\nWithdraw(amount float64) error\nBalance() float64\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Rules:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Deposit must be positive.\nWithdrawal must be positive.\nWithdrawal cannot exceed balance.\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\">123. Interface Exercise<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Shape interface {\n    Area() float64\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then implement <code>Area()<\/code> for:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Rectangle\nCircle\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Finally:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func printArea(shape Shape)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">should work with either type.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">124. Higher-Order Function Exercise<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculate(a, b int, operation func(int, int) int) int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then pass:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add\nsubtract\nmultiply\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">into it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">125. Closure Exercise<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func makeCounter() func() int\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">so:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>counter := makeCounter()\n\ncounter() \/\/ 1\ncounter() \/\/ 2\ncounter() \/\/ 3\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\">126. Advanced Generic Exercise<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func First&#91;T any](values &#91;]T) (T, bool)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Requirements:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>return the first element when the slice has data<\/li>\n\n\n\n<li>return <code>false<\/code> when it is empty<\/li>\n\n\n\n<li>avoid panicking on an empty slice<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Hint:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var zero T\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">can produce the zero value of generic type <code>T<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">PART XXV \u2014 FINAL CHEAT SHEET<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">127. Basic Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet() {\n    fmt.Println(\"Hello\")\n}\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\">128. Function with Parameter<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(name string) {\n    fmt.Println(\"Hello\", name)\n}\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\">129. Function Returning Value<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a, b int) int {\n    return a + b\n}\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\">130. Multiple Returns<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func operation() (int, error) {\n    return 10, nil\n}\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\">131. Variadic Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func sum(values ...int) int {\n    total := 0\n\n    for _, value := range values {\n        total += value\n    }\n\n    return total\n}\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\">132. Function Variable<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>operation := add\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\">133. Anonymous Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>operation := func(a, b int) int {\n    return a + b\n}\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\">134. Higher-Order Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func execute(operation func()) {\n    operation()\n}\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\">135. Generic Function<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func First&#91;T any](values &#91;]T) T {\n    return values&#91;0]\n}\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\">136. Basic Method<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Name() string {\n    return u.name\n}\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\">137. Pointer Receiver<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) Rename(name string) {\n    u.name = name\n}\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\">138. Method Value<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>f := user.Greet\n\nf()\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\">139. Method Expression<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>f := User.Greet\n\nf(user)\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\">140. Interface<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>type Speaker interface {\n    Speak() string\n}\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\">141. Compile-Time Interface Check<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>var _ Speaker = (*Person)(nil)\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\">142. Final Function vs Method Rule<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">When unsure, start with this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FUNCTION\n========\n\nfunc CalculateTax(price float64) float64\n\nUse when:\n- behavior is standalone\n- transforming\/calculating data\n- creating values\n- parsing\n- validating independent inputs\n- working across multiple unrelated types\n- writing generic algorithms\n- creating callbacks or higher-order functions\n\n\nMETHOD\n======\n\nfunc (a *Account) Deposit(amount float64)\n\nUse when:\n- behavior naturally belongs to a type\n- working with receiver state\n- modifying receiver state\n- implementing an interface\n- building a domain-oriented API\n- you want calls such as account.Deposit()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And for receiver selection:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>VALUE RECEIVER\n\nfunc (p Point) X()\n\nBest starting point when:\n- no mutation required\n- value is small\n- value semantics make sense\n\n\nPOINTER RECEIVER\n\nfunc (u *User) Rename()\n\nBest starting point when:\n- receiver must be modified\n- avoiding receiver copies matters\n- identity\/state matters\n- interface\/method-set design requires it\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\">143. The Five Rules Worth Memorizing<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you remember only five things from this entire tutorial, remember these:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A function is standalone:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result := Add(10, 20)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 2<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A method has a receiver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(100)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use a pointer receiver when the method must modify receiver state:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a *Account) Deposit(amount float64)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Methods are the foundation of interface satisfaction:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Writer interface {\n    Write(&#91;]byte) (int, error)\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Rule 5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t ask:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Can this be a method?\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ask:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Does this behavior naturally belong to this type?\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That question leads to much cleaner Go programs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">144. Final Mental Model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Think of your Go program as three layers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>                 GO PROGRAM\n                     |\n          +----------+----------+\n          |                     |\n      FUNCTIONS              TYPES\n          |                     |\n          |                 +---+---+\n          |                 |       |\n          |              Fields   Methods\n          |                         |\n          +------------+------------+\n                       |\n                   Interfaces\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Functions give you:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Reusable operations\nTransformations\nAlgorithms\nFactories\nCallbacks\nClosures\nGeneric behavior\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Methods give your types:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Behavior\nState operations\nDomain meaning\nInterface implementation\nReadable APIs\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Used together:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user := NewUser(\"Alice\")   \/\/ function\n\nuser.Activate()            \/\/ method\n\nif err := Save(user); err != nil { \/\/ function\n    return err\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That combination\u2014<strong>simple types, focused functions, meaningful methods, and small interfaces<\/strong>\u2014is one of the foundations of clean, idiomatic Go design.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Go programs are built from small pieces of reusable behavior. Two of the most important pieces are: At first they look almost identical. A function: A method:&#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-1049","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1049","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=1049"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1049\/revisions"}],"predecessor-version":[{"id":1098,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1049\/revisions\/1098"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}