# Working with Go

Go-IPFS is the primary reference implementation of IPFS. It is a command-line application, but can also be used as a library in other Go programs.

For more about using Go-IPFS, see any of the following reference documents:

For more technical information about building, debugging or using the API, see:

If you plan to use Go-IPFS as a package in your own Go application, you can take any of three main approaches:

# Go CoreAPI

CoreAPI interfaces (opens new window) for go-ipfs. Package iface defines IPFS Core API, which is a set of interfaces used to interact with IPFS nodes.

# Go embedded client

Package coreapi (opens new window) provides direct access to the core commands in IPFS. If you are embedding IPFS directly in your Go program, this package is the public interface you should use to read and write files or otherwise control IPFS. This package is experimental and subject to change.

If you are running IPFS as a separate process, you should use go-ipfs-api to work with it via HTTP. As we finalize the interfaces in this embedded client, go-ipfs-api will transparently adopt them so you can use the same code with either package.

# Go HTTP clients

CoreAPI implementation using HTTP API (opens new window). This package is experimental and subject to change. For an old but stable Go HTTP client, use CoreAPI interfaces (opens new window).

# Hands-on examples

There are use-case examples in the ipfs/go-ipfs GitHub repository (opens new window). They're all self-contained projects that let your spin up and test environments quickly. Check them out → (opens new window).

A good starting place is the Use go-ipfs as a library to spawn a node and add a file (opens new window).