{"id":1063,"date":"2026-08-16T21:27:55","date_gmt":"2026-08-16T21:27:55","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1063"},"modified":"2026-08-16T21:27:56","modified_gmt":"2026-08-16T21:27:56","slug":"go-tutorials-module-package-function-method-interface","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/go-tutorials-module-package-function-method-interface\/","title":{"rendered":"Go Tutorials \u2014 Module, Package, Function, Method &amp; Interface"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">These five concepts become much easier once you see <strong>how they fit together<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart TD\n    M&#91;\"Module&lt;br\/&gt;Whole Go project\"]\n    P1&#91;\"Package main\"]\n    P2&#91;\"Package fmt\"]\n    F&#91;\"Function&lt;br\/&gt;add()\"]\n    T&#91;\"Type&lt;br\/&gt;Person\"]\n    ME&#91;\"Method&lt;br\/&gt;person.Greet()\"]\n    I&#91;\"Interface&lt;br\/&gt;Speaker\"]\n\n    M --&gt; P1\n    P1 --&gt; F\n    P1 --&gt; T\n    T --&gt; ME\n    I -. \"method satisfies\" .-&gt; ME\n    P1 --&gt;|\"imports\"| P2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest mental model 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>Module = Project<\/strong><br><strong>Package = Folder \/ code group<\/strong><br><strong>Function = Standalone action<\/strong><br><strong>Method = Action belonging to a type<\/strong><br><strong>Interface = Required behavior<\/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\">1. Module<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What is a Module?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>module is your Go project<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is normally a directory containing a file called:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go.mod<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>myapp\/\n\u251c\u2500\u2500 go.mod\n\u2514\u2500\u2500 main.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/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>Module = entire project<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why do we need a Module?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Go uses the module to know:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the name of your project<\/li>\n\n\n\n<li>which external dependencies your project uses<\/li>\n\n\n\n<li>which versions of dependencies should be downloaded<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">When do we use it?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Normally when starting a new Go project:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir myapp\ncd myapp\n\ngo mod init myapp<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go creates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go.mod<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Complete Example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir module-demo\ncd module-demo\n\ngo mod init module-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ll see:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go: creating new go.mod: module module-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now create:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>main.go<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc main() {\n\t\/\/ This is our program.\n\tfmt.Println(\"Hello from my Go module!\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hello from my Go module!<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your directory now looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>module-demo\/\n\u251c\u2500\u2500 go.mod\n\u2514\u2500\u2500 main.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And <code>go.mod<\/code> will look approximately like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>module module-demo\n\ngo 1.26<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What does this mean?<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>module module-demo<\/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\">The name\/path of this module is <code>module-demo<\/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>go 1.26<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">tells Go which Go language\/module version this project targets.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Where does Module sit?<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart TD\n    A&#91;\"module-demo&lt;br\/&gt;MODULE\"]\n    B&#91;\"go.mod\"]\n    C&#91;\"main.go\"]\n    D&#91;\"package main\"]\n\n    A --&gt; B\n    A --&gt; C\n    C --&gt; D<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Remember<\/h3>\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>One project usually has one <code>go.mod<\/code>.<\/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\">2. Package<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What is a Package?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>package is a group of related Go code<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every <code>.go<\/code> file must declare which package it belongs to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why do we need Packages?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Packages help organize code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine a large application:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shopping-app\/\n\u251c\u2500\u2500 main.go\n\u251c\u2500\u2500 users\/\n\u251c\u2500\u2500 payments\/\n\u251c\u2500\u2500 orders\/\n\u2514\u2500\u2500 products\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You could have packages such as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main\nusers\npayments\norders\nproducts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of putting everything into one huge file.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">When do we use Packages?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Always.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Every Go file belongs to a package.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even the smallest Go program has:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Complete Example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create <code>main.go<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\n\/\/ \u2191 This file belongs to the \"main\" package.\n\nimport \"fmt\"\n\n\/\/ \u2191 We are using another package called \"fmt\".\n\/\/ fmt is part of Go's standard library.\n\nfunc main() {\n\n\t\/\/ Println is a function inside the fmt package.\n\tfmt.Println(\"Hello Go!\")\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run main.go<\/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!<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Look carefully at this<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println(\"Hello Go!\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is the <strong>package<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Println<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">is a <strong>function inside the package<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println()\n\u2502   \u2502\n\u2502   \u2514\u2500\u2500 Function\n\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500 Package<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What is special about <code>package main<\/code>?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is important.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">This package is intended to build an executable program.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">For an executable Go program, you normally need:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nfunc main() {\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n     +\nfunc main()\n     =\nexecutable Go program<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Package relationship<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart LR\n    A&#91;\"package main\"] --&gt;|\"uses\"| B&#91;\"package fmt\"]\n    B --&gt; C&#91;\"Println()\"]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Remember<\/h3>\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>Module contains packages.<\/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\">3. Function<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">What is a Function?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A function is a <strong>named block of code that performs a task<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) int {\n\treturn a + b\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/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 = reusable action<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add()\nlogin()\nsendEmail()\ncalculateSalary()\nprintReport()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why use Functions?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Without functions, you would repeat the same code again and again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>result := 10 + 20<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">everywhere, you can create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add(10, 20)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Complete Example<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\n\/\/ add is a FUNCTION.\n\/\/\n\/\/ a int  -&gt; first input\n\/\/ b int  -&gt; second input\n\/\/ int    -&gt; function returns an integer\nfunc add(a int, b int) int {\n\n\tresult := a + b\n\n\treturn result\n}\n\nfunc main() {\n\n\t\/\/ Calling the function\n\tanswer := add(10, 20)\n\n\tfmt.Println(\"Answer:\", answer)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run main.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Answer: 30<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Understand the function<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func add(a int, b int) int {\n\treturn a + b\n}<\/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 add(a int, b int) int\n\u2502    \u2502   \u2502             \u2502\n\u2502    \u2502   \u2502             \u2514\u2500\u2500 return type\n\u2502    \u2502   \u2502\n\u2502    \u2502   \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 parameters\n\u2502    \u2502\n\u2502    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 function name\n\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 function keyword<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">How do we call it?<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>answer := add(10, 20)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart LR\n    A&#91;\"main()\"] --&gt; B&#91;\"add(10,20)\"]\n    B --&gt; C&#91;\"10 + 20\"]\n    C --&gt; D&#91;\"return 30\"]\n    D --&gt; A<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Where can a function exist?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A normal function belongs to a <strong>package<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nfunc add() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>add()<\/code> belongs to package <code>main<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Remember<\/h3>\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>Function = standalone behavior.<\/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\">4. Method<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is where many Go learners get confused.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A method is almost the same as a function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The difference 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 method belongs to a type.<\/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\">Function vs Method<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func greet() {\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) greet() {\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notice this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(p Person)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That is called the <strong>receiver<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It connects the function to <code>Person<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why use Methods?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose we have:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type Person struct {\n\tName string\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A person may perform actions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Person\n \u251c\u2500\u2500 Greet()\n \u251c\u2500\u2500 Walk()\n \u251c\u2500\u2500 Sleep()\n \u2514\u2500\u2500 Work()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These actions naturally belong to <code>Person<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So methods make sense.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Complete Example<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\n\/\/ Person is a custom type.\ntype Person struct {\n\tName string\n}\n\n\/\/ Greet is a METHOD belonging to Person.\n\/\/\n\/\/ (p Person) is called the RECEIVER.\n\/\/\n\/\/ It means:\n\/\/ \"This method belongs to Person.\"\nfunc (p Person) Greet() {\n\n\tfmt.Println(\"Hello, my name is\", p.Name)\n}\n\nfunc main() {\n\n\t\/\/ Create a Person value\n\tperson := Person{\n\t\tName: \"Rajesh\",\n\t}\n\n\t\/\/ Call the method using the Person value\n\tperson.Greet()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run main.go<\/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 Rajesh<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Understand this line<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) 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 (p Person) Greet()\n\u2502     \u2502        \u2502\n\u2502     \u2502        \u2514\u2500\u2500 method name\n\u2502     \u2502\n\u2502     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 receiver\n\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 keyword<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The receiver:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(p Person)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><code>Greet()<\/code> belongs to <code>Person<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Therefore we can write<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>person.Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person.Greet()\n\u2502      \u2502\n\u2502      \u2514\u2500\u2500 Method\n\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Person object\/value<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Function vs Method<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Normal function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Greet(person)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>person.Greet()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Conceptually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart LR\n    A&#91;\"Person\"] --&gt; B&#91;\"Greet()\"]\n    A --&gt; C&#91;\"Walk()\"]\n    A --&gt; D&#91;\"Work()\"]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Remember<\/h3>\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>Function = standalone action<\/strong><\/p>\n<\/blockquote>\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>Method = action attached to a type<\/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\">5. Interface<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is usually the most confusing one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But there is a very simple way to think about it.<\/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>Interface = a list of behaviors\/methods that something must have.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose we create:<\/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\">This 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\">Anything that has a <code>Speak()<\/code> method can be considered a <code>Speaker<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the core idea.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Why use an Interface?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Dog can Speak()\nPerson can Speak()\nRobot can Speak()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">All three are completely different types.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But they have one thing in common:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Speak()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So we could create:<\/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\">Now functions can work with <strong>anything that knows how to Speak<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Complete Interface Example<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\n\/\/ Speaker is an INTERFACE.\n\/\/\n\/\/ Anything that has:\n\/\/\n\/\/ Speak()\n\/\/\n\/\/ automatically satisfies this interface.\ntype Speaker interface {\n\tSpeak()\n}\n\n\/\/ Person is a custom type.\ntype Person struct {\n\tName string\n}\n\n\/\/ Person has a Speak method.\n\/\/\n\/\/ Therefore Person automatically satisfies\n\/\/ the Speaker interface.\nfunc (p Person) Speak() {\n\n\tfmt.Println(p.Name, \"says hello!\")\n}\n\n\/\/ This function accepts ANYTHING\n\/\/ that satisfies the Speaker interface.\nfunc makeItSpeak(s Speaker) {\n\n\ts.Speak()\n}\n\nfunc main() {\n\n\tperson := Person{\n\t\tName: \"Rajesh\",\n\t}\n\n\t\/\/ Person has Speak()\n\t\/\/ therefore Person can be passed as Speaker.\n\tmakeItSpeak(person)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run main.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Rajesh says hello!<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">The important part<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">We created:<\/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 <code>Person<\/code> has:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) Speak() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Speaker requires Speak()\n           \u2191\n           \u2502\nPerson has Speak()\n           \u2502\n           \u2193\nPerson satisfies Speaker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You do <strong>NOT<\/strong> write something like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Person implements Speaker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go figures it out automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is called <strong>implicit interface implementation<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Visualize it<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart TD\n    I&#91;\"Speaker Interface&lt;br\/&gt;requires Speak()\"]\n\n    P&#91;\"Person\"]\n    D&#91;\"Dog\"]\n    R&#91;\"Robot\"]\n\n    PM&#91;\"Speak()\"]\n    DM&#91;\"Speak()\"]\n    RM&#91;\"Speak()\"]\n\n    P --&gt; PM\n    D --&gt; DM\n    R --&gt; RM\n\n    PM --&gt; I\n    DM --&gt; I\n    RM --&gt; I<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If all three types have:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Speak()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">then all three satisfy:<\/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\">The Complete Mental Model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Now connect everything together.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine this project:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shop\/\n\u251c\u2500\u2500 go.mod\n\u2514\u2500\u2500 main.go<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Module<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>shop<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The entire project.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Package<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Inside <code>main.go<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Code organization.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Function<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func calculatePrice() {\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Standalone behavior.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Type<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>type Customer struct {\n\tName string\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Represents something.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Method<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>func (c Customer) Buy() {\n\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Behavior attached to <code>Customer<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Interface<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>type Buyer interface {\n\tBuy()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Defines the behavior something must have.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">How Everything Fits Together<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart TD\n    M&#91;\"MODULE&lt;br\/&gt;shopping-app\"]\n\n    P&#91;\"PACKAGE&lt;br\/&gt;main\"]\n\n    F&#91;\"FUNCTION&lt;br\/&gt;calculatePrice()\"]\n\n    T&#91;\"TYPE&lt;br\/&gt;Customer\"]\n\n    ME&#91;\"METHOD&lt;br\/&gt;customer.Buy()\"]\n\n    I&#91;\"INTERFACE&lt;br\/&gt;Buyer&lt;br\/&gt;requires Buy()\"]\n\n    M --&gt; P\n\n    P --&gt; F\n    P --&gt; T\n    P --&gt; I\n\n    T --&gt; ME\n\n    ME -. \"satisfies\" .-&gt; I<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That one diagram is worth remembering.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Master Comparison<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Concept<\/th><th>Simple Meaning<\/th><th>Example<\/th><th>Belongs To \/ Contains<\/th><th>Main Purpose<\/th><\/tr><\/thead><tbody><tr><td><strong>Module<\/strong><\/td><td>Entire Go project<\/td><td><code>module shopping<\/code><\/td><td>Contains packages<\/td><td>Project\/dependency management<\/td><\/tr><tr><td><strong>Package<\/strong><\/td><td>Group of Go code<\/td><td><code>package main<\/code><\/td><td>Belongs to module<\/td><td>Organize code<\/td><\/tr><tr><td><strong>Function<\/strong><\/td><td>Standalone action<\/td><td><code>add()<\/code><\/td><td>Belongs to package<\/td><td>Perform reusable work<\/td><\/tr><tr><td><strong>Method<\/strong><\/td><td>Function attached to a type<\/td><td><code>person.Greet()<\/code><\/td><td>Belongs to a type<\/td><td>Give behavior to types<\/td><\/tr><tr><td><strong>Interface<\/strong><\/td><td>Required methods\/behavior<\/td><td><code>Speaker<\/code><\/td><td>Defined in a package<\/td><td>Allow different types to share behavior<\/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\">Module vs Package<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Module<\/th><th>Package<\/th><\/tr><\/thead><tbody><tr><td>Entire project<\/td><td>Part of project<\/td><\/tr><tr><td>Defined by <code>go.mod<\/code><\/td><td>Defined by <code>package xxx<\/code><\/td><\/tr><tr><td>Can contain many packages<\/td><td>Contains Go files\/types\/functions<\/td><\/tr><tr><td>Handles dependencies<\/td><td>Organizes code<\/td><\/tr><tr><td>Example <code>shopping-app<\/code><\/td><td>Example <code>payment<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Company\n  \u2193\nDepartments<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">similar to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Module\n  \u2193\nPackages<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Package vs Function<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Package<\/th><th>Function<\/th><\/tr><\/thead><tbody><tr><td>Groups code<\/td><td>Performs an action<\/td><\/tr><tr><td>Contains functions<\/td><td>Lives inside package<\/td><\/tr><tr><td><code>fmt<\/code><\/td><td><code>Println()<\/code><\/td><\/tr><tr><td><code>math<\/code><\/td><td><code>Sqrt()<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt.Println()<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>fmt       = package\nPrintln   = function<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Function vs Method<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This distinction is extremely important.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Function<\/th><th>Method<\/th><\/tr><\/thead><tbody><tr><td>Standalone<\/td><td>Attached to a type<\/td><\/tr><tr><td>No receiver<\/td><td>Has receiver<\/td><\/tr><tr><td><code>add(10,20)<\/code><\/td><td><code>person.Greet()<\/code><\/td><\/tr><tr><td><code>func add()<\/code><\/td><td><code>func (p Person) Greet()<\/code><\/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 greet() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Method:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) greet() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The magic difference is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(p Person)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Method vs Interface<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Interface<\/th><\/tr><\/thead><tbody><tr><td>Actual behavior\/code<\/td><td>Required behavior<\/td><\/tr><tr><td>Contains implementation<\/td><td>Usually only method signatures<\/td><\/tr><tr><td><code>Speak()<\/code> prints something<\/td><td>Says &#8220;<code>Speak()<\/code> must exist&#8221;<\/td><\/tr><tr><td>Attached to a type<\/td><td>Can be satisfied by many types<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Interface says:<\/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\">Person provides:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func (p Person) Speak() {\n\tfmt.Println(\"Hello\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Therefore:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Person \u2192 satisfies \u2192 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\">Function vs Interface<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Function<\/th><th>Interface<\/th><\/tr><\/thead><tbody><tr><td>Performs actual work<\/td><td>Describes required behavior<\/td><\/tr><tr><td>Contains code<\/td><td>Contains method signatures<\/td><\/tr><tr><td><code>add()<\/code><\/td><td><code>Speaker<\/code><\/td><\/tr><tr><td>Called directly<\/td><td>Used as a type\/contract<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func makeItSpeak(s Speaker) {\n\ts.Speak()\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>makeItSpeak = function\nSpeaker     = interface\nSpeak       = required method<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Module vs Everything Else<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This hierarchy makes it easier:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MODULE\n\u2502\n\u251c\u2500\u2500 PACKAGE\n\u2502    \u2502\n\u2502    \u251c\u2500\u2500 Function\n\u2502    \u2502\n\u2502    \u251c\u2500\u2500 Type\n\u2502    \u2502     \u2502\n\u2502    \u2502     \u2514\u2500\u2500 Method\n\u2502    \u2502\n\u2502    \u2514\u2500\u2500 Interface\n\u2502\n\u2514\u2500\u2500 PACKAGE\n     \u2502\n     \u251c\u2500\u2500 Function\n     \u251c\u2500\u2500 Type\n     \u2514\u2500\u2500 Interface<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or visually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart TD\n    M&#91;\"MODULE\"]\n\n    P1&#91;\"PACKAGE\"]\n    P2&#91;\"PACKAGE\"]\n\n    F&#91;\"FUNCTION\"]\n    T&#91;\"TYPE\"]\n    ME&#91;\"METHOD\"]\n    I&#91;\"INTERFACE\"]\n\n    M --&gt; P1\n    M --&gt; P2\n\n    P1 --&gt; F\n    P1 --&gt; T\n    P1 --&gt; I\n\n    T --&gt; ME<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">One-Line Definitions You Should Memorize<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Concept<\/th><th>Memorize This<\/th><\/tr><\/thead><tbody><tr><td><strong>Module<\/strong><\/td><td>A Go project containing one or more packages<\/td><\/tr><tr><td><strong>Package<\/strong><\/td><td>A group of related Go files\/code<\/td><\/tr><tr><td><strong>Function<\/strong><\/td><td>A reusable standalone block of code<\/td><\/tr><tr><td><strong>Method<\/strong><\/td><td>A function attached to a type<\/td><\/tr><tr><td><strong>Interface<\/strong><\/td><td>A set of methods describing behavior<\/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\">The 5 Questions to Ask Yourself<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Whenever you see Go code, identify these things.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. What is the module?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Look at:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go.mod<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. What package am I in?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Look at the first line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Is this a function?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Look for:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>func add() {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No receiver \u2192 <strong>function<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Is this a method?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Look for:<\/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\">Receiver exists:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(p Person)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 <strong>method<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. Is this an interface?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Look for:<\/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\">\u2192 <strong>interface<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Example to Test Your Understanding<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t run this yet. Just identify each part:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\ntype Person struct {\n\tName string\n}\n\ntype Speaker interface {\n\tSpeak()\n}\n\nfunc add(a int, b int) int {\n\treturn a + b\n}\n\nfunc (p Person) Speak() {\n\tfmt.Println(p.Name, \"is speaking\")\n}\n\nfunc main() {\n\n\tp := Person{Name: \"Rajesh\"}\n\n\tp.Speak()\n\n\tfmt.Println(add(10, 20))\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The answer is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n      \u2193\nPACKAGE\n\n\ntype Person struct\n      \u2193\nTYPE\n\n\ntype Speaker interface\n      \u2193\nINTERFACE\n\n\nfunc add(...)\n      \u2193\nFUNCTION\n\n\nfunc (p Person) Speak()\n      \u2193\nMETHOD\n\n\nfunc main()\n      \u2193\nFUNCTION<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And if the directory has:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go.mod<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">then the entire directory\/project is the:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MODULE<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">The Most Important Picture<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Keep this mental picture:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart LR\n    M&#91;\"Module&lt;br\/&gt;PROJECT\"] --&gt; P&#91;\"Package&lt;br\/&gt;CODE GROUP\"]\n\n    P --&gt; F&#91;\"Function&lt;br\/&gt;DO SOMETHING\"]\n\n    P --&gt; T&#91;\"Type&lt;br\/&gt;REPRESENT SOMETHING\"]\n\n    T --&gt; ME&#91;\"Method&lt;br\/&gt;TYPE CAN DO SOMETHING\"]\n\n    P --&gt; I&#91;\"Interface&lt;br\/&gt;MUST BE ABLE TO DO SOMETHING\"]\n\n    ME -. \"can satisfy\" .-&gt; I<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">In plain English<\/h3>\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>Module:<\/strong> This is my project.<br><strong>Package:<\/strong> This is how I organize my project&#8217;s code.<br><strong>Function:<\/strong> Do this work.<br><strong>Method:<\/strong> This particular type can do this work.<br><strong>Interface:<\/strong> I don&#8217;t care what the type is, as long as it can do this work.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If you get these five sentences clear, <strong>Go functions, methods, and interfaces become much easier to understand.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>These five concepts become much easier once you see how they fit together: The simplest mental model is: Module = ProjectPackage = Folder \/ code groupFunction =&#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-1063","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1063","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=1063"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1063\/revisions"}],"predecessor-version":[{"id":1064,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1063\/revisions\/1064"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1063"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1063"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}