O go-sdk avalia flags localmente, contra uma Configuration que ele mantém em cache no processo e atualiza num intervalo. Não existe ida-e-volta de rede no caminho quente da avaliação, e se a plataforma ficar brevemente inacessível, o SDK continua servindo a última Configuration boa conhecida em vez de falhar as avaliações. É o mesmo desenho que o js-sdk usa do lado Node.js, e os dois são verificados contra o mesmo fixture de bucketing, então um subject recebe a mesma variação não importa qual SDK avaliou.
Instalando e montando um client
go get github.com/rollfuse/go-sdk
import growthops "github.com/rollfuse/go-sdk"
client, err := growthops.NewClient(baseURL, credential)
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := client.Start(ctx); err != nil {
log.Printf("busca inicial de config não completou: %v", err)
}
NewClient recebe a URL base do seu Environment e uma Service Credential, criada na tela de Credentials do console, mostrada em texto plano exatamente uma vez. Start bloqueia até a primeira busca de Configuration ter sucesso ou o contexto passado terminar; um serviço que não pode se dar ao luxo de bloquear chama Start numa goroutine e depende da opção de fallback do Evaluate até a primeira busca chegar.
Avaliando uma flag
result, err := client.Evaluate(subjectKey, "checkout-redesign",
growthops.WithAttributes(map[string]string{"plan": "growth"}),
growthops.WithDefault(false),
)
if err != nil {
// erro de rede/config: result ainda carrega o valor de fallback
}
if result.Value == "true" {
// serve o novo checkout
}
Evaluate é síncrono e nunca faz uma chamada de rede sozinho: ele lê a Configuration em cache (protegida por uma troca atômica de ponteiro, então avaliações concorrentes vindas de várias goroutines nunca esperam num lock) e aplica a mesma lógica de match de regra e bucketing por percentual que a API e o js-sdk usam. Se nenhuma Configuration carregou ainda, ou a chave da flag não existe, Evaluate retorna o default que você passou, em vez de um erro que seu caminho de requisição precisaria tratar como caso especial.
Opções de configuração
NewClient aceita functional options pra tudo além do baseURL e credential obrigatórios: WithRefreshInterval, WithMaxConfigAge (o quanto uma Configuration em cache pode envelhecer antes das avaliações caírem pro default em vez de confiar nela), e callbacks (WithOnConfigRefreshed, WithOnConfigRefreshError) pra plugar a saúde da avaliação nos seus próprios logs ou métricas.
Reportando exposição
Uma avaliação com match de regra é enfileirada e reportada de forma assíncrona via POST /v1/exposure-events. Isso nunca bloqueia o Evaluate, e uma fila cheia descarta o item mais antigo em vez de gerar back-pressure no seu caminho de requisição. Chame client.Close() no shutdown pra dar flush no que estiver na fila antes do processo terminar.
Veja o repositório go-sdk pra referência completa da API, e o examples-go-prometheus pra um serviço executável conectando isso a um deploy real.