Зачем нужны интерфейсы в golang?
Сам искал ответа на этот вопрос. И вдохновившись примером с лампочками, таки разобрался)
Пусть тут полежит для потомковpackage main

import "fmt"

type LampDiode struct{}

func (l *LampDiode) ScrewOn() string {
	return "Lamp 1"
}

type LampIncandescent struct{}

func (l *LampIncandescent) ScrewOn() string {
	return "Lamp 2"
}

type Lamp interface {
	ScrewOn() string
}

func Chandelier(l Lamp) {
	fmt.Println(l.ScrewOn())
}

func main() {
	var l1 Lamp
	l1 = new(LampDiode)
	Chandelier(l1)

	var l2 Lamp
	l2 = new(LampIncandescent)
	Chandelier(l2)
}
Приведу пример из реальности: у тебя есть люстра, туда подходит множество лампочек (диодные, накаливания, галогенки, какие хочешь в общем...) и все это потому, что цоколь - идентичный.
Интерфейс дает возможность использовать разные реализации структур, но обладающие единым интерфейсом (немного тавтологии богу тавтологии).
---
Если бы все цоколи были разные: вам пришлось бы менять либо люстру, либо лампочки.
Если не использовать интерфейсы - вы не сможете использовать другие структуры, даже если они полностью идентичны.