Go. Как у экземпляра структуры получить доступ к методам самой структуры, но не к методам интерфейса?

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

Для дальнейшего объяснения, рассмотрим следующий пример:

package main

import "fmt"

type Data struct {
    value int
}

func (d Data) Method() {
    fmt.Println("Method called:", d.value)
}

type Interface interface {
    Method()
}

func main() {
    var d Interface = Data{value: 42}

    // Ошибка компиляции: d.Method undefined (type Interface has no field or method Method)
    d.Method()

    // Верный способ вызова:
    d.(Data).Method()
}

В приведенном примере, Data - это структура, содержащая поле value и метод Method, который выводит это поле. Interface - это интерфейс, который имеет один метод, такой же как у структуры Data.

В функции main, мы создаем переменную d типа Interface и присваиваем ей экземпляр структуры Data. Затем, мы пытаемся вызвать метод Method для переменной d (d.Method()), но получаем ошибку компиляции, потому что переменная d имеет тип Interface, которая не имеет метода Method.

Чтобы получить доступ к методу Method структуры Data, мы можем использовать оператор утверждения типа (type assertion), указав тип Data в скобках перед вызовом метода (d.(Data).Method()).

Таким образом, оператор утверждения типа позволяет нам явно указать тип структуры и получить доступ к методам самой структуры, игнорируя методы интерфейса.

Важно отметить, что использование оператора утверждения типа может вызывать панику во время выполнения, если переменная d не содержит экземпляр структуры Data. Поэтому, перед использованием оператора утверждения типа, рекомендуется проверять тип переменной с помощью оператора switch или функций type-switch.