пятница, 15 февраля 2019 г.

Go FAQ: Когда следует использовать указатель на интерфейс?

Почти никогда. Указатели на интерфейсные значения возникают только в редких, сложных ситуациях, связанных с маскировкой типа значения интерфейса для отложенной оценки.

Это распространенная ошибка - передать указатель на значение интерфейса в функцию, ожидающую интерфейс. Компилятор пожалуется на эту ошибку, но ситуация все еще может сбивать с толку, потому что иногда указатель необходим для удовлетворения интерфейса. Понимание того, что, хотя указатель на конкретный тип может удовлетворить интерфейс, за одним исключением указатель на интерфейс, никогда не сможет удовлетворить интерфейс.

Рассмотрим объявление переменной,

var w io.Writer

Функция печати fmt.Fprintf принимает в качестве первого аргумента значение, которое удовлетворяет io.Writer - то, что реализует канонический метод Write. Таким образом, мы можем написать

fmt.Fprintf(w, "hello, world\n")

Однако если мы передадим адрес w, программа не скомпилируется.

// Compile-time error (Ошибка компиляции).
fmt.Fprintf(&w, "hello, world\n") 

Единственным исключением является то, что любое значение, даже указатель на интерфейс, может быть назначено переменной пустого типа интерфейса (interface{}). Тем не менее, это почти наверняка ошибка, если значение является указателем на интерфейс; результат может сбивать с толку.


Читайте также:


Комментариев нет:

Отправить комментарий