Temporal is a distributed, scalable, durable, and highly available orchestration engine used to execute asynchronous long-running business logic in a scalable and resilient way.
"Temporal Go SDK" is Temporal's framework for authoring workflows and activities using the Go language.
Clone this repo into the preferred location.
git clone https://github.com/temporalio/sdk-go.gitSee samples to get started.
Documentation is available here. You can also find the API documentation here.
If using Go version 1.21+ the Go SDK provides built in integration with the standard slog package.
package main import ( "log/slog" "os" "go.temporal.io/sdk/client" "go.temporal.io/sdk/log" "go.temporal.io/sdk/worker" ) func main() { clientOptions := client.Options{ Logger: log.NewStructuredLogger( slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ AddSource: true, Level: slog.LevelDebug, }))), } temporalClient, err := client.Dial(clientOptions) // ... }See contrib/tools/workflowcheck for a tool to detect non-determinism in Workflow Definitions.
We'd love your help in making the Temporal Go SDK great. Please review our contribution guidelines.
Go SDK version v1.26.0 switched from using https://github.com/gogo/protobuf to https://github.com/golang/protobuf. While this migration is mostly internal there are a few user visible changes to be aware of:
time.Timein proto structs will now be timestamppb.Timestamptime.Durationwill now be durationpb.Duration- V2-generated structs embed locks, so you cannot dereference them.
Proto enums will, when formatted to JSON, now be in SCREAMING_SNAKE_CASE rather than PascalCase. * If trying to deserialize old JSON with PascalCase to proto use go.temporal.io/api/temporalproto.
If users used Temporal proto types in their Workflows, such as for activity output, users may need to modify the default data converter to handle these payloads.
converter.NewProtoJSONPayloadConverterWithOptions(converter.ProtoJSONPayloadConverterOptions{ LegacyTemporalProtoCompat: true, }),While upgrading from Go SDK version < 1.26.0 to a version >= 1.26.0 users may want to also bias towards using proto binary to avoid any potential incompatibilities due to having clients serialize messages with incompatible proto/json format.
On clients running Go SDK < 1.26.0
converter.NewCompositeDataConverter( converter.NewNilPayloadConverter(), converter.NewByteSlicePayloadConverter(), converter.NewProtoPayloadConverter(), converter.NewProtoJSONPayloadConverterWithOptions(), converter.NewJSONPayloadConverter(), )On clients running Go SDK >= 1.26.0
converter.NewCompositeDataConverter( converter.NewNilPayloadConverter(), converter.NewByteSlicePayloadConverter(), converter.NewProtoPayloadConverter(), converter.NewProtoJSONPayloadConverterWithOptions(converter.ProtoJSONPayloadConverterOptions{ LegacyTemporalProtoCompat: true, }), converter.NewJSONPayloadConverter(), )Note: Payloads encoded with proto/binary will not be readable in the Temporal web UI.
MIT License, please see LICENSE for details.