{"id":1101,"date":"2026-08-17T07:35:34","date_gmt":"2026-08-17T07:35:34","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1101"},"modified":"2026-08-17T07:35:35","modified_gmt":"2026-08-17T07:35:35","slug":"go-tutorials-go-methods","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/go-tutorials-go-methods\/","title":{"rendered":"Go Tutorials: Go Methods"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Go methods become much easier once you understand one idea:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>A method is simply a function attached to a type.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">And the important rule 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\"><strong>A receiver can be based on almost any type you define in the same package \u2014 not only a <code>struct<\/code>.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">You can create methods on your own defined types based on:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>struct\nint\nstring\nfloat\nslice\nmap\narray\nfunction\nchannel<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>struct<\/code> case is simply the most common one.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What is a Method in Go?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A normal function looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(name string) {\n\tfmt.Println(\"Hello\", name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You call it like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(\"Rajesh\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>method<\/strong> has one extra part called the <strong>receiver<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet() {\n\tfmt.Println(\"Hello\", u.Name)\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>(u User)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (receiver) MethodName(parameters) return-types<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet() {\n\tfmt.Println(\"Hello\", u.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You call the method through the value:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>u.Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Greet(u)<\/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. Why Do We Need Methods?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose we have:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct {\n\tName string\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Without a method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet(u User) {\n\tfmt.Println(\"Hello\", u.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(user)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With a method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet() {\n\tfmt.Println(\"Hello\", u.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The method version is usually easier to understand because the behavior belongs naturally to <code>User<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User\n \u251c\u2500\u2500 Name\n \u251c\u2500\u2500 Greet()\n \u251c\u2500\u2500 Login()\n \u251c\u2500\u2500 Logout()\n \u2514\u2500\u2500 ChangePassword()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of having unrelated-looking functions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>greet(user)\nlogin(user)\nlogout(user)\nchangePassword(user)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Function vs Method<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Function<\/th><th>Method<\/th><\/tr><\/thead><tbody><tr><td>Attached to type<\/td><td>\u274c<\/td><td>\u2705<\/td><\/tr><tr><td>Has receiver<\/td><td>\u274c<\/td><td>\u2705<\/td><\/tr><tr><td>Called using <code>.<\/code><\/td><td>Usually no<\/td><td>\u2705<\/td><\/tr><tr><td>Example<\/td><td><code>add(10,20)<\/code><\/td><td><code>user.Greet()<\/code><\/td><\/tr><tr><td>Best for<\/td><td>General operations<\/td><td>Behavior belonging to a type<\/td><\/tr><\/tbody><\/table><\/figure>\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\treturn a + b\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)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (c Calculator) Add(a, b int) int {\n\treturn a + b\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.Add(10, 20)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Basic Method Example<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\n\/\/ User is our own defined type.\ntype User struct {\n\tName string\n}\n\n\/\/ Greet is a method attached to User.\n\/\/\n\/\/ u     = receiver variable\n\/\/ User  = receiver type\nfunc (u User) Greet() {\n\tfmt.Println(\"Hello\", u.Name)\n}\n\nfunc main() {\n\n\t\/\/ Create a User value.\n\tuser := User{\n\t\tName: \"Rajesh\",\n\t}\n\n\t\/\/ Call the method.\n\tuser.Greet()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello Rajesh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The important line is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Break it down:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func\n \u2502\n \u2502    receiver\n \u2502    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2510\nfunc (u User) Greet()\n      \u2502 \u2502     \u2502\n      \u2502 \u2502     \u2514\u2500\u2500 method name\n      \u2502\n      \u2514\u2500\u2500 receiver variable<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. What Is a Receiver?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver tells Go:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">&#8220;This function belongs to this type.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>u<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the receiver variable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the receiver type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the method, <code>u<\/code> gives you access to that particular <code>User<\/code>.<\/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) Greet() {\n\tfmt.Println(u.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user := User{Name: \"Rajesh\"}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and you call:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">then inside the method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>u.Name<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Rajesh<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. The Most Important Receiver Rule<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A simplified rule that is excellent for learning 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\"><strong>You can define methods on your own defined types in the same package.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The underlying type does <strong>not<\/strong> have to be a struct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age int\ntype Name string\ntype Numbers &#91;]int\ntype Scores map&#91;string]int\ntype Coordinates &#91;2]int\ntype Task func()\ntype MessageChannel chan string<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">All of these are types you defined.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore, methods can be attached to them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Struct Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is by far the most common case.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype User struct {\n\tName string\n}\n\nfunc (u User) Greet() {\n\tfmt.Println(\"Hello\", u.Name)\n}\n\nfunc main() {\n\n\tu := User{\n\t\tName: \"Rajesh\",\n\t}\n\n\tu.Greet()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello Rajesh<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">When should you use it?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Struct methods are excellent when modeling things such as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User\nEmployee\nCustomer\nOrder\nProduct\nServer\nDatabase\nCar\nBankAccount<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type BankAccount struct {\n\tBalance float64\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Possible methods:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Deposit()\nWithdraw()\nBalance()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Custom <code>int<\/code> Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods can also belong to your own integer type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\n\/\/ Age is a new defined type\n\/\/ whose underlying type is int.\ntype Age int\n\n\/\/ IsAdult is a method on Age.\nfunc (a Age) IsAdult() bool {\n\treturn a &gt;= 18\n}\n\nfunc main() {\n\n\tvar age Age = 25\n\n\tfmt.Println(age.IsAdult())\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>true<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This does <strong>not<\/strong> mean <code>Age<\/code> is merely a variable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It creates a new defined type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a Age) IsAdult() bool<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">attaches behavior to it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This can make code very readable:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>age.IsAdult()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Custom <code>string<\/code> Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can create methods on your own string type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Name string\n\nfunc (n Name) Upper() string {\n\treturn strings.ToUpper(string(n))\n}\n\nfunc main() {\n\n\tname := Name(\"rajesh\")\n\n\tfmt.Println(name.Upper())\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RAJESH<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>string(n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because <code>Name<\/code> is our own type:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Name string<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">we convert it back to <code>string<\/code> when calling a standard library function expecting a string.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Slice Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A slice can also be the underlying type of your own defined type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Numbers &#91;]int\n\nfunc (n Numbers) Sum() int {\n\n\ttotal := 0\n\n\tfor _, value := range n {\n\t\ttotal += value\n\t}\n\n\treturn total\n}\n\nfunc main() {\n\n\tnums := Numbers{10, 20, 30}\n\n\tfmt.Println(nums.Sum())\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>60<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is quite useful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of writing:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Sum(nums)<\/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>nums.Sum()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It reads naturally:<\/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\">Numbers, calculate your sum.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Map Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Maps can also have methods when you create your own defined map type.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Scores map&#91;string]int\n\nfunc (s Scores) Get(name string) int {\n\treturn s&#91;name]\n}\n\nfunc main() {\n\n\tscores := Scores{\n\t\t\"Rajesh\": 90,\n\t\t\"Amit\":   80,\n\t}\n\n\tfmt.Println(scores.Get(\"Rajesh\"))\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>90<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You could also create methods such as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add()\nRemove()\nExists()\nAverage()\nHighest()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scores.Get(\"Rajesh\")\nscores.Add(\"John\", 95)\nscores.Remove(\"Amit\")<\/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. Array Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Arrays can also be used.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Coordinates &#91;2]int\n\nfunc (c Coordinates) Print() {\n\tfmt.Println(c&#91;0], c&#91;1])\n}\n\nfunc main() {\n\n\tc := Coordinates{10, 20}\n\n\tc.Print()\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 20<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Coordinates &#91;2]int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">creates a new defined type based on an array.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (c Coordinates) Print()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">adds behavior to it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Function Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is surprising when first learning Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even a function can be the underlying type of a type with methods.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Task func()\n\nfunc (t Task) Run() {\n\n\tfmt.Println(\"Starting task...\")\n\n\tt()\n}\n\nfunc main() {\n\n\ttask := Task(func() {\n\t\tfmt.Println(\"Task running\")\n\t})\n\n\ttask.Run()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Starting task...\nTask running<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Task func()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">defines a function type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (t Task) Run()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">adds a method to it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And because <code>t<\/code> itself is a function, this runs it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>t()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Channel Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Channels can also be used.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype MessageChannel chan string\n\nfunc (m MessageChannel) Send(message string) {\n\tm &lt;- message\n}\n\nfunc main() {\n\n\tch := make(MessageChannel, 1)\n\n\tch.Send(\"Hello\")\n\n\tfmt.Println(&lt;-ch)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of writing:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ch &lt;- \"Hello\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">you created behavior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ch.Send(\"Hello\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This can sometimes make APIs easier 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\">15. Float Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The same idea applies to floating-point types.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Price float64\n\nfunc (p Price) WithTax() Price {\n\treturn p * 1.18\n}\n\nfunc main() {\n\n\tprice := Price(100)\n\n\tfmt.Println(price.WithTax())\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>118<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or approximately that value depending on formatting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This gives you expressive code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>price.WithTax()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. You Cannot Attach a Method Directly to <code>int<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is invalid:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (x int) Double() int {\n\treturn x * 2\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go will reject it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is a built-in type defined by Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You did not define it in your package.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, define your own type:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type MyInt int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (x MyInt) Double() MyInt {\n\treturn x * 2\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Complete example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype MyInt int\n\nfunc (x MyInt) Double() MyInt {\n\treturn x * 2\n}\n\nfunc main() {\n\n\tnumber := MyInt(10)\n\n\tfmt.Println(number.Double())\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<\/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. Same Package Rule<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose package <code>people<\/code> defines:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package people\n\ntype User struct {\n\tName string\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">From another package you cannot do this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"example.com\/people\"\n\nfunc (u people.User) Greet() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u274c Not allowed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because <code>User<\/code> belongs to package <code>people<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Methods for <code>User<\/code> must be declared in the package where the receiver base type is defined.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package people\n\ntype User struct{}\n\nfunc (u User) Greet() {}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Correct.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Why Does Go Have This Rule?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">It keeps ownership clear.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine package A creates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and package B could secretly add:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User.Delete()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and package C adds:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User.Save()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then it would become difficult to know what methods actually belong to <code>User<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go avoids this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The package defining the type controls its methods.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Value Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">So far, we have mostly written:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is called a <strong>value receiver<\/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\ntype User struct {\n\tName string\n}\n\nfunc (u User) ChangeName() {\n\n\tu.Name = \"Amit\"\n\n\tfmt.Println(\"Inside:\", u.Name)\n}\n\nfunc main() {\n\n\tuser := User{\n\t\tName: \"Rajesh\",\n\t}\n\n\tuser.ChangeName()\n\n\tfmt.Println(\"Outside:\", user.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Inside: Amit\nOutside: Rajesh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(u User)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">receives a copy of the <code>User<\/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 User\n     |\n     | copy\n     v\nMethod receiver<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Changing the copy does not change the original struct.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Pointer Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you want the method to modify the original value, you commonly use a pointer receiver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) ChangeName()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype User struct {\n\tName string\n}\n\nfunc (u *User) ChangeName() {\n\tu.Name = \"Amit\"\n}\n\nfunc main() {\n\n\tuser := User{\n\t\tName: \"Rajesh\",\n\t}\n\n\tuser.ChangeName()\n\n\tfmt.Println(user.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Amit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now the original struct was modified.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Value Receiver vs Pointer Receiver<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is one of the most important method concepts in Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Value receiver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Method()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pointer receiver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) Method()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Main difference:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Receiver<\/th><th>Gets<\/th><th>Can modify original?<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td><code>User<\/code><\/td><td>Copy<\/td><td>Usually \u274c<\/td><td>Read-only behavior<\/td><\/tr><tr><td><code>*User<\/code><\/td><td>Pointer<\/td><td>\u2705<\/td><td>Modify the value<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Easy memory rule:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(User)\n   \u2193\ncopy\n\n(*User)\n   \u2193\noriginal<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Complete Value vs Pointer Example<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Counter struct {\n\tValue int\n}\n\n\/\/ Value receiver gets a copy.\nfunc (c Counter) Show() {\n\tfmt.Println(\"Current:\", c.Value)\n}\n\n\/\/ Pointer receiver can change original.\nfunc (c *Counter) Increment() {\n\tc.Value++\n}\n\nfunc main() {\n\n\tcounter := Counter{\n\t\tValue: 10,\n\t}\n\n\tcounter.Show()\n\n\tcounter.Increment()\n\n\tcounter.Show()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Current: 10\nCurrent: 11<\/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. Why Don&#8217;t We Write <code>&amp;counter<\/code>?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You may notice:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>counter.Increment()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">works even though:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Increment()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">expects:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*Counter<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go automatically handles this in many ordinary method calls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You could think of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>counter.Increment()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">roughly as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(&amp;counter).Increment()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">when <code>counter<\/code> is addressable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is one reason Go pointer receiver syntax stays relatively clean.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Methods Can Have Parameters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A receiver is not a replacement for parameters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can have both.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Calculator struct{}\n\nfunc (c Calculator) Add(a int, b int) int {\n\treturn a + b\n}\n\nfunc main() {\n\n\tcalc := Calculator{}\n\n\tresult := calc.Add(10, 20)\n\n\tfmt.Println(result)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>30<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(c Calculator)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the receiver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>a int, b int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">are normal function parameters.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Methods Can Return Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Exactly like functions.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Rectangle struct {\n\tWidth  float64\n\tHeight float64\n}\n\nfunc (r Rectangle) Area() float64 {\n\treturn r.Width * r.Height\n}\n\nfunc main() {\n\n\tr := Rectangle{\n\t\tWidth:  10,\n\t\tHeight: 5,\n\t}\n\n\tfmt.Println(r.Area())\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>50<\/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. Methods Can Return Multiple Values<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods have the same return capabilities as normal functions.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Calculator struct{}\n\nfunc (c Calculator) Divide(a, b float64) (float64, bool) {\n\n\tif b == 0 {\n\t\treturn 0, false\n\t}\n\n\treturn a \/ b, true\n}\n\nfunc main() {\n\n\tcalc := Calculator{}\n\n\tresult, ok := calc.Divide(10, 2)\n\n\tfmt.Println(result)\n\tfmt.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<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. One Type Can Have Many Methods<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is where methods become especially useful.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype BankAccount struct {\n\tOwner   string\n\tBalance float64\n}\n\nfunc (b BankAccount) ShowBalance() {\n\tfmt.Println(\"Balance:\", b.Balance)\n}\n\nfunc (b *BankAccount) Deposit(amount float64) {\n\tb.Balance += amount\n}\n\nfunc (b *BankAccount) Withdraw(amount float64) {\n\tb.Balance -= amount\n}\n\nfunc main() {\n\n\taccount := BankAccount{\n\t\tOwner:   \"Rajesh\",\n\t\tBalance: 1000,\n\t}\n\n\taccount.ShowBalance()\n\n\taccount.Deposit(500)\n\n\taccount.Withdraw(200)\n\n\taccount.ShowBalance()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Balance: 1000\nBalance: 1300<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now the type feels like one logical object:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BankAccount\n     \u2502\n     \u251c\u2500\u2500 Owner\n     \u251c\u2500\u2500 Balance\n     \u2502\n     \u251c\u2500\u2500 ShowBalance()\n     \u251c\u2500\u2500 Deposit()\n     \u2514\u2500\u2500 Withdraw()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. When Should I Create a Method?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a method when the operation logically belongs to the type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct{}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Good candidates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Login()\nuser.Logout()\nuser.FullName()\nuser.IsAdmin()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because all these describe behavior of a <code>User<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Order struct{}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Methods might be:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>order.Total()\norder.Cancel()\norder.Pay()\norder.Ship()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Numbers &#91;]int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">methods might be:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers.Sum()\nnumbers.Average()\nnumbers.Max()<\/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. When Should I Use a Normal Function Instead?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Not every function needs to be a method.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func Add(a, b int) int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There may be no meaningful object that owns the operation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then a normal function is perfectly appropriate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use a method when:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"This operation belongs to this type.\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use a function when:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"This is a general operation.\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user.Save()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">makes sense.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Math.Add()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">may be unnecessary in Go when:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add(a, b)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is simpler.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Where Are Methods Declared?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Methods are usually declared in the same package as their receiver type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You might have:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>project\/\n\u2502\n\u251c\u2500\u2500 go.mod\n\u2502\n\u251c\u2500\u2500 main.go\n\u2502\n\u2514\u2500\u2500 user\/\n    \u251c\u2500\u2500 user.go\n    \u2514\u2500\u2500 methods.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>user\/user.go<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package user\n\ntype User struct {\n\tName string\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>user\/methods.go<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package user\n\nimport \"fmt\"\n\nfunc (u User) Greet() {\n\tfmt.Println(\"Hello\", u.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These methods don&#8217;t have to physically be in the same <code>.go<\/code> file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They just need to belong to the same package as the receiver&#8217;s defined type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That distinction is important:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Same package does not mean same file.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Receiver Name Can Be Anything<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">could technically be:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (x User) Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (user User) Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">But Go commonly uses short receiver names.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User)\nfunc (c Customer)\nfunc (o Order)\nfunc (p Product)\nfunc (s Server)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is common Go style.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Avoid <code>this<\/code> and <code>self<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Coming from Java, C++, Python, etc., you may expect:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>this<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>self<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go does not have a special <code>this<\/code> or <code>self<\/code> keyword.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead you explicitly choose the receiver name:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet() {\n\tfmt.Println(u.Name)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>u<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">plays the role that <code>this<\/code> or <code>self<\/code> often plays in other languages.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Methods Are Important for Interfaces<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is a major reason methods matter in Go.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose we define an interface:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Speaker interface {\n\tSpeak()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And a type:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Dog struct{}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (d Dog) Speak() {\n\tfmt.Println(\"Woof\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then <code>Dog<\/code> automatically satisfies <code>Speaker<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Complete example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Speaker interface {\n\tSpeak()\n}\n\ntype Dog struct{}\n\nfunc (d Dog) Speak() {\n\tfmt.Println(\"Woof\")\n}\n\nfunc makeSound(s Speaker) {\n\ts.Speak()\n}\n\nfunc main() {\n\n\tdog := Dog{}\n\n\tmakeSound(dog)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Woof<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice there is no:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>implements Speaker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">statement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go checks the methods.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because <code>Dog<\/code> has:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Speak()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">it satisfies:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Speaker<\/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. Methods Create the Method Set<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Every type has a set of methods associated with it.<\/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{}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet() {}\n\nfunc (u User) Name() {}\n\nfunc (u User) IsAdmin() {}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User Method Set\n\u2502\n\u251c\u2500\u2500 Greet()\n\u251c\u2500\u2500 Name()\n\u2514\u2500\u2500 IsAdmin()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Interfaces check these methods to determine whether the type satisfies them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Pointer Receivers and Interfaces<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is a slightly more advanced but very important topic.<\/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\tSpeak()\n}\n\ntype Dog struct{}\n\nfunc (d *Dog) Speak() {\n\tfmt.Println(\"Woof\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because <code>Speak()<\/code> has a pointer receiver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*Dog<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">implements <code>Speaker<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But the plain <code>Dog<\/code> value does not have that pointer-receiver method in its method set for interface satisfaction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So this works:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dog := &amp;Dog{}\n\nmakeSound(dog)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">But this does not:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dog := Dog{}\n\nmakeSound(dog)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">when <code>Speak()<\/code> exists only on <code>*Dog<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This distinction matters especially with interfaces.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. One Important Technical Precision<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Earlier we used the simple rule:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">&#8220;A receiver can be almost any named type you define.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The precise Go rule is slightly more specific.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver base type must be a <strong>defined type belonging to the same package<\/strong>, and the base type cannot be an interface or pointer type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For normal learning, remember:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>You define a type\n        \u2193\nin your package\n        \u2193\nattach methods to it<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age int\ntype Name string\ntype User struct{}\ntype Numbers &#91;]int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Perfectly valid.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. Defined Type vs Alias \u2014 Important<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Consider:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This creates a new defined type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (a Age) IsAdult() bool<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is valid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age = int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is a <strong>type alias<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Age is simply another spelling for int.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It does not create a new local defined type that lets you attach methods to built-in <code>int<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So understand the difference:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">New defined type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Versus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age = int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For methods, you usually want:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Age int<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Complete Example: Multiple Receiver Types<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Here is one program demonstrating several types.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n\/\/ ---------- Struct ----------\n\ntype User struct {\n\tName string\n}\n\nfunc (u User) Greet() {\n\tfmt.Println(\"Hello\", u.Name)\n}\n\n\/\/ ---------- Integer ----------\n\ntype Age int\n\nfunc (a Age) IsAdult() bool {\n\treturn a &gt;= 18\n}\n\n\/\/ ---------- String ----------\n\ntype Name string\n\nfunc (n Name) Upper() string {\n\treturn strings.ToUpper(string(n))\n}\n\n\/\/ ---------- Slice ----------\n\ntype Numbers &#91;]int\n\nfunc (n Numbers) Sum() int {\n\n\ttotal := 0\n\n\tfor _, number := range n {\n\t\ttotal += number\n\t}\n\n\treturn total\n}\n\n\/\/ ---------- Map ----------\n\ntype Scores map&#91;string]int\n\nfunc (s Scores) Get(name string) int {\n\treturn s&#91;name]\n}\n\n\/\/ ---------- Array ----------\n\ntype Coordinates &#91;2]int\n\nfunc (c Coordinates) Print() {\n\tfmt.Println(c&#91;0], c&#91;1])\n}\n\n\/\/ ---------- Function ----------\n\ntype Task func()\n\nfunc (t Task) Run() {\n\tfmt.Println(\"Starting task...\")\n\tt()\n}\n\n\/\/ ---------- Channel ----------\n\ntype MessageChannel chan string\n\nfunc (m MessageChannel) Send(message string) {\n\tm &lt;- message\n}\n\nfunc main() {\n\n\t\/\/ Struct\n\tuser := User{Name: \"Rajesh\"}\n\tuser.Greet()\n\n\t\/\/ Integer\n\tage := Age(25)\n\tfmt.Println(\"Adult:\", age.IsAdult())\n\n\t\/\/ String\n\tname := Name(\"rajesh\")\n\tfmt.Println(\"Upper:\", name.Upper())\n\n\t\/\/ Slice\n\tnumbers := Numbers{10, 20, 30}\n\tfmt.Println(\"Sum:\", numbers.Sum())\n\n\t\/\/ Map\n\tscores := Scores{\n\t\t\"Rajesh\": 90,\n\t}\n\tfmt.Println(\"Score:\", scores.Get(\"Rajesh\"))\n\n\t\/\/ Array\n\tcoordinates := Coordinates{10, 20}\n\tcoordinates.Print()\n\n\t\/\/ Function\n\ttask := Task(func() {\n\t\tfmt.Println(\"Task running\")\n\t})\n\ttask.Run()\n\n\t\/\/ Channel\n\tchannel := make(MessageChannel, 1)\n\n\tchannel.Send(\"Hello from channel\")\n\n\tfmt.Println(&lt;-channel)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello Rajesh\nAdult: true\nUpper: RAJESH\nSum: 60\nScore: 90\n10 20\nStarting task...\nTask running\nHello from channel<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Receiver Types Summary<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Underlying type<\/th><th>Example<\/th><th>Method allowed?<\/th><\/tr><\/thead><tbody><tr><td>Struct<\/td><td><code>type User struct{}<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Integer<\/td><td><code>type Age int<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>String<\/td><td><code>type Name string<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Float<\/td><td><code>type Price float64<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Slice<\/td><td><code>type Numbers []int<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Map<\/td><td><code>type Scores map[string]int<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Array<\/td><td><code>type Point [2]int<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Function<\/td><td><code>type Task func()<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Channel<\/td><td><code>type Messages chan string<\/code><\/td><td>\u2705<\/td><\/tr><tr><td>Built-in <code>int<\/code> directly<\/td><td><code>int<\/code><\/td><td>\u274c<\/td><\/tr><tr><td>Built-in <code>string<\/code> directly<\/td><td><code>string<\/code><\/td><td>\u274c<\/td><\/tr><tr><td>Type from another package<\/td><td><code>http.Client<\/code><\/td><td>\u274c<\/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\">40. Method Anatomy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Take:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) ChangeName(name string) bool {\n\tu.Name = name\n\treturn true\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Breakdown:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func\n \u2502\n \u2502    receiver\n \u2502    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502    \u2502\nfunc (u *User) ChangeName(name string) bool {\n      \u2502 \u2502       \u2502          \u2502          \u2502\n      \u2502 \u2502       \u2502          \u2502          \u2514\u2500\u2500 return type\n      \u2502 \u2502       \u2502          \u2502\n      \u2502 \u2502       \u2502          \u2514\u2500\u2500 parameter\n      \u2502 \u2502       \u2502\n      \u2502 \u2502       \u2514\u2500\u2500 method name\n      \u2502 \u2502\n      \u2502 \u2514\u2500\u2500 receiver type\n      \u2502\n      \u2514\u2500\u2500 receiver variable<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So a method contains:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Receiver\nMethod name\nParameters\nReturn values\nBody<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Almost exactly like a function, except for 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\">41. How to Design a Method<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">When creating a type, ask:<\/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\">What actions naturally belong to this value?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">For:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Employee struct {\n\tName   string\n\tSalary float64\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Potential methods:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>employee.FullName()\nemployee.GiveRaise()\nemployee.CalculateTax()\nemployee.PrintDetails()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You probably wouldn&#8217;t create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>employee.ConnectDatabase()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">unless database connection genuinely belongs to the employee concept.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Method design should represent logical behavior.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Real-World Example<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype BankAccount struct {\n\tAccountHolder string\n\tBalance       float64\n}\n\nfunc (a BankAccount) ShowBalance() {\n\tfmt.Println(\"Balance:\", a.Balance)\n}\n\nfunc (a *BankAccount) Deposit(amount float64) {\n\n\tif amount &lt;= 0 {\n\t\tfmt.Println(\"Invalid deposit\")\n\t\treturn\n\t}\n\n\ta.Balance += amount\n}\n\nfunc (a *BankAccount) Withdraw(amount float64) {\n\n\tif amount &gt; a.Balance {\n\t\tfmt.Println(\"Insufficient balance\")\n\t\treturn\n\t}\n\n\ta.Balance -= amount\n}\n\nfunc main() {\n\n\taccount := BankAccount{\n\t\tAccountHolder: \"Rajesh\",\n\t\tBalance:       1000,\n\t}\n\n\taccount.ShowBalance()\n\n\taccount.Deposit(500)\n\n\taccount.ShowBalance()\n\n\taccount.Withdraw(300)\n\n\taccount.ShowBalance()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Balance: 1000\nBalance: 1500\nBalance: 1200<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is a natural place for methods because:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BankAccount\n    \u2502\n    \u251c\u2500\u2500 data\n    \u2502   \u251c\u2500\u2500 AccountHolder\n    \u2502   \u2514\u2500\u2500 Balance\n    \u2502\n    \u2514\u2500\u2500 behavior\n        \u251c\u2500\u2500 ShowBalance()\n        \u251c\u2500\u2500 Deposit()\n        \u2514\u2500\u2500 Withdraw()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. How Method Calls Work Mentally<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Given:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>account.Deposit(500)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Read it naturally as:<\/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;Ask this account to deposit 500.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Given:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>numbers.Sum()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">read:<\/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;Ask these numbers for their sum.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Given:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>age.IsAdult()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">read:<\/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;Ask this age whether it represents an adult.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">This mental model makes method APIs much easier to design.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Method vs Struct vs Interface<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">These three concepts are closely connected.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Struct<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stores data.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Dog struct {\n\tName string\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Method<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Adds behavior.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (d Dog) Speak() {\n\tfmt.Println(\"Woof\")\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Interface<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Defines required behavior.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Speaker interface {\n\tSpeak()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Together:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>        STRUCT\n       Dog{Name}\n          \u2502\n          \u2502 has\n          \u25bc\n        METHOD\n        Speak()\n          \u2502\n          \u2502 satisfies\n          \u25bc\n       INTERFACE\n       Speaker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This relationship is central to Go.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. The Big Picture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Dog struct {\n\tName string\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Data:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Name<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (d Dog) Speak()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now <code>Dog<\/code> has behavior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Dog\n \u251c\u2500\u2500 Name\n \u2514\u2500\u2500 Speak()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Speaker interface {\n\tSpeak()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Because <code>Dog<\/code> has <code>Speak()<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Dog satisfies Speaker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You do not explicitly declare that relationship.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go discovers it from the methods.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Best Practice: Value or Pointer Receiver?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A useful beginner rule:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use a <strong>pointer receiver<\/strong> when the method changes the value.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) ChangeName(name string)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use a <strong>value receiver<\/strong> when it only reads the value and the type is reasonably small.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) FullName() string<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For larger structs, pointer receivers are also often preferred to avoid copying the entire struct.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type User struct {\n\tName  string\n\tEmail string\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Read-only:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) DisplayName() string {\n\treturn u.Name\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Modification:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) ChangeEmail(email string) {\n\tu.Email = email\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\">47. One Style Recommendation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If a type has several methods and some need pointer receivers, it is often cleaner to use pointer receivers consistently for that type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) ChangeName() {}\nfunc (u *User) Save() {}\nfunc (u *User) Validate() {}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">rather than randomly mixing receiver styles without reason.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This becomes especially important when interfaces and method sets 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\">48. Common Beginner Mistakes<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">Mistake 1: Thinking methods require structs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wrong:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Method = struct function<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Method = function attached to your own defined type<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Structs are just the most common receiver types.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Mistake 2: Trying to attach a method to <code>int<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wrong:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (x int) Double() int<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Correct:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type MyInt int\n\nfunc (x MyInt) Double() MyInt<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Mistake 3: Expecting value receiver changes to persist<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) ChangeName()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">works on a copy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For modification, usually use:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) ChangeName()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Mistake 4: Thinking receiver is a normal parameter<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u User) Greet(name string)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">contains:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>u      \u2192 receiver\nname   \u2192 parameter<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">They serve different roles.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Mistake 5: Thinking method must be in same file<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It must belong to the appropriate package, not necessarily the same source file.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">49. Quick Decision Guide<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Ask these questions:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Question<\/th><th>Choice<\/th><\/tr><\/thead><tbody><tr><td>Does behavior belong to a type?<\/td><td>Method<\/td><\/tr><tr><td>Is it a general operation?<\/td><td>Function<\/td><\/tr><tr><td>Need to change original value?<\/td><td>Pointer receiver<\/td><\/tr><tr><td>Only reading small value?<\/td><td>Value receiver often fine<\/td><\/tr><tr><td>Want type to satisfy interface?<\/td><td>Implement required methods<\/td><\/tr><tr><td>Want method on <code>int<\/code>\/<code>string<\/code>?<\/td><td>First define your own type<\/td><\/tr><tr><td>Type belongs to another package?<\/td><td>Cannot add methods directly<\/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\">50. Final Mental Model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Remember this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TYPE\n \u2502\n \u2502 define data\/value\n \u2502\n \u25bc\nMETHOD\n \u2502\n \u2502 adds behavior\n \u2502\n \u25bc\nINTERFACE\n \u2502\n \u2502 describes required behavior\n \u2502\n \u25bc\nPOLYMORPHISM<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And the core syntax is simply:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (receiver ReceiverType) MethodName() {\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 (u User) Greet() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or with a pointer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (u *User) ChangeName() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The most important lesson 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\"><strong>A Go method is a function attached to a locally defined type through a receiver. The receiver is not limited to structs. Your own types based on integers, strings, floats, slices, maps, arrays, functions, and channels can also have methods.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">For everyday Go, however, you will see methods most frequently on:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Something struct {\n\t...\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">because structs are how Go commonly groups related data, and methods naturally provide the behavior associated with that data.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Go methods become much easier once you understand one idea: A method is simply a function attached to a type. And the important rule is: A receiver&#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-1101","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1101","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=1101"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1101\/revisions"}],"predecessor-version":[{"id":1102,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1101\/revisions\/1102"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}