The Go SDK provides an OpenFeature-compatible server provider for Go applications. It evaluates flags over HTTP and does not support the Cloudflare Workers binding.
Install with go get:
go get github.com/cloudflare/flagship/sdks/goConfigure the provider with your Flagship app ID, Cloudflare account ID, and an API token with Flagship Evaluate permission.
package main
import (
"context"
"log"
flagship "github.com/cloudflare/flagship/sdks/go"
"github.com/open-feature/go-sdk/openfeature"
)
func main() {
ctx := context.Background()
provider, err := flagship.NewProvider(flagship.Options{
AppID: "<APP_ID>",
AccountID: "<ACCOUNT_ID>",
AuthToken: "<API_TOKEN>",
})
if err != nil {
log.Fatal(err)
}
if err := openfeature.SetProviderAndWait(provider); err != nil {
log.Fatal(err)
}
defer openfeature.Shutdown()
client := openfeature.NewDefaultClient()
evalCtx := openfeature.NewEvaluationContext("user-42", map[string]any{
"plan": "enterprise",
})
enabled, err := client.BooleanValue(ctx, "new-checkout", false, evalCtx)
if err != nil {
log.Fatal(err)
}
log.Println("new-checkout:", enabled)
}The Go SDK supports all OpenFeature server-side flag types.
enabled, _ := client.BooleanValue(ctx, "new-checkout", false, evalCtx)
variant, _ := client.StringValue(ctx, "homepage-hero", "control", evalCtx)
rate, _ := client.FloatValue(ctx, "sample-rate", 0.1, evalCtx)
limit, _ := client.IntValue(ctx, "upload-limit", 10, evalCtx)
config, _ := client.ObjectValue(ctx, "ui-config", map[string]any{"theme": "light"}, evalCtx)Use the *ValueDetails methods when you need reason, variant, metadata, or error codes.
The provider can cache evaluations to avoid a network round-trip for repeated flag/context pairs. Caching is off by default and enabled by setting CacheTTL:
provider, err := flagship.NewProvider(flagship.Options{
AppID: "<APP_ID>",
AccountID: "<ACCOUNT_ID>",
AuthToken: "<API_TOKEN>",
CacheTTL: 30 * time.Second, // values may be up to this stale
CacheMaxSize: 1000, // LRU-evicted beyond this many entries
})Each cache entry is keyed by flag key, flag type, and the full evaluation context, so distinct contexts never share a cached value. Cache hits resolve with reason == openfeature.CachedReason.
Disabled flags, errors, and type mismatches are never cached. Because freshness is TTL-based, a flag change in Flagship takes effect after the entry expires.
The cache is per-provider instance, guarded by a mutex for concurrent use, and cleared on Shutdown.
| Option | Description |
|---|---|
AppID |
Flagship app ID. |
AccountID |
Required with AppID. |
BaseURL |
Base URL override. Defaults to https://api.cloudflare.com. |
AuthToken |
Adds Authorization: Bearer <token> to each request. |
Headers |
Static headers. Explicit Authorization overrides AuthToken. |
HeadersFactory |
Dynamic per-request headers. Values override Headers and AuthToken. |
HTTPClient |
Custom HTTP client. |
Timeout |
Per-attempt timeout. Defaults to 5 seconds. |
Retries |
Retry attempts on transient errors. Defaults to 1 and is capped at 10. |
DisableRetries |
Disables retries when set to true. |
RetryDelay |
Delay between retries. Defaults to 1 second and is capped at 30 seconds. |
CacheTTL |
Enables in-memory response caching when greater than 0. Cached values may be up to this duration stale. |
CacheMaxSize |
Maximum number of cached entries. LRU-evicted beyond this limit. Defaults to 1000 when CacheTTL is set. |
Logging |
Enables debug and error logging. Off by default. |
Logger |
Optional slog-compatible logger. Uses the default slog logger when unset. |
Hooks |
Provider-level OpenFeature hooks. |
Context attributes are sent as URL query parameters. Supported values are strings, numeric types, booleans, and time.Time. nil values are skipped. Maps, slices, structs, and other complex values return INVALID_CONTEXT through OpenFeature and do not trigger an HTTP request.