# 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:
- Configuration reference (opens new window)
- Installing command completion (opens new window)
- Mounting IPFS with FUSE (opens new window)
- Installing plugins (opens new window)
For more technical information about building, debugging or using the API, see:
- Performance Debugging Guidelines (opens new window)
- IPFS API Implementation (opens new window)
- Connecting with Websockets (opens new window)
- Building on Windows (opens new window)
- Additional guides (opens new window)
If you plan to use Go-IPFS as a package in your own Go application, you can take any of three main approaches:
- Use Go-IPFS (opens new window) to run IPFS directly in your own process. See the CoreAPI constructor.
- Use Go-IPFS (opens new window) to communicate with an IPFS daemon in a separate process via its HTTP API (this is what Go-IPFS does if a daemon is already running). See the http client.
- Use other Go packages to communicate with the HTTP API directly. See the HTTP API reference.
# 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).