{"id":14669,"date":"2024-03-15T09:43:01","date_gmt":"2024-03-15T09:43:01","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/"},"modified":"2025-08-06T11:51:10","modified_gmt":"2025-08-06T11:51:10","slug":"how-can-the-option-design-pattern-be-implemented-in-the-go-language","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/","title":{"rendered":"Go Option Pattern Implementation Guide"},"content":{"rendered":"<p>In Go language, you can use the Function Option design pattern to implement the Option pattern.<\/p>\n<p>The function option design pattern is a way to use optional parameters in function calls. It allows for more flexibility in function calls by selectively passing parameters based on the needs without the need for numerous overloaded functions or parameter combinations.<\/p>\n<p>The key to implementing the option design pattern with functions is to use variadic parameters and function types. By defining an Option type as a function type that accepts a parameter and modifies it as needed.<\/p>\n<p>Below is a simple example demonstrating how to implement the function options design pattern in the Go language.<\/p>\n<pre class=\"post-pre\"><code><span class=\"hljs-keyword\">package<\/span> main\r\n\r\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-string\">\"fmt\"<\/span>\r\n\r\n<span class=\"hljs-keyword\">type<\/span> Options <span class=\"hljs-keyword\">struct<\/span> {\r\n\tName   <span class=\"hljs-type\">string<\/span>\r\n\tAge    <span class=\"hljs-type\">int<\/span>\r\n\tHeight <span class=\"hljs-type\">float64<\/span>\r\n}\r\n\r\n<span class=\"hljs-keyword\">type<\/span> Option <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">(*Options)<\/span><\/span>\r\n\r\n<span class=\"hljs-comment\">\/\/ \u8bbe\u7f6e\u59d3\u540d<\/span>\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">WithName<\/span><span class=\"hljs-params\">(name <span class=\"hljs-type\">string<\/span>)<\/span><\/span> Option {\r\n\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">(opt *Options)<\/span><\/span> {\r\n\t\topt.Name = name\r\n\t}\r\n}\r\n\r\n<span class=\"hljs-comment\">\/\/ \u8bbe\u7f6e\u5e74\u9f84<\/span>\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">WithAge<\/span><span class=\"hljs-params\">(age <span class=\"hljs-type\">int<\/span>)<\/span><\/span> Option {\r\n\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">(opt *Options)<\/span><\/span> {\r\n\t\topt.Age = age\r\n\t}\r\n}\r\n\r\n<span class=\"hljs-comment\">\/\/ \u8bbe\u7f6e\u8eab\u9ad8<\/span>\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">WithHeight<\/span><span class=\"hljs-params\">(height <span class=\"hljs-type\">float64<\/span>)<\/span><\/span> Option {\r\n\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span><span class=\"hljs-params\">(opt *Options)<\/span><\/span> {\r\n\t\topt.Height = height\r\n\t}\r\n}\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">NewOptions<\/span><span class=\"hljs-params\">(opts ...Option)<\/span><\/span> *Options {\r\n\topt := &amp;Options{}\r\n\t<span class=\"hljs-keyword\">for<\/span> _, o := <span class=\"hljs-keyword\">range<\/span> opts {\r\n\t\to(opt)\r\n\t}\r\n\t<span class=\"hljs-keyword\">return<\/span> opt\r\n}\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">func<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">()<\/span><\/span> {\r\n\t<span class=\"hljs-comment\">\/\/ \u4f7f\u7528\u9ed8\u8ba4\u53c2\u6570\u521b\u5efaOptions\u5bf9\u8c61<\/span>\r\n\topt1 := NewOptions()\r\n\tfmt.Println(opt1)  <span class=\"hljs-comment\">\/\/ &amp;{ 0 0}<\/span>\r\n\r\n\t<span class=\"hljs-comment\">\/\/ \u4f7f\u7528WithName\u51fd\u6570\u9009\u9879\u521b\u5efaOptions\u5bf9\u8c61<\/span>\r\n\topt2 := NewOptions(WithName(<span class=\"hljs-string\">\"Alice\"<\/span>))\r\n\tfmt.Println(opt2)  <span class=\"hljs-comment\">\/\/ &amp;{Alice 0 0}<\/span>\r\n\r\n\t<span class=\"hljs-comment\">\/\/ \u4f7f\u7528WithAge\u548cWithHeight\u51fd\u6570\u9009\u9879\u521b\u5efaOptions\u5bf9\u8c61<\/span>\r\n\topt3 := NewOptions(WithAge(<span class=\"hljs-number\">18<\/span>), WithHeight(<span class=\"hljs-number\">1.65<\/span>))\r\n\tfmt.Println(opt3)  <span class=\"hljs-comment\">\/\/ &amp;{ 18 1.65}<\/span>\r\n}\r\n<\/code><\/pre>\n<p>In the example above, we have defined an Options type and three Option functions: WithName, WithAge, and WithHeight.<\/p>\n<p>Each option function returns a function that takes an Options pointer as a parameter and can modify the corresponding fields of the Options object.<\/p>\n<p>The NewOptions function takes a variable number of Option types as parameters, modifies the Options object based on the passed Option functions, and returns the modified Options object.<\/p>\n<p>By utilizing the function options design pattern, we can selectively pass parameters as needed, making the code more flexible and easily expandable.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Go language, you can use the Function Option design pattern to implement the Option pattern. The function option design pattern is a way to use optional parameters in function calls. It allows for more flexibility in function calls by selectively passing parameters based on the needs without the need for numerous overloaded functions or [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[10307,19820,4228,4095,19819],"class_list":["post-14669","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-design-patterns","tag-functional-options","tag-go","tag-go-programming","tag-option-pattern"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Go Option Pattern Implementation Guide - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"Implement Go&#039;s Option design pattern for cleaner APIs. Learn functional options to handle flexible parameters elegantly.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go Option Pattern Implementation Guide\" \/>\n<meta property=\"og:description\" content=\"Implement Go&#039;s Option design pattern for cleaner APIs. Learn functional options to handle flexible parameters elegantly.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-15T09:43:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-06T11:51:10+00:00\" \/>\n<meta name=\"author\" content=\"Liam\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:site\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Liam\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/\"},\"author\":{\"name\":\"Liam\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671\"},\"headline\":\"Go Option Pattern Implementation Guide\",\"datePublished\":\"2024-03-15T09:43:01+00:00\",\"dateModified\":\"2025-08-06T11:51:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/\"},\"wordCount\":208,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"keywords\":[\"Design Patterns\",\"Functional Options\",\"Go\",\"Go programming\",\"Option Pattern\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/\",\"name\":\"Go Option Pattern Implementation Guide - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2024-03-15T09:43:01+00:00\",\"dateModified\":\"2025-08-06T11:51:10+00:00\",\"description\":\"Implement Go's Option design pattern for cleaner APIs. Learn functional options to handle flexible parameters elegantly.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go Option Pattern Implementation Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"name\":\"Silicon Cloud Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\",\"name\":\"Silicon Cloud Blog\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"contentUrl\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"width\":1024,\"height\":1024,\"caption\":\"Silicon Cloud Blog\"},\"image\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\",\"https:\/\/twitter.com\/SiliCloudGlobal\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671\",\"name\":\"Liam\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g\",\"caption\":\"Liam\"},\"sameAs\":[\"http:\/\/Wilson\"],\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/liamwilson\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Go Option Pattern Implementation Guide - Blog - Silicon Cloud","description":"Implement Go's Option design pattern for cleaner APIs. Learn functional options to handle flexible parameters elegantly.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/","og_locale":"en_US","og_type":"article","og_title":"Go Option Pattern Implementation Guide","og_description":"Implement Go's Option design pattern for cleaner APIs. Learn functional options to handle flexible parameters elegantly.","og_url":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2024-03-15T09:43:01+00:00","article_modified_time":"2025-08-06T11:51:10+00:00","author":"Liam","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Liam","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/"},"author":{"name":"Liam","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671"},"headline":"Go Option Pattern Implementation Guide","datePublished":"2024-03-15T09:43:01+00:00","dateModified":"2025-08-06T11:51:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/"},"wordCount":208,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"keywords":["Design Patterns","Functional Options","Go","Go programming","Option Pattern"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/","url":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/","name":"Go Option Pattern Implementation Guide - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2024-03-15T09:43:01+00:00","dateModified":"2025-08-06T11:51:10+00:00","description":"Implement Go's Option design pattern for cleaner APIs. Learn functional options to handle flexible parameters elegantly.","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/how-can-the-option-design-pattern-be-implemented-in-the-go-language\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go Option Pattern Implementation Guide"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/blog\/#website","url":"https:\/\/www.silicloud.com\/blog\/","name":"Silicon Cloud Blog","description":"","publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.silicloud.com\/blog\/#organization","name":"Silicon Cloud Blog","url":"https:\/\/www.silicloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","contentUrl":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","width":1024,"height":1024,"caption":"Silicon Cloud Blog"},"image":{"@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SiliCloudGlobal\/","https:\/\/twitter.com\/SiliCloudGlobal"]},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/23786905eb7b377f45ddb01c17da7671","name":"Liam","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8d37ed3e7f770dde8bf069ba0b4298688028c3abaacf1131742fc1352d174ebd?s=96&d=mm&r=g","caption":"Liam"},"sameAs":["http:\/\/Wilson"],"url":"https:\/\/www.silicloud.com\/blog\/author\/liamwilson\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/14669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=14669"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/14669\/revisions"}],"predecessor-version":[{"id":158707,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/14669\/revisions\/158707"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=14669"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=14669"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=14669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}