Interfaces are great, and easier to understand than Go's concurrency. Maybe the hardest part is getting the idea that neither interface nor implementing code need to know anything about the other.
Here's a fun experiment: dig through your codebase and find all the public methods, then look at the signatures and find the top 3-5 most common constructs. Now define an interface using those. Perhaps not very useful, but interesting to see. I bet a comprehensive audit of Go code in the wild (not including the standard libraries) would find a lot of types implementing something like this this:
type StringHandler interface {
Handle(string)
Parse(string)
Count() int
}