{"id":1086,"date":"2026-08-17T00:36:17","date_gmt":"2026-08-17T00:36:17","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1086"},"modified":"2026-08-17T00:36:18","modified_gmt":"2026-08-17T00:36:18","slug":"go-tutorials-dependency-management-with-go-modules","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/go-tutorials-dependency-management-with-go-modules\/","title":{"rendered":"Go Tutorials: Dependency Management with Go Modules"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Go Modules become much easier once you keep one mental model in mind:<\/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>Your Go source code says what packages you use. <code>go.mod<\/code> says which modules\/versions provide them. <code>go.sum<\/code> helps verify downloaded dependency content.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>module<\/strong> is normally your Go project or library together with its dependency information. <code>go mod init<\/code> creates the module&#8217;s <code>go.mod<\/code> file, while commands such as <code>go get<\/code> and <code>go mod tidy<\/code> keep dependency information synchronized with your source code. (<a href=\"https:\/\/go.dev\/doc\/modules\/managing-dependencies?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. What is dependency management?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose your program needs to generate a UUID.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You could write all the UUID logic yourself, or use an existing Go package:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import \"github.com\/google\/uuid\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now your application depends on code from another project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That external code is a <strong>dependency<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go Modules manage:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Your application\n      |\n      | imports\n      v\ngithub.com\/google\/uuid\n      |\n      | particular version\n      v\n    v1.6.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The version of that dependency is recorded in your project&#8217;s <code>go.mod<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. What \/ Why \/ When \/ How \/ Where<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Question<\/th><th>Simple answer<\/th><\/tr><\/thead><tbody><tr><td><strong>What?<\/strong><\/td><td>Go Modules are Go&#8217;s dependency-management system.<\/td><\/tr><tr><td><strong>Why?<\/strong><\/td><td>To track external libraries and their versions reliably.<\/td><\/tr><tr><td><strong>When?<\/strong><\/td><td>For practically every normal Go project that contains packages or external dependencies.<\/td><\/tr><tr><td><strong>How?<\/strong><\/td><td>Start with <code>go mod init<\/code>, add\/use dependencies, and maintain them with commands such as <code>go get<\/code> and <code>go mod tidy<\/code>.<\/td><\/tr><tr><td><strong>Where?<\/strong><\/td><td>Dependency information lives mainly in <code>go.mod<\/code> and <code>go.sum<\/code> at the module root.<\/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\">3. The three things to remember<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Think of a Go project like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go-mod-demo\/\n\u2502\n\u251c\u2500\u2500 go.mod\n\u251c\u2500\u2500 go.sum\n\u2514\u2500\u2500 main.go<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><code>main.go<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your actual Go source code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>go.mod<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Describes your module and records required module versions. (<a href=\"https:\/\/go.dev\/doc\/modules\/gomod-ref?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>module example.com\/go-mod-demo\n\ngo 1.xx\n\nrequire github.com\/google\/uuid v1.6.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t worry about the exact <code>go<\/code> version shown there; Go writes the appropriate value for your environment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>go.sum<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Contains cryptographic hashes associated with downloaded module dependencies so Go can verify dependency content. (<a href=\"https:\/\/go.dev\/doc\/modules\/managing-source?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You normally <strong>do not manually edit <code>go.sum<\/code><\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Complete example \u2014 UUID generator<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This is the only example you need for understanding the basic workflow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We will build:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Go Program\n    |\n    | import\n    v\ngithub.com\/google\/uuid\n    |\n    v\nGenerate UUID<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The example uses <code>github.com\/google\/uuid<\/code> version <code>v1.6.0<\/code>. That version provides <code>uuid.NewString()<\/code>. (<a href=\"https:\/\/chromium.googlesource.com\/external\/github.com\/google\/uuid\/%2B\/refs\/tags\/v1.6.0?utm_source=chatgpt.com\">Chromium Git Repositories<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1 \u2014 Create the project<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir go-mod-demo\ncd go-mod-demo<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2 \u2014 Initialize a Go module<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod init example.com\/go-mod-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should now have:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go-mod-demo\/\n\u2514\u2500\u2500 go.mod<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod init example.com\/go-mod-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod init\n\u2502   \u2502   \u2502\n\u2502   \u2502   \u2514\u2500\u2500 Name\/path of our module\n\u2502   \u2502\n\u2502   \u2514\u2500\u2500\u2500\u2500\u2500\u2500 Initialize\n\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Go command<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>go mod init<\/code> creates a new <code>go.mod<\/code> in the current directory and establishes that directory as the module root. (<a href=\"https:\/\/go.dev\/ref\/mod?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 3 \u2014 Create <code>main.go<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create this file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport (\n\t\"fmt\"\n\n\t\/\/ This package comes from an external Go module.\n\t\"github.com\/google\/uuid\"\n)\n\nfunc main() {\n\t\/\/ uuid.NewString() comes from the external dependency.\n\tid := uuid.NewString()\n\n\tfmt.Println(\"Generated UUID:\", id)\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the complete application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Notice this line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"github.com\/google\/uuid\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your application is saying:<\/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;I need the <code>uuid<\/code> package.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">But Go still needs to know <strong>which module version<\/strong> should provide it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 4 \u2014 Add the dependency<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go get github.com\/google\/uuid@v1.6.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now look at your folder:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go-mod-demo\/\n\u2502\n\u251c\u2500\u2500 go.mod\n\u251c\u2500\u2500 go.sum\n\u2514\u2500\u2500 main.go<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And <code>go.mod<\/code> will contain a requirement for the dependency:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>require github.com\/google\/uuid v1.6.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The important connection is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main.go\n   |\n   | import \"github.com\/google\/uuid\"\n   |\n   v\ngo.mod\n   |\n   | require github.com\/google\/uuid v1.6.0\n   |\n   v\nGo downloads dependency<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>go get<\/code> is one of Go&#8217;s standard ways to add or change a dependency version recorded for the module. (<a href=\"https:\/\/go.dev\/doc\/modules\/managing-dependencies?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 5 \u2014 Run the application<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>go run .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example output:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Generated UUID: 550e8400-e29b-41d4-a716-446655440000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your actual UUID will be different.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You have now successfully used an external Go dependency.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Step 6 \u2014 Clean the dependencies<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod tidy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is a very useful command.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It essentially asks 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;Look at my source code and make sure <code>go.mod<\/code> and <code>go.sum<\/code> match what the project really needs.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><code>go mod tidy<\/code> adds missing module requirements, removes requirements that are no longer needed, and updates relevant <code>go.sum<\/code> entries. (<a href=\"https:\/\/go.dev\/doc\/modules\/managing-dependencies?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A good habit is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod tidy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">after adding or removing imports.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. The complete workflow<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>flowchart TD\n    A&#91;\"Create Project\"] --&gt; B&#91;\"go mod init\"]\n    B --&gt; C&#91;\"go.mod created\"]\n    C --&gt; D&#91;\"Write Go code\"]\n    D --&gt; E&#91;\"Import external package\"]\n    E --&gt; F&#91;\"go get dependency@version\"]\n    F --&gt; G&#91;\"go.mod \/ go.sum updated\"]\n    G --&gt; H&#91;\"go run .\"]\n    H --&gt; I&#91;\"go mod tidy\"]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or remember it simply as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE PROJECT\n      \u2193\ngo mod init\n      \u2193\nWRITE CODE\n      \u2193\nimport dependency\n      \u2193\ngo get dependency\n      \u2193\ngo run .\n      \u2193\ngo mod tidy<\/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. Understanding <code>go.mod<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Your file might conceptually look like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>module example.com\/go-mod-demo\n\ngo 1.xx\n\nrequire github.com\/google\/uuid v1.6.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s decode it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>module<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>module example.com\/go-mod-demo<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is the identity\/path of <strong>your module<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>module = my project's module name<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><code>go<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>go 1.xx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This records the Go language\/module compatibility version associated with the module.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For now, let the Go tools manage it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><code>require<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>require github.com\/google\/uuid v1.6.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Means:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>My project requires\n\ngithub.com\/google\/uuid\n\nat selected version\n\nv1.6.0<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Module vs Package<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This distinction confuses many Go beginners.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They are <strong>not the same thing<\/strong>.<\/p>\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>Collection of one or more related Go packages<\/td><td>Go source code in a directory<\/td><\/tr><tr><td>Has a <code>go.mod<\/code> at its root<\/td><td>Declared with <code>package xyz<\/code><\/td><\/tr><tr><td>Used for dependency\/version management<\/td><td>Used for organizing and importing Go code<\/td><\/tr><tr><td>Example: <code>github.com\/google\/uuid<\/code> module<\/td><td>Example: the <code>uuid<\/code> package you import<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Simple mental model:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Module\n\u2502\n\u251c\u2500\u2500 Package A\n\u251c\u2500\u2500 Package B\n\u2514\u2500\u2500 Package C<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A dependency is normally managed at the <strong>module level<\/strong>, even though your code imports <strong>packages<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. <code>go.mod<\/code> vs <code>go.sum<\/code><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><code>go.mod<\/code><\/th><th><code>go.sum<\/code><\/th><\/tr><\/thead><tbody><tr><td>Describes your module<\/td><td>Contains dependency verification hashes<\/td><\/tr><tr><td>Records required module versions<\/td><td>Helps verify downloaded module content<\/td><\/tr><tr><td>Human-readable dependency configuration<\/td><td>Mostly maintained automatically<\/td><\/tr><tr><td>Important to commit to Git<\/td><td>Normally committed to Git too<\/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>go.mod\n\"What dependencies should I use?\"\n\ngo.sum\n\"Can I verify the dependency content I downloaded?\"<\/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. Important commands compared<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>Purpose<\/th><th>When you use it<\/th><\/tr><\/thead><tbody><tr><td><code>go mod init<\/code><\/td><td>Create a new module<\/td><td>At project creation<\/td><\/tr><tr><td><code>go get package@version<\/code><\/td><td>Add\/change a dependency<\/td><td>When adding or changing dependencies<\/td><\/tr><tr><td><code>go mod tidy<\/code><\/td><td>Synchronize dependency files with source code<\/td><td>After dependency\/import changes<\/td><\/tr><tr><td><code>go run .<\/code><\/td><td>Compile and run the current package<\/td><td>During development<\/td><\/tr><tr><td><code>go build<\/code><\/td><td>Compile your project<\/td><td>When you want a binary\/build check<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The three module commands worth memorizing first are:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod init\ngo get\ngo mod tidy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Everything else can come later.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. What happens if you remove the dependency?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Suppose you change <code>main.go<\/code> to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"Hello\")\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">There is no longer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import \"github.com\/google\/uuid\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod tidy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Go sees:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Source code\n    |\n    X  no UUID import\n    |\ngo.mod<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and can remove the now-unneeded UUID module requirement. This source-driven synchronization is exactly what <code>go mod tidy<\/code> is designed to do. (<a href=\"https:\/\/go.dev\/doc\/modules\/managing-dependencies?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Direct vs indirect dependencies<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You may eventually see:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>require (\n    github.com\/google\/uuid v1.6.0\n    example.com\/something v1.2.3 \/\/ indirect\n)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t let this confuse you.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Direct<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your code directly imports it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import \"github.com\/google\/uuid\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>YOUR PROGRAM\n     \u2193\n    UUID<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Indirect<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your dependency needs another module:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>YOUR PROGRAM\n     \u2193\nDependency A\n     \u2193\nDependency B<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dependency B can appear as:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ indirect<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">An indirect requirement indicates that the main module does not directly import a package from that module, though it is needed through the dependency graph. (<a href=\"https:\/\/go.dev\/ref\/mod?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For now:<\/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>Don&#8217;t manually manage <code>\/\/ indirect<\/code>. Let Go do it.<\/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\">12. One golden rule<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t 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\">&#8220;I need to manually maintain a big dependency file.&#8221;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Instead think:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Write imports\n      \u2193\nGo examines your code\n      \u2193\nGo manages module requirements\n      \u2193\ngo.mod + go.sum<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use the Go commands instead of manually editing dependency information unless you have a specific reason to do otherwise. The official Go documentation also recommends managing dependencies through Go commands so that <code>go.mod<\/code> stays consistent. (<a href=\"https:\/\/go.dev\/doc\/modules\/gomod-ref?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Your everyday workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For a <strong>new project<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir myapp\ncd myapp\n\ngo mod init example.com\/myapp<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Write code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you need a dependency:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go get dependency@version<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go run .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And periodically:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>go mod tidy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s enough for learning Go Modules initially.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Final cheat sheet<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>You want to&#8230;<\/th><th>Use<\/th><\/tr><\/thead><tbody><tr><td>Start dependency management<\/td><td><code>go mod init<\/code><\/td><\/tr><tr><td>Add\/change a dependency<\/td><td><code>go get<\/code><\/td><\/tr><tr><td>Clean dependency information<\/td><td><code>go mod tidy<\/code><\/td><\/tr><tr><td>See your dependencies<\/td><td>Open <code>go.mod<\/code><\/td><\/tr><tr><td>Understand integrity information<\/td><td>Look at <code>go.sum<\/code><\/td><\/tr><tr><td>Use a dependency in code<\/td><td><code>import \"...\"<\/code><\/td><\/tr><tr><td>Run the program<\/td><td><code>go run .<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Remember this sentence<\/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><code>main.go<\/code> uses packages \u2192 <code>go.mod<\/code> tracks required modules\/versions \u2192 <code>go.sum<\/code> helps verify downloaded dependency content \u2192 <code>go mod tidy<\/code> keeps everything synchronized.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If that sentence makes sense, you understand the <strong>core of dependency management using Go Modules<\/strong>. (<a href=\"https:\/\/go.dev\/doc\/modules\/managing-dependencies?utm_source=chatgpt.com\">Go.dev<\/a>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Go Modules become much easier once you keep one mental model in mind: Your Go source code says what packages you use. go.mod says which modules\/versions provide&#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-1086","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1086","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=1086"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1086\/revisions"}],"predecessor-version":[{"id":1087,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1086\/revisions\/1087"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}