# Go SDK migration guide: v0.7 to v0.8

This guide will help you migrate your Inngest Go SDK from v0.7 to v0.8 by providing a summary of the breaking changes.

## High-level

A minimal Inngest app looks like this:

```go
import (
	"context"
	"net/http"

	"github.com/inngest/inngestgo"
)

func HighLevel() {
	client, err := inngestgo.NewClient(inngestgo.ClientOpts{AppID: "my-app"})
	if err != nil {
		panic(err)
	}

	_, err = inngestgo.CreateFunction(
		client,
		inngestgo.FunctionOpts{ID: "my-fn"},
		inngestgo.EventTrigger("my-event", nil),
		func(
			ctx context.Context,
			input inngestgo.Input[inngestgo.GenericEvent[any, any]],
		) (any, error) {
			return "Hello, world!", nil
		},
	)
	if err != nil {
		panic(err)
	}

	_ = http.ListenAndServe(":8080", client.Serve())
}
```

## `Client`

The `DefaultClient` was removed. You should now use the `NewClient` function to create a new client:

```go
client, err := inngestgo.NewClient(inngestgo.ClientOpts{AppID: "my-app"})
```

> **Warning:** AppID is now a required field. NewClient will return an error if it is not provided.

The removal of `DefaultClient` also means that `inngestgo.Send` and `inngestgo.SendMany` are no longer available. You should now use the `Client.Send` and `Client.SendMany` methods.

## `Handler`

The `Handler` was removed, along with `DefaultHandler` and the `NewHandler` function. The handler is predominately replaced by the `Client`, with `HandlerOpts` being replaced by `ClientOpts`.

## `CreateFunction`

`CreateFunction` now accepts a `Client` argument and returns an error. Calling `CreateFunction` automatically registers the function, obviating the `Handler.Register` method.

```go
_, err := inngestgo.CreateFunction(
	client,
	inngestgo.FunctionOpts{ID: "my-fn"},
	inngestgo.EventTrigger("my-event", nil),
	func(
		ctx context.Context,
		input inngestgo.Input[inngestgo.GenericEvent[any, any]],
	) (any, error) {
		return "Hello, world!", nil
	},
)
```

> **Warning:** ID is now a required field. CreateFunction will return an error if it is not provided.If you were previously only setting the Name field, you can use inngestgo.Slugify to generate the same ID we used internally.

If `inngestgo.CreateFunction` is called in a different package than `inngestgo.NewClient`, then you must use a side-effect import to include the function:

```go
import (
	"github.com/inngest/inngestgo"

	// Side-effect import to include functions declared in a different package.
	_ "github.com/myorg/myapp/fns"
)

func main() {
	client, err := inngestgo.NewClient(inngestgo.ClientOpts{AppID: "my-app"})

	// ...
}
```