Тип интерфейса в Go - это пара, содержащая базовый тип и значение. Когда вы создаете переменную интерфейса:
var w io.Writer
, она инициализируется нулевым значением, которое для интерфейсов равно nil
. Когда вы передаете это функции, которая ожидает io.Writer
, она передается как nil
.
Инициализация аналогична переменной указателя неинтерфейса:
var buf *bytes.Buffer
Здесь buf
равно nil
. Однако, когда вы передаете buf
функции, которая принимает io.Writer
, она должна быть передана как интерфейс. Go преобразует значение buf
в интерфейс, тип которого равен *bytes.Buffer
, а базовое значение - nil
. Однако сам этот интерфейс не nil
.