Является ли значение интерфейса Go целой переменной, которая реализует интерфейс? - PullRequest
0 голосов
/ 01 июня 2018

Новый для Go здесь.Я проходил тур по Го и наткнулся на одно слово, в котором я запутался, что это было.

Это 11-я страница раздела Метод здесь.В нем говорится: « значения интерфейса можно рассматривать как кортеж значения и конкретного типа

Насколько я понимаю, значение интерфейса является переменнойкоторый реализует этот интерфейс.Например:

type Animal interface {
    run()
}

type Cat struct { … }

func main() {
    kitty := Cat{ … }
}

func (c Cat) run() { … }

Является ли kitty значением интерфейса?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

«Значения интерфейса могут рассматриваться как кортеж значения и конкретного типа».-> Интерфейс просто заботится о том, реализует ли ваш тип методы, которые ему нужны.В его структуре данных хранятся две вещи: 1. Тип, который его реализует. 2. Значение (типа # 1)

Вот простой пример, чтобы дать вам представление о том, на что это похоже:

package main

import (
    "fmt"
    "reflect"
)

type Animal interface {
    run()
}

type Cat struct {
    a int
}

func main() {
    kitty := Cat{2}
    var anim Animal
    fmt.Println(kitty)
    kitty.run()
    anim = kitty //interface
    fmt.Println(anim)
    anim.run()
    t := reflect.TypeOf(anim)
    v := reflect.ValueOf(anim)
    fmt.Println(t.String())
    fmt.Println(v)

}

func (c Cat) run() {
    fmt.Println("Have fun")
}

Вывод:

{2}
Have fun
{2}
Have fun
main.Cat
{2}

https://play.golang.org/p/xeozR3VT-9J, хотя вам нужно будет прочитать больше и попробовать несколько примеров самостоятельно, чтобы лучше это понять.

0 голосов
/ 01 июня 2018

В вашем случае, поскольку вы использовали краткое объявление переменной для создания kitty, тип выводится из выражения в правой части, а тип kitty будет конкретным типом Cat.

Но поскольку тип Cat concrete (неинтерфейсный тип) реализует тип Animal interface , вы можете назначитьзначение Cat для переменной, тип которой Animal, как в этом примере:

kitty := Cat{}
var kitty2 Animal = kitty

«Реализует» с помощью спецификаций:

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

Значения интерфейса схематически содержат пару (значение; тип), являющуюся значением, хранящимся в них, и их конкретный тип..

Подробнее о внутренних интерфейсах читайте в блоге: The Go Blog: Законы отражения
И Структуры данных Go: Интерфейсы (Расс Кокс) .

Для ознакомления, зачем нужны интерфейсы или как / когда их использовать, см. Зачем нужны интерфейсы в Голанге?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...