---
title: "Task"
description: "Define a Tilebox workflow task that may be identifiable, executable, or both."
image: "https://tilebox.com/images/tilebox-docs-social-preview.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://tilebox.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Task

import { Fragment } from "astro/jsx-runtime";

import ApiReference from "@docs/components/ApiReference.astro";

```go
type Task interface{}
```

Base interface for Tilebox workflows [tasks](/docs/workflows/concepts/tasks).
It doesn't need to be identifiable or executable, but it can be both (see below).

## Methods

```go
Task.Execute(ctx context.Context) error
```

The entry point for the execution of the task.
If not defined, the task can't be registered with a runner but can still be submitted.

```go
Task.Identifier() TaskIdentifier
```

Provides a user-defined task identifier.
The identifier is used to uniquely identify the task and specify its version.
If not defined, the runner will generate an identifier for it using reflection.

## JSON-serializable task

```go
type SampleTask struct {
	Message      string
	Depth        int
	BranchFactor int
}
```

Optional task [input parameters](/docs/workflows/concepts/tasks#input-parameters), defined as struct fields.
Supported types are all types supported by [json.Marshal](https://pkg.go.dev/encoding/json#Marshal).

## Protobuf-serializable task

```go
type SampleTask struct {
	examplesv1.SpawnWorkflowTreeTask
}
```

Task can also be defined as a protobuf message.
An example using task protobuf messages can be found [here](https://github.com/tilebox/tilebox-go/tree/main/examples/sampleworkflow).

<h2 id="request-example">Usage example</h2>

```go
package helloworld

import (
	"context"
	"fmt"
	"github.com/tilebox/tilebox-go/workflows/v1"
)

type MyFirstTask struct{}

func (t *MyFirstTask) Execute(ctx context.Context) error {
	fmt.Println("Hello World!")
	return nil
}

func (t *MyFirstTask) Identifier() workflows.TaskIdentifier {
	return workflows.NewTaskIdentifier("tilebox.workflows.MyTask", "v3.2")
}

type MyFirstParameterizedTask struct {
	Name    string
	Greet   bool
	Data    map[string]string
}

func (t *MyFirstParameterizedTask) Execute(ctx context.Context) error {
	if t.Greet {
		fmt.Printf("Hello %s!\n", t.Name)
	}
	return nil
}
```

Source: https://tilebox.com/docs/api-reference/go/workflows/Task/index.mdx
