[{"data":1,"prerenderedAt":2310},["ShallowReactive",2],{"navigation_docs":3,"-sdks-openfeature-go":239,"-sdks-openfeature-go-surround":2304},[4,51,73,224],{"title":5,"icon":6,"modifiedAt":7,"path":8,"stem":9,"children":10,"page":6},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[11,16,21,26,31,36,41,46],{"title":12,"path":13,"stem":14,"icon":15},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":17,"path":18,"stem":19,"icon":20},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":22,"path":23,"stem":24,"icon":25},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":27,"path":28,"stem":29,"icon":30},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":32,"path":33,"stem":34,"icon":35},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":37,"path":38,"stem":39,"icon":40},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":42,"path":43,"stem":44,"icon":45},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F7.segments","i-lucide-squares-intersect",{"title":47,"path":48,"stem":49,"icon":50},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F8.pricing-and-billing","i-lucide-credit-card",{"title":52,"modifiedAt":53,"defaultOpen":54,"path":55,"stem":56,"children":57,"page":6},"Monitoring","2026-09-24T23:33:20.000Z",true,"\u002Fmonitoring","2.monitoring",[58,63,68],{"title":59,"path":60,"stem":61,"icon":62},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":64,"path":65,"stem":66,"icon":67},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":69,"path":70,"stem":71,"icon":72},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":74,"modifiedAt":53,"defaultOpen":54,"path":75,"stem":76,"children":77,"page":6},"SDKs","\u002Fsdks","3.sdks",[78,83,104,129,145,176,219],{"title":79,"path":80,"stem":81,"icon":82},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":84,"modifiedAt":53,"icon":85,"defaultOpen":6,"path":86,"stem":87,"children":88,"page":6},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[89,94,99],{"title":90,"path":91,"stem":92,"icon":93},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":95,"path":96,"stem":97,"icon":98},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":100,"path":101,"stem":102,"icon":103},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":105,"modifiedAt":53,"icon":106,"defaultOpen":6,"path":107,"stem":108,"children":109,"page":6},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[110,114,119,124],{"title":111,"path":112,"stem":113,"icon":98},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":115,"path":116,"stem":117,"icon":118},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":120,"path":121,"stem":122,"icon":123},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":125,"path":126,"stem":127,"icon":128},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":130,"modifiedAt":53,"icon":131,"defaultOpen":6,"path":132,"stem":133,"children":134,"page":6},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[135,140],{"title":136,"path":137,"stem":138,"icon":139},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":141,"path":142,"stem":143,"icon":144},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":146,"modifiedAt":53,"icon":147,"defaultOpen":6,"path":148,"stem":149,"children":150,"page":6},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[151,156,161,166,171],{"title":152,"path":153,"stem":154,"icon":155},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":157,"path":158,"stem":159,"icon":160},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":162,"path":163,"stem":164,"icon":165},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":167,"path":168,"stem":169,"icon":170},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":172,"path":173,"stem":174,"icon":175},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":177,"modifiedAt":53,"icon":178,"defaultOpen":6,"path":179,"stem":180,"children":181,"page":6},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature",[182,187,191,195,199,203,207,211,215],{"title":183,"path":184,"stem":185,"icon":178,"icons":186},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[178,93],{"title":120,"path":188,"stem":189,"icon":178,"icons":190},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[178,123],{"title":125,"path":192,"stem":193,"icon":178,"icons":194},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[178,128],{"title":115,"path":196,"stem":197,"icon":178,"icons":198},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[178,118],{"title":152,"path":200,"stem":201,"icon":178,"icons":202},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[178,155],{"title":157,"path":204,"stem":205,"icon":178,"icons":206},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[178,160],{"title":162,"path":208,"stem":209,"icon":178,"icons":210},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[178,165],{"title":167,"path":212,"stem":213,"icon":178,"icons":214},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[178,170],{"title":172,"path":216,"stem":217,"icon":178,"icons":218},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[178,175],{"title":220,"path":221,"stem":222,"icon":223},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":225,"modifiedAt":53,"defaultOpen":54,"path":226,"stem":227,"children":228,"page":6},"Integrations","\u002Fintegrations","4.integrations",[229,234],{"title":230,"path":231,"stem":232,"icon":233},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F1.terraform","cd-logos-terraform",{"title":235,"path":236,"stem":237,"icon":238},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F2.mcp","cd-logos-mcp",{"id":240,"title":241,"body":242,"description":2295,"extension":2296,"links":2297,"meta":2298,"navigation":2300,"path":216,"seo":2302,"stem":217,"__hash__":2303},"docs\u002F3.sdks\u002F6.openfeature\u002F9.go.md","OpenFeature Go Provider",{"type":243,"value":244,"toc":2281},"minimark",[245,249,255,260,277,284,287,291,301,308,335,339,356,659,663,676,681,688,695,793,821,825,828,845,849,852,859,961,964,1024,1048,1144,1151,1155,1162,1245,1252,1348,1352,1355,1534,1537,1606,1611,1615,1622,1723,1733,1737,1744,1751,2256,2277],[246,247],"div",{"hidden":54,"dataTitleIcon":248},"openfeature-go",[250,251],"external-badges",{"package-url":252,"registry":253,"repo":254},"https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002FConfigDirector\u002Fgo-sdks\u002Fconfigdirector-openfeature","go","go-sdks\u002Ftree\u002Fmain\u002Fconfigdirector-openfeature",[256,257,259],"h2",{"id":258},"introduction","Introduction",[261,262,263,264,272,273,276],"p",{},"The OpenFeature Go Provider is intended to be used in combination with the ",[265,266,271],"a",{"href":267,"rel":268,"target":270},"https:\u002F\u002Fopenfeature.dev\u002Fdocs\u002Freference\u002Fsdks\u002Fserver\u002Fgo\u002F",[269],"noopener","_blank","OpenFeature Go SDK",". The provider wraps the ConfigDirector ",[265,274,275],{"href":173},"Go SDK",".",[261,278,279,280,276],{},"The minimum Go version supported is ",[281,282,283],"code",{},"1.26",[261,285,286],{},"The provider is safe to share between goroutines. Register one instance per process when your application starts, and shut OpenFeature down when it stops. Evaluations read config state the provider already holds in memory, so they make no network calls on the request path.",[256,288,290],{"id":289},"installation","Installation",[261,292,293,294,297,298],{},"The provider can be installed with ",[281,295,296],{},"go get",". Its package reference is on pkg.go.dev: ",[265,299,252],{"href":252,"rel":300,"target":270},[269],[261,302,303,304,307],{},"The OpenFeature Go SDK (",[281,305,306],{},"github.com\u002Fopen-feature\u002Fgo-sdk",") and the ConfigDirector Go SDK are included as dependencies.",[309,310,311],"code-group",{},[312,313,318],"pre",{"className":314,"code":315,"filename":296,"language":316,"meta":317,"style":317},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","go get github.com\u002FConfigDirector\u002Fgo-sdks\u002Fconfigdirector-openfeature@latest\n","bash","",[281,319,320],{"__ignoreMap":317},[321,322,325,328,332],"span",{"class":323,"line":324},"line",1,[321,326,253],{"class":327},"sbgvK",[321,329,331],{"class":330},"s_sjI"," get",[321,333,334],{"class":330}," github.com\u002FConfigDirector\u002Fgo-sdks\u002Fconfigdirector-openfeature@latest\n",[256,336,338],{"id":337},"configure-and-initialize-the-client","Configure and initialize the client",[340,341,342,350,353],"ol",{},[343,344,345,346,349],"li",{},"Create an instance of the provider using your server SDK key. You can retrieve a server SDK key for each environment under ",[281,347,348],{},"SDK Keys"," in the dashboard's navigation panel. The provider starts connecting as soon as it is created.",[343,351,352],{},"Set the OpenFeature provider.",[343,354,355],{},"Get a client instance from OpenFeature.",[312,357,361],{"className":358,"code":359,"filename":360,"language":253,"meta":317,"style":317},"language-go shiki shiki-themes material-theme-lighter github-light github-dark","import (\n    \"log\"\n\n    \"github.com\u002FConfigDirector\u002Fgo-sdks\u002Fconfigdirector\"\n    configdirectoropenfeature \"github.com\u002FConfigDirector\u002Fgo-sdks\u002Fconfigdirector-openfeature\"\n    \"github.com\u002Fopen-feature\u002Fgo-sdk\u002Fopenfeature\"\n)\n\n\u002F\u002F IMPORTANT: Do not commit the server SDK key to your source code, it is a secret value.\nprovider, err := configdirectoropenfeature.NewProvider(configdirector.Options{SDKKey: \"YOUR-SERVER-SDK-KEY\"})\nif err != nil {\n    log.Fatal(err)\n}\n\n\u002F\u002F Blocks until the provider is initialized or it times out.\n\u002F\u002F If initialization times out, the provider keeps connecting in the background.\nif err := openfeature.SetProviderAndWait(provider); err != nil {\n    log.Fatal(err)\n}\ndefer openfeature.Shutdown()\n\nclient := openfeature.NewClient(\"my-app\")\n","main.go",[281,362,363,373,386,392,402,417,427,433,438,445,501,519,537,543,548,554,560,592,607,612,628,633],{"__ignoreMap":317},[321,364,365,369],{"class":323,"line":324},[321,366,368],{"class":367},"sVHd0","import",[321,370,372],{"class":371},"sP7_E"," (\n",[321,374,376,380,383],{"class":323,"line":375},2,[321,377,379],{"class":378},"sjJ54","    \"",[321,381,382],{"class":327},"log",[321,384,385],{"class":378},"\"\n",[321,387,389],{"class":323,"line":388},3,[321,390,391],{"emptyLinePlaceholder":54},"\n",[321,393,395,397,400],{"class":323,"line":394},4,[321,396,379],{"class":378},[321,398,399],{"class":327},"github.com\u002FConfigDirector\u002Fgo-sdks\u002Fconfigdirector",[321,401,385],{"class":378},[321,403,405,409,412,415],{"class":323,"line":404},5,[321,406,408],{"class":407},"su5hD","    configdirectoropenfeature ",[321,410,411],{"class":378},"\"",[321,413,414],{"class":327},"github.com\u002FConfigDirector\u002Fgo-sdks\u002Fconfigdirector-openfeature",[321,416,385],{"class":378},[321,418,420,422,425],{"class":323,"line":419},6,[321,421,379],{"class":378},[321,423,424],{"class":327},"github.com\u002Fopen-feature\u002Fgo-sdk\u002Fopenfeature",[321,426,385],{"class":378},[321,428,430],{"class":323,"line":429},7,[321,431,432],{"class":371},")\n",[321,434,436],{"class":323,"line":435},8,[321,437,391],{"emptyLinePlaceholder":54},[321,439,441],{"class":323,"line":440},9,[321,442,444],{"class":443},"sutJx","\u002F\u002F IMPORTANT: Do not commit the server SDK key to your source code, it is a secret value.\n",[321,446,448,451,454,457,461,464,466,470,473,476,478,481,484,487,490,493,496,498],{"class":323,"line":447},10,[321,449,450],{"class":407},"provider",[321,452,453],{"class":371},",",[321,455,456],{"class":407}," err ",[321,458,460],{"class":459},"smGrS",":=",[321,462,463],{"class":407}," configdirectoropenfeature",[321,465,276],{"class":371},[321,467,469],{"class":468},"sGLFI","NewProvider",[321,471,472],{"class":371},"(",[321,474,475],{"class":327},"configdirector",[321,477,276],{"class":371},[321,479,480],{"class":327},"Options",[321,482,483],{"class":371},"{",[321,485,486],{"class":407},"SDKKey",[321,488,489],{"class":371},":",[321,491,492],{"class":378}," \"",[321,494,495],{"class":330},"YOUR-SERVER-SDK-KEY",[321,497,411],{"class":378},[321,499,500],{"class":371},"})\n",[321,502,504,507,509,512,516],{"class":323,"line":503},11,[321,505,506],{"class":367},"if",[321,508,456],{"class":407},[321,510,511],{"class":459},"!=",[321,513,515],{"class":514},"s39Yj"," nil",[321,517,518],{"class":371}," {\n",[321,520,522,525,527,530,532,535],{"class":323,"line":521},12,[321,523,524],{"class":407},"    log",[321,526,276],{"class":371},[321,528,529],{"class":468},"Fatal",[321,531,472],{"class":371},[321,533,534],{"class":407},"err",[321,536,432],{"class":371},[321,538,540],{"class":323,"line":539},13,[321,541,542],{"class":371},"}\n",[321,544,546],{"class":323,"line":545},14,[321,547,391],{"emptyLinePlaceholder":54},[321,549,551],{"class":323,"line":550},15,[321,552,553],{"class":443},"\u002F\u002F Blocks until the provider is initialized or it times out.\n",[321,555,557],{"class":323,"line":556},16,[321,558,559],{"class":443},"\u002F\u002F If initialization times out, the provider keeps connecting in the background.\n",[321,561,563,565,567,569,572,574,577,579,581,584,586,588,590],{"class":323,"line":562},17,[321,564,506],{"class":367},[321,566,456],{"class":407},[321,568,460],{"class":459},[321,570,571],{"class":407}," openfeature",[321,573,276],{"class":371},[321,575,576],{"class":468},"SetProviderAndWait",[321,578,472],{"class":371},[321,580,450],{"class":407},[321,582,583],{"class":371},");",[321,585,456],{"class":407},[321,587,511],{"class":459},[321,589,515],{"class":514},[321,591,518],{"class":371},[321,593,595,597,599,601,603,605],{"class":323,"line":594},18,[321,596,524],{"class":407},[321,598,276],{"class":371},[321,600,529],{"class":468},[321,602,472],{"class":371},[321,604,534],{"class":407},[321,606,432],{"class":371},[321,608,610],{"class":323,"line":609},19,[321,611,542],{"class":371},[321,613,615,618,620,622,625],{"class":323,"line":614},20,[321,616,617],{"class":367},"defer",[321,619,571],{"class":407},[321,621,276],{"class":371},[321,623,624],{"class":468},"Shutdown",[321,626,627],{"class":371},"()\n",[321,629,631],{"class":323,"line":630},21,[321,632,391],{"emptyLinePlaceholder":54},[321,634,636,639,641,643,645,648,650,652,655,657],{"class":323,"line":635},22,[321,637,638],{"class":407},"client ",[321,640,460],{"class":459},[321,642,571],{"class":407},[321,644,276],{"class":371},[321,646,647],{"class":468},"NewClient",[321,649,472],{"class":371},[321,651,411],{"class":378},[321,653,654],{"class":330},"my-app",[321,656,411],{"class":378},[321,658,432],{"class":371},[660,661,662],"warning",{},"Server SDK keys are secret values. Do not commit them to your source code repository. Provide them at runtime via environment variables instead.",[261,664,665,667,668,671,672,675],{},[281,666,576],{}," blocks until the initial config state arrives or the configured timeout elapses, and it does not return an error on a connection failure. Until config state arrives, evaluations return the in-code default value with the ",[281,669,670],{},"PROVIDER_NOT_READY"," error code, and the provider continues to connect in the background. ",[281,673,674],{},"SetProviderWithContextAndWait"," takes a context that abandons the wait when it ends.",[677,678,680],"h3",{"id":679},"additional-configuration-options","Additional configuration options",[261,682,683,684,687],{},"The provider takes the same ",[281,685,686],{},"configdirector.Options"," as the Go SDK client, so every option of the SDK is available on the provider.",[261,689,690,691,694],{},"For example, the ",[281,692,693],{},"Metadata"," can be provided like this:",[312,696,698],{"className":358,"code":697,"filename":360,"language":253,"meta":317,"style":317},"provider, err := configdirectoropenfeature.NewProvider(configdirector.Options{\n    SDKKey:   \"YOUR-SERVER-SDK-KEY\",\n    Metadata: configdirector.Metadata{AppName: \"YOUR-APP-NAME\", AppVersion: \"1.0.2\"},\n})\n",[281,699,700,727,744,789],{"__ignoreMap":317},[321,701,702,704,706,708,710,712,714,716,718,720,722,724],{"class":323,"line":324},[321,703,450],{"class":407},[321,705,453],{"class":371},[321,707,456],{"class":407},[321,709,460],{"class":459},[321,711,463],{"class":407},[321,713,276],{"class":371},[321,715,469],{"class":468},[321,717,472],{"class":371},[321,719,475],{"class":327},[321,721,276],{"class":371},[321,723,480],{"class":327},[321,725,726],{"class":371},"{\n",[321,728,729,732,734,737,739,741],{"class":323,"line":375},[321,730,731],{"class":407},"    SDKKey",[321,733,489],{"class":371},[321,735,736],{"class":378},"   \"",[321,738,495],{"class":330},[321,740,411],{"class":378},[321,742,743],{"class":371},",\n",[321,745,746,749,751,754,756,758,760,763,765,767,770,772,774,777,779,781,784,786],{"class":323,"line":388},[321,747,748],{"class":407},"    Metadata",[321,750,489],{"class":371},[321,752,753],{"class":327}," configdirector",[321,755,276],{"class":371},[321,757,693],{"class":327},[321,759,483],{"class":371},[321,761,762],{"class":407},"AppName",[321,764,489],{"class":371},[321,766,492],{"class":378},[321,768,769],{"class":330},"YOUR-APP-NAME",[321,771,411],{"class":378},[321,773,453],{"class":371},[321,775,776],{"class":407}," AppVersion",[321,778,489],{"class":371},[321,780,492],{"class":378},[321,782,783],{"class":330},"1.0.2",[321,785,411],{"class":378},[321,787,788],{"class":371},"},\n",[321,790,791],{"class":323,"line":394},[321,792,500],{"class":371},[261,794,795,796,798,799,798,802,798,805,808,809,812,813,817,818,820],{},"The provider accepts the same ",[281,797,693],{},", ",[281,800,801],{},"Logger",[281,803,804],{},"Connection",[281,806,807],{},"Telemetry"," and ",[281,810,811],{},"Hooks"," options as the Go SDK client, ",[265,814,816],{"href":815},"\u002Fsdks\u002Fserver\u002Fgo#additional-configuration-options","refer to the additional configuration options section of the Go SDK for a full list",". Handlers in ",[281,819,811],{}," run after the provider's own.",[677,822,824],{"id":823},"shut-down","Shut down",[261,826,827],{},"Shutting OpenFeature down closes the provider, which closes its connections and reports any pending telemetry:",[312,829,831],{"className":358,"code":830,"filename":360,"language":253,"meta":317,"style":317},"defer openfeature.Shutdown()\n",[281,832,833],{"__ignoreMap":317},[321,834,835,837,839,841,843],{"class":323,"line":324},[321,836,617],{"class":367},[321,838,571],{"class":407},[321,840,276],{"class":371},[321,842,624],{"class":468},[321,844,627],{"class":371},[256,846,848],{"id":847},"retrieve-config-values","Retrieve config values",[261,850,851],{},"To retrieve config values, use the OpenFeature client:",[261,853,854,855,858],{},"Every getter takes a ",[281,856,857],{},"context.Context"," first, such as the request's context in an HTTP handler, and the evaluation context last:",[312,860,862],{"className":358,"code":861,"filename":360,"language":253,"meta":317,"style":317},"booleanValue := client.Boolean(ctx, \"my-config-key\", false, openfeature.EvaluationContext{})\n\nstringValue := client.String(ctx, \"my-string-config-key\", \"Default\", openfeature.EvaluationContext{})\n",[281,863,864,911,915],{"__ignoreMap":317},[321,865,866,869,871,874,876,879,881,884,886,888,891,893,895,899,901,903,905,908],{"class":323,"line":324},[321,867,868],{"class":407},"booleanValue ",[321,870,460],{"class":459},[321,872,873],{"class":407}," client",[321,875,276],{"class":371},[321,877,878],{"class":468},"Boolean",[321,880,472],{"class":371},[321,882,883],{"class":407},"ctx",[321,885,453],{"class":371},[321,887,492],{"class":378},[321,889,890],{"class":330},"my-config-key",[321,892,411],{"class":378},[321,894,453],{"class":371},[321,896,898],{"class":897},"syTEX"," false",[321,900,453],{"class":371},[321,902,571],{"class":327},[321,904,276],{"class":371},[321,906,907],{"class":327},"EvaluationContext",[321,909,910],{"class":371},"{})\n",[321,912,913],{"class":323,"line":375},[321,914,391],{"emptyLinePlaceholder":54},[321,916,917,920,922,924,926,929,931,933,935,937,940,942,944,946,949,951,953,955,957,959],{"class":323,"line":388},[321,918,919],{"class":407},"stringValue ",[321,921,460],{"class":459},[321,923,873],{"class":407},[321,925,276],{"class":371},[321,927,928],{"class":468},"String",[321,930,472],{"class":371},[321,932,883],{"class":407},[321,934,453],{"class":371},[321,936,492],{"class":378},[321,938,939],{"class":330},"my-string-config-key",[321,941,411],{"class":378},[321,943,453],{"class":371},[321,945,492],{"class":378},[321,947,948],{"class":330},"Default",[321,950,411],{"class":378},[321,952,453],{"class":371},[321,954,571],{"class":327},[321,956,276],{"class":371},[321,958,907],{"class":327},[321,960,910],{"class":371},[261,962,963],{},"Each OpenFeature getter maps to a ConfigDirector config type:",[965,966,967,980],"table",{},[968,969,970],"thead",{},[971,972,973,977],"tr",{},[974,975,976],"th",{},"OpenFeature getter",[974,978,979],{},"ConfigDirector config value",[981,982,983,992,1001,1014],"tbody",{},[971,984,985,990],{},[986,987,988],"td",{},[281,989,878],{},[986,991,878],{},[971,993,994,998],{},[986,995,996],{},[281,997,928],{},[986,999,1000],{},"String or enum",[971,1002,1003,1011],{},[986,1004,1005,798,1008],{},[281,1006,1007],{},"Int",[281,1009,1010],{},"Float",[986,1012,1013],{},"Number",[971,1015,1016,1021],{},[986,1017,1018],{},[281,1019,1020],{},"Object",[986,1022,1023],{},"JSON object or JSON array",[261,1025,1026,1028,1029,1032,1033,1036,1037,1040,1041,1044,1045,489],{},[281,1027,1020],{}," returns the JSON document decoded the way ",[281,1030,1031],{},"encoding\u002Fjson"," decodes into an ",[281,1034,1035],{},"any",": a JSON object is a ",[281,1038,1039],{},"map[string]any",", a JSON array a ",[281,1042,1043],{},"[]any",", and a number a ",[281,1046,1047],{},"float64",[312,1049,1051],{"className":358,"code":1050,"filename":360,"language":253,"meta":317,"style":317},"settings := client.Object(ctx, \"my-json-config-key\", map[string]any{}, openfeature.EvaluationContext{})\ntheme := settings.(map[string]any)[\"theme\"]\n",[281,1052,1053,1107],{"__ignoreMap":317},[321,1054,1055,1058,1060,1062,1064,1066,1068,1070,1072,1074,1077,1079,1081,1084,1087,1091,1094,1096,1099,1101,1103,1105],{"class":323,"line":324},[321,1056,1057],{"class":407},"settings ",[321,1059,460],{"class":459},[321,1061,873],{"class":407},[321,1063,276],{"class":371},[321,1065,1020],{"class":468},[321,1067,472],{"class":371},[321,1069,883],{"class":407},[321,1071,453],{"class":371},[321,1073,492],{"class":378},[321,1075,1076],{"class":330},"my-json-config-key",[321,1078,411],{"class":378},[321,1080,453],{"class":371},[321,1082,1083],{"class":459}," map",[321,1085,1086],{"class":371},"[",[321,1088,1090],{"class":1089},"sbsja","string",[321,1092,1093],{"class":371},"]",[321,1095,1035],{"class":327},[321,1097,1098],{"class":371},"{},",[321,1100,571],{"class":327},[321,1102,276],{"class":371},[321,1104,907],{"class":327},[321,1106,910],{"class":371},[321,1108,1109,1112,1114,1117,1120,1123,1125,1127,1129,1131,1134,1136,1139,1141],{"class":323,"line":375},[321,1110,1111],{"class":407},"theme ",[321,1113,460],{"class":459},[321,1115,1116],{"class":407}," settings",[321,1118,1119],{"class":371},".(",[321,1121,1122],{"class":459},"map",[321,1124,1086],{"class":371},[321,1126,1090],{"class":1089},[321,1128,1093],{"class":371},[321,1130,1035],{"class":327},[321,1132,1133],{"class":371},")[",[321,1135,411],{"class":378},[321,1137,1138],{"class":330},"theme",[321,1140,411],{"class":378},[321,1142,1143],{"class":371},"]\n",[261,1145,1146,1147,276],{},"For additional information regarding the OpenFeature client ",[265,1148,1150],{"href":267,"rel":1149,"target":270},[269],"refer to the OpenFeature Go SDK documentation",[677,1152,1154],{"id":1153},"evaluation-details","Evaluation details",[261,1156,1157,1158,1161],{},"The detailed getters of the OpenFeature client, such as ",[281,1159,1160],{},"BooleanValueDetails",", report why an evaluation produced the value that it did:",[965,1163,1164,1177],{},[968,1165,1166],{},[971,1167,1168,1171,1174],{},[974,1169,1170],{},"Outcome",[974,1172,1173],{},"Reason",[974,1175,1176],{},"Error code",[981,1178,1179,1191,1203,1218,1231],{},[971,1180,1181,1184,1189],{},[986,1182,1183],{},"A value was found",[986,1185,1186],{},[281,1187,1188],{},"TARGETING_MATCH",[986,1190],{},[971,1192,1193,1196,1201],{},[986,1194,1195],{},"The config carries no value",[986,1197,1198],{},[281,1199,1200],{},"DEFAULT",[986,1202],{},[971,1204,1205,1208,1213],{},[986,1206,1207],{},"The config key is unknown",[986,1209,1210],{},[281,1211,1212],{},"ERROR",[986,1214,1215],{},[281,1216,1217],{},"FLAG_NOT_FOUND",[971,1219,1220,1223,1227],{},[986,1221,1222],{},"No config state has arrived yet",[986,1224,1225],{},[281,1226,1212],{},[986,1228,1229],{},[281,1230,670],{},[971,1232,1233,1236,1240],{},[986,1234,1235],{},"The value does not match the requested type",[986,1237,1238],{},[281,1239,1212],{},[986,1241,1242],{},[281,1243,1244],{},"TYPE_MISMATCH",[261,1246,1247,1248,1251],{},"When a value was found, the ",[281,1249,1250],{},"Variant"," is ConfigDirector's identifier for that value. In every other case the in-code default value is returned.",[312,1253,1255],{"className":358,"code":1254,"filename":360,"language":253,"meta":317,"style":317},"details, err := client.BooleanValueDetails(ctx, \"new-checkout\", false, user)\nif err != nil {\n    log.Printf(\"new-checkout fell back to its in-code default value: %s\", details.ErrorCode)\n}\n",[281,1256,1257,1298,1310,1344],{"__ignoreMap":317},[321,1258,1259,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1285,1287,1289,1291,1293,1296],{"class":323,"line":324},[321,1260,1261],{"class":407},"details",[321,1263,453],{"class":371},[321,1265,456],{"class":407},[321,1267,460],{"class":459},[321,1269,873],{"class":407},[321,1271,276],{"class":371},[321,1273,1160],{"class":468},[321,1275,472],{"class":371},[321,1277,883],{"class":407},[321,1279,453],{"class":371},[321,1281,492],{"class":378},[321,1283,1284],{"class":330},"new-checkout",[321,1286,411],{"class":378},[321,1288,453],{"class":371},[321,1290,898],{"class":897},[321,1292,453],{"class":371},[321,1294,1295],{"class":407}," user",[321,1297,432],{"class":371},[321,1299,1300,1302,1304,1306,1308],{"class":323,"line":375},[321,1301,506],{"class":367},[321,1303,456],{"class":407},[321,1305,511],{"class":459},[321,1307,515],{"class":514},[321,1309,518],{"class":371},[321,1311,1312,1314,1316,1319,1321,1323,1326,1330,1332,1334,1337,1339,1342],{"class":323,"line":388},[321,1313,524],{"class":407},[321,1315,276],{"class":371},[321,1317,1318],{"class":468},"Printf",[321,1320,472],{"class":371},[321,1322,411],{"class":378},[321,1324,1325],{"class":330},"new-checkout fell back to its in-code default value: ",[321,1327,1329],{"class":1328},"swQdS","%s",[321,1331,411],{"class":378},[321,1333,453],{"class":371},[321,1335,1336],{"class":407}," details",[321,1338,276],{"class":371},[321,1340,1341],{"class":407},"ErrorCode",[321,1343,432],{"class":371},[321,1345,1346],{"class":323,"line":394},[321,1347,542],{"class":371},[256,1349,1351],{"id":1350},"user-context","User context",[261,1353,1354],{},"The user context is the last argument of every getter of the OpenFeature client. The OpenFeature Go provider evaluates targeting rules locally without additional network calls for different contexts.",[312,1356,1358],{"className":358,"code":1357,"filename":360,"language":253,"meta":317,"style":317},"import \"github.com\u002Fopen-feature\u002Fgo-sdk\u002Fopenfeature\"\n\nuser := openfeature.NewEvaluationContext(\n    \"12345\", \u002F\u002F In OpenFeature, the targeting key represents the context's user ID\n    map[string]any{\n        \"name\": \"Example User\",\n        \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n        \"traits\": map[string]any{\"region\": \"North America\"},\n    },\n)\n\nbooleanValue := client.Boolean(ctx, \"my-config-key\", false, user)\n",[281,1359,1360,1370,1374,1391,1405,1420,1441,1446,1487,1492,1496,1500],{"__ignoreMap":317},[321,1361,1362,1364,1366,1368],{"class":323,"line":324},[321,1363,368],{"class":367},[321,1365,492],{"class":378},[321,1367,424],{"class":327},[321,1369,385],{"class":378},[321,1371,1372],{"class":323,"line":375},[321,1373,391],{"emptyLinePlaceholder":54},[321,1375,1376,1379,1381,1383,1385,1388],{"class":323,"line":388},[321,1377,1378],{"class":407},"user ",[321,1380,460],{"class":459},[321,1382,571],{"class":407},[321,1384,276],{"class":371},[321,1386,1387],{"class":468},"NewEvaluationContext",[321,1389,1390],{"class":371},"(\n",[321,1392,1393,1395,1398,1400,1402],{"class":323,"line":394},[321,1394,379],{"class":378},[321,1396,1397],{"class":330},"12345",[321,1399,411],{"class":378},[321,1401,453],{"class":371},[321,1403,1404],{"class":443}," \u002F\u002F In OpenFeature, the targeting key represents the context's user ID\n",[321,1406,1407,1410,1412,1414,1416,1418],{"class":323,"line":404},[321,1408,1409],{"class":459},"    map",[321,1411,1086],{"class":371},[321,1413,1090],{"class":1089},[321,1415,1093],{"class":371},[321,1417,1035],{"class":327},[321,1419,726],{"class":371},[321,1421,1422,1425,1428,1430,1432,1434,1437,1439],{"class":323,"line":419},[321,1423,1424],{"class":378},"        \"",[321,1426,1427],{"class":330},"name",[321,1429,411],{"class":378},[321,1431,489],{"class":371},[321,1433,492],{"class":378},[321,1435,1436],{"class":330},"Example User",[321,1438,411],{"class":378},[321,1440,743],{"class":371},[321,1442,1443],{"class":323,"line":429},[321,1444,1445],{"class":443},"        \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n",[321,1447,1448,1450,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1474,1476,1478,1480,1483,1485],{"class":323,"line":435},[321,1449,1424],{"class":378},[321,1451,1452],{"class":330},"traits",[321,1454,411],{"class":378},[321,1456,489],{"class":371},[321,1458,1083],{"class":459},[321,1460,1086],{"class":371},[321,1462,1090],{"class":1089},[321,1464,1093],{"class":371},[321,1466,1035],{"class":327},[321,1468,483],{"class":371},[321,1470,411],{"class":378},[321,1472,1473],{"class":330},"region",[321,1475,411],{"class":378},[321,1477,489],{"class":371},[321,1479,492],{"class":378},[321,1481,1482],{"class":330},"North America",[321,1484,411],{"class":378},[321,1486,788],{"class":371},[321,1488,1489],{"class":323,"line":440},[321,1490,1491],{"class":371},"    },\n",[321,1493,1494],{"class":323,"line":447},[321,1495,432],{"class":371},[321,1497,1498],{"class":323,"line":503},[321,1499,391],{"emptyLinePlaceholder":54},[321,1501,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1530,1532],{"class":323,"line":521},[321,1503,868],{"class":407},[321,1505,460],{"class":459},[321,1507,873],{"class":407},[321,1509,276],{"class":371},[321,1511,878],{"class":468},[321,1513,472],{"class":371},[321,1515,883],{"class":407},[321,1517,453],{"class":371},[321,1519,492],{"class":378},[321,1521,890],{"class":330},[321,1523,411],{"class":378},[321,1525,453],{"class":371},[321,1527,898],{"class":897},[321,1529,453],{"class":371},[321,1531,1295],{"class":407},[321,1533,432],{"class":371},[261,1535,1536],{},"The evaluation context maps onto the ConfigDirector user context as follows:",[965,1538,1539,1549],{},[968,1540,1541],{},[971,1542,1543,1546],{},[974,1544,1545],{},"OpenFeature evaluation context",[974,1547,1548],{},"ConfigDirector user context",[981,1550,1551,1565,1577,1591],{},[971,1552,1553,1560],{},[986,1554,1555,1556,1559],{},"The targeting key, or otherwise an ",[281,1557,1558],{},"id"," attribute",[986,1561,1562],{},[281,1563,1564],{},"ID",[971,1566,1567,1572],{},[986,1568,1569,1570,1559],{},"The ",[281,1571,1427],{},[986,1573,1574],{},[281,1575,1576],{},"Name",[971,1578,1579,1586],{},[986,1580,1569,1581,1583,1584],{},[281,1582,1452],{}," attribute, a ",[281,1585,1039],{},[986,1587,1588],{},[281,1589,1590],{},"Traits",[971,1592,1593,1601],{},[986,1594,1569,1595,1583,1598],{},[281,1596,1597],{},"anonymous",[281,1599,1600],{},"bool",[986,1602,1603],{},[281,1604,1605],{},"Anonymous",[261,1607,1146,1608,276],{},[265,1609,1150],{"href":267,"rel":1610,"target":270},[269],[256,1612,1614],{"id":1613},"events","Events",[261,1616,1617,1618,1621],{},"The provider emits ",[281,1619,1620],{},"PROVIDER_CONFIGURATION_CHANGED"," whenever configs are updated on the dashboard or via the admin API, carrying the keys of the configs in the update followed by the keys of the configs it removed:",[312,1623,1625],{"className":358,"code":1624,"filename":360,"language":253,"meta":317,"style":317},"logChangedFlags := func(details openfeature.EventDetails) {\n    log.Printf(\"Configs updated: %v\", details.FlagChanges)\n}\n\nclient.AddHandler(openfeature.ProviderConfigChange, &logChangedFlags)\n",[281,1626,1627,1654,1685,1689,1693],{"__ignoreMap":317},[321,1628,1629,1632,1634,1637,1639,1642,1644,1646,1649,1652],{"class":323,"line":324},[321,1630,1631],{"class":407},"logChangedFlags ",[321,1633,460],{"class":459},[321,1635,1636],{"class":459}," func",[321,1638,472],{"class":371},[321,1640,1261],{"class":1641},"s99_P",[321,1643,571],{"class":327},[321,1645,276],{"class":371},[321,1647,1648],{"class":327},"EventDetails",[321,1650,1651],{"class":371},")",[321,1653,518],{"class":371},[321,1655,1656,1658,1660,1662,1664,1666,1669,1672,1674,1676,1678,1680,1683],{"class":323,"line":375},[321,1657,524],{"class":407},[321,1659,276],{"class":371},[321,1661,1318],{"class":468},[321,1663,472],{"class":371},[321,1665,411],{"class":378},[321,1667,1668],{"class":330},"Configs updated: ",[321,1670,1671],{"class":1328},"%v",[321,1673,411],{"class":378},[321,1675,453],{"class":371},[321,1677,1336],{"class":407},[321,1679,276],{"class":371},[321,1681,1682],{"class":407},"FlagChanges",[321,1684,432],{"class":371},[321,1686,1687],{"class":323,"line":388},[321,1688,542],{"class":371},[321,1690,1691],{"class":323,"line":394},[321,1692,391],{"emptyLinePlaceholder":54},[321,1694,1695,1698,1700,1703,1705,1708,1710,1713,1715,1718,1721],{"class":323,"line":404},[321,1696,1697],{"class":407},"client",[321,1699,276],{"class":371},[321,1701,1702],{"class":468},"AddHandler",[321,1704,472],{"class":371},[321,1706,1707],{"class":407},"openfeature",[321,1709,276],{"class":371},[321,1711,1712],{"class":407},"ProviderConfigChange",[321,1714,453],{"class":371},[321,1716,1717],{"class":459}," &",[321,1719,1720],{"class":407},"logChangedFlags",[321,1722,432],{"class":371},[261,1724,1725,1726,1729,1730,1732],{},"It emits ",[281,1727,1728],{},"PROVIDER_READY"," when the initial config state arrives after ",[281,1731,576],{}," has already returned.",[256,1734,1736],{"id":1735},"test-your-code","Test your code",[261,1738,1739,1740,1743],{},"Code that reads flags through OpenFeature is tested by swapping the provider, so it never has to change for a test and nothing from ConfigDirector is involved. The OpenFeature Go SDK ships an in-memory provider for that, ",[281,1741,1742],{},"memprovider",", which serves the values your test sets.",[261,1745,1746,1747,1750],{},"Each flag is an ",[281,1748,1749],{},"InMemoryFlag"," with its named variants and the name of the variant it resolves to:",[312,1752,1755],{"className":358,"code":1753,"filename":1754,"language":253,"meta":317,"style":317},"import (\n    \"testing\"\n\n    \"github.com\u002Fopen-feature\u002Fgo-sdk\u002Fopenfeature\"\n    \"github.com\u002Fopen-feature\u002Fgo-sdk\u002Fopenfeature\u002Fmemprovider\"\n    \"github.com\u002Fstretchr\u002Ftestify\u002Frequire\"\n)\n\nfunc TestShowsTheNewCheckout(t *testing.T) {\n    provider := memprovider.NewInMemoryProvider(map[string]memprovider.InMemoryFlag{\n        \"new-checkout\": {Key: \"new-checkout\", State: memprovider.Enabled, DefaultVariant: \"on\", Variants: map[string]any{\"on\": true, \"off\": false}},\n        \"max-items\":    {Key: \"max-items\", State: memprovider.Enabled, DefaultVariant: \"default\", Variants: map[string]any{\"default\": int64(20)}},\n    })\n    require.NoError(t, openfeature.SetProviderAndWait(provider))\n    t.Cleanup(openfeature.Shutdown)\n    client := openfeature.NewClient(\"checkout\")\n\n    require.True(t, client.Boolean(t.Context(), \"new-checkout\", false, openfeature.EvaluationContext{}))\n    require.Equal(t, int64(20), client.Int(t.Context(), \"max-items\", 0, openfeature.EvaluationContext{}))\n}\n","checkout_test.go",[281,1756,1757,1763,1772,1776,1784,1793,1802,1806,1810,1837,1870,1968,2055,2060,2089,2109,2133,2137,2191,2252],{"__ignoreMap":317},[321,1758,1759,1761],{"class":323,"line":324},[321,1760,368],{"class":367},[321,1762,372],{"class":371},[321,1764,1765,1767,1770],{"class":323,"line":375},[321,1766,379],{"class":378},[321,1768,1769],{"class":327},"testing",[321,1771,385],{"class":378},[321,1773,1774],{"class":323,"line":388},[321,1775,391],{"emptyLinePlaceholder":54},[321,1777,1778,1780,1782],{"class":323,"line":394},[321,1779,379],{"class":378},[321,1781,424],{"class":327},[321,1783,385],{"class":378},[321,1785,1786,1788,1791],{"class":323,"line":404},[321,1787,379],{"class":378},[321,1789,1790],{"class":327},"github.com\u002Fopen-feature\u002Fgo-sdk\u002Fopenfeature\u002Fmemprovider",[321,1792,385],{"class":378},[321,1794,1795,1797,1800],{"class":323,"line":419},[321,1796,379],{"class":378},[321,1798,1799],{"class":327},"github.com\u002Fstretchr\u002Ftestify\u002Frequire",[321,1801,385],{"class":378},[321,1803,1804],{"class":323,"line":429},[321,1805,432],{"class":371},[321,1807,1808],{"class":323,"line":435},[321,1809,391],{"emptyLinePlaceholder":54},[321,1811,1812,1815,1818,1820,1823,1826,1828,1830,1833,1835],{"class":323,"line":440},[321,1813,1814],{"class":459},"func",[321,1816,1817],{"class":468}," TestShowsTheNewCheckout",[321,1819,472],{"class":371},[321,1821,1822],{"class":1641},"t",[321,1824,1825],{"class":459}," *",[321,1827,1769],{"class":327},[321,1829,276],{"class":371},[321,1831,1832],{"class":327},"T",[321,1834,1651],{"class":371},[321,1836,518],{"class":371},[321,1838,1839,1842,1844,1847,1849,1852,1854,1856,1858,1860,1862,1864,1866,1868],{"class":323,"line":447},[321,1840,1841],{"class":407},"    provider ",[321,1843,460],{"class":459},[321,1845,1846],{"class":407}," memprovider",[321,1848,276],{"class":371},[321,1850,1851],{"class":468},"NewInMemoryProvider",[321,1853,472],{"class":371},[321,1855,1122],{"class":459},[321,1857,1086],{"class":371},[321,1859,1090],{"class":1089},[321,1861,1093],{"class":371},[321,1863,1742],{"class":327},[321,1865,276],{"class":371},[321,1867,1749],{"class":327},[321,1869,726],{"class":371},[321,1871,1872,1874,1876,1878,1880,1883,1886,1888,1890,1892,1894,1896,1899,1901,1903,1905,1908,1910,1913,1915,1917,1920,1922,1924,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1952,1954,1956,1959,1961,1963,1965],{"class":323,"line":503},[321,1873,1424],{"class":378},[321,1875,1284],{"class":330},[321,1877,411],{"class":378},[321,1879,489],{"class":371},[321,1881,1882],{"class":371}," {",[321,1884,1885],{"class":407},"Key",[321,1887,489],{"class":371},[321,1889,492],{"class":378},[321,1891,1284],{"class":330},[321,1893,411],{"class":378},[321,1895,453],{"class":371},[321,1897,1898],{"class":407}," State",[321,1900,489],{"class":371},[321,1902,1846],{"class":407},[321,1904,276],{"class":371},[321,1906,1907],{"class":407},"Enabled",[321,1909,453],{"class":371},[321,1911,1912],{"class":407}," DefaultVariant",[321,1914,489],{"class":371},[321,1916,492],{"class":378},[321,1918,1919],{"class":330},"on",[321,1921,411],{"class":378},[321,1923,453],{"class":371},[321,1925,1926],{"class":407}," Variants",[321,1928,489],{"class":371},[321,1930,1083],{"class":459},[321,1932,1086],{"class":371},[321,1934,1090],{"class":1089},[321,1936,1093],{"class":371},[321,1938,1035],{"class":327},[321,1940,483],{"class":371},[321,1942,411],{"class":378},[321,1944,1919],{"class":330},[321,1946,411],{"class":378},[321,1948,489],{"class":371},[321,1950,1951],{"class":897}," true",[321,1953,453],{"class":371},[321,1955,492],{"class":378},[321,1957,1958],{"class":330},"off",[321,1960,411],{"class":378},[321,1962,489],{"class":371},[321,1964,898],{"class":897},[321,1966,1967],{"class":371},"}},\n",[321,1969,1970,1972,1975,1977,1979,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2015,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2046,2048,2052],{"class":323,"line":521},[321,1971,1424],{"class":378},[321,1973,1974],{"class":330},"max-items",[321,1976,411],{"class":378},[321,1978,489],{"class":371},[321,1980,1981],{"class":371},"    {",[321,1983,1885],{"class":407},[321,1985,489],{"class":371},[321,1987,492],{"class":378},[321,1989,1974],{"class":330},[321,1991,411],{"class":378},[321,1993,453],{"class":371},[321,1995,1898],{"class":407},[321,1997,489],{"class":371},[321,1999,1846],{"class":407},[321,2001,276],{"class":371},[321,2003,1907],{"class":407},[321,2005,453],{"class":371},[321,2007,1912],{"class":407},[321,2009,489],{"class":371},[321,2011,492],{"class":378},[321,2013,2014],{"class":330},"default",[321,2016,411],{"class":378},[321,2018,453],{"class":371},[321,2020,1926],{"class":407},[321,2022,489],{"class":371},[321,2024,1083],{"class":459},[321,2026,1086],{"class":371},[321,2028,1090],{"class":1089},[321,2030,1093],{"class":371},[321,2032,1035],{"class":327},[321,2034,483],{"class":371},[321,2036,411],{"class":378},[321,2038,2014],{"class":330},[321,2040,411],{"class":378},[321,2042,489],{"class":371},[321,2044,2045],{"class":1089}," int64",[321,2047,472],{"class":371},[321,2049,2051],{"class":2050},"srdBf","20",[321,2053,2054],{"class":371},")}},\n",[321,2056,2057],{"class":323,"line":539},[321,2058,2059],{"class":371},"    })\n",[321,2061,2062,2065,2067,2070,2072,2074,2076,2078,2080,2082,2084,2086],{"class":323,"line":545},[321,2063,2064],{"class":407},"    require",[321,2066,276],{"class":371},[321,2068,2069],{"class":468},"NoError",[321,2071,472],{"class":371},[321,2073,1822],{"class":407},[321,2075,453],{"class":371},[321,2077,571],{"class":407},[321,2079,276],{"class":371},[321,2081,576],{"class":468},[321,2083,472],{"class":371},[321,2085,450],{"class":407},[321,2087,2088],{"class":371},"))\n",[321,2090,2091,2094,2096,2099,2101,2103,2105,2107],{"class":323,"line":550},[321,2092,2093],{"class":407},"    t",[321,2095,276],{"class":371},[321,2097,2098],{"class":468},"Cleanup",[321,2100,472],{"class":371},[321,2102,1707],{"class":407},[321,2104,276],{"class":371},[321,2106,624],{"class":407},[321,2108,432],{"class":371},[321,2110,2111,2114,2116,2118,2120,2122,2124,2126,2129,2131],{"class":323,"line":556},[321,2112,2113],{"class":407},"    client ",[321,2115,460],{"class":459},[321,2117,571],{"class":407},[321,2119,276],{"class":371},[321,2121,647],{"class":468},[321,2123,472],{"class":371},[321,2125,411],{"class":378},[321,2127,2128],{"class":330},"checkout",[321,2130,411],{"class":378},[321,2132,432],{"class":371},[321,2134,2135],{"class":323,"line":562},[321,2136,391],{"emptyLinePlaceholder":54},[321,2138,2139,2141,2143,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2167,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188],{"class":323,"line":594},[321,2140,2064],{"class":407},[321,2142,276],{"class":371},[321,2144,2145],{"class":468},"True",[321,2147,472],{"class":371},[321,2149,1822],{"class":407},[321,2151,453],{"class":371},[321,2153,873],{"class":407},[321,2155,276],{"class":371},[321,2157,878],{"class":468},[321,2159,472],{"class":371},[321,2161,1822],{"class":407},[321,2163,276],{"class":371},[321,2165,2166],{"class":468},"Context",[321,2168,2169],{"class":371},"(),",[321,2171,492],{"class":378},[321,2173,1284],{"class":330},[321,2175,411],{"class":378},[321,2177,453],{"class":371},[321,2179,898],{"class":897},[321,2181,453],{"class":371},[321,2183,571],{"class":327},[321,2185,276],{"class":371},[321,2187,907],{"class":327},[321,2189,2190],{"class":371},"{}))\n",[321,2192,2193,2195,2197,2200,2202,2204,2206,2208,2210,2212,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2242,2244,2246,2248,2250],{"class":323,"line":609},[321,2194,2064],{"class":407},[321,2196,276],{"class":371},[321,2198,2199],{"class":468},"Equal",[321,2201,472],{"class":371},[321,2203,1822],{"class":407},[321,2205,453],{"class":371},[321,2207,2045],{"class":1089},[321,2209,472],{"class":371},[321,2211,2051],{"class":2050},[321,2213,2214],{"class":371},"),",[321,2216,873],{"class":407},[321,2218,276],{"class":371},[321,2220,1007],{"class":468},[321,2222,472],{"class":371},[321,2224,1822],{"class":407},[321,2226,276],{"class":371},[321,2228,2166],{"class":468},[321,2230,2169],{"class":371},[321,2232,492],{"class":378},[321,2234,1974],{"class":330},[321,2236,411],{"class":378},[321,2238,453],{"class":371},[321,2240,2241],{"class":2050}," 0",[321,2243,453],{"class":371},[321,2245,571],{"class":327},[321,2247,276],{"class":371},[321,2249,907],{"class":327},[321,2251,2190],{"class":371},[321,2253,2254],{"class":323,"line":614},[321,2255,542],{"class":371},[261,2257,2258,2259,2261,2262,2265,2266,2269,2270,2273,2274,2276],{},"The in-memory provider has no method to change a flag, so a test that changes a value mid-way sets a new provider with ",[281,2260,576],{},". A flag can also carry a ",[281,2263,2264],{},"ContextEvaluator",", a pointer to a function from the flag and the evaluation context to the value and its resolution details, for a test of code that targets specific users. The OpenFeature API is one global, so shut it down after each test with ",[281,2267,2268],{},"openfeature.Shutdown",", as the cleanup above does, which lets the next test register its own provider. The examples use ",[281,2271,2272],{},"require"," from the testify module; the standard ",[281,2275,1769],{}," package works just as well.",[2278,2279,2280],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .swQdS, html code.shiki .swQdS{--shiki-light:#E53935;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":317,"searchDepth":375,"depth":375,"links":2282},[2283,2284,2285,2289,2292,2293,2294],{"id":258,"depth":375,"text":259},{"id":289,"depth":375,"text":290},{"id":337,"depth":375,"text":338,"children":2286},[2287,2288],{"id":679,"depth":388,"text":680},{"id":823,"depth":388,"text":824},{"id":847,"depth":375,"text":848,"children":2290},[2291],{"id":1153,"depth":388,"text":1154},{"id":1350,"depth":375,"text":1351},{"id":1613,"depth":375,"text":1614},{"id":1735,"depth":375,"text":1736},"ConfigDirector Provider for the OpenFeature Go SDK","md",null,{"modifiedAt":2299},"2026-10-11T00:51:13.000Z",{"title":172,"icon":178,"icons":2301},[178,175],{"title":241,"description":2295},"Ws03PVk56mG9Vc6CIAfkv8eD2Be4wZUmhjH7bb2CMp0",[2305,2308],{"title":167,"path":212,"stem":213,"description":2306,"icon":178,"icons":2307,"children":-1},"ConfigDirector Provider for the OpenFeature .NET SDK",[178,170],{"title":220,"path":221,"stem":222,"description":2309,"icon":223,"children":-1},"Add the ConfigDirector Maven repository to a Gradle or Maven build to install the Android and Java SDKs, and verify the files it serves",1791697531375]