Почему Type Alias ​​и Type ведут себя по-разному при вызове методов встроенного поля в Go? - PullRequest
1 голос
/ 29 марта 2019

go версия go1.11.2 linux / amd64

https://play.golang.org/p/kTvcsWkJeaZ

package main

type T1 struct {
}

func (T1) Hello(T1) {
}

type T2 struct {
    T1
}

func (T2) Hello(T2) {
}

type T3 T2
type T4 = T2

func main() {
    var v_T3 T3
    v_T3.Hello(v_T3)
    var v_T4 T4
    v_T4.Hello(v_T4)
}

prog.go:21:12: cannot use v_T3 (type T3) as type T1 in argument to v_T3.T1.Hello

строка 21: Я ожидаю вызова v_T3.Hello, но фактическийзвоните v_T3.T1.Hello

строка 23: все нормально

1 Ответ

1 голос
/ 29 марта 2019
type T4 = T2

Это дает дополнительное имя T4 существующему типу T2.Это не вводит новый тип.Другими словами, T2 и T4 всегда взаимозаменяемы.Это должно объяснить, почему вызов v_T4.Hello(v_T4) работает.Все следующие вызовы являются синонимами с точки зрения типов (но игнорируя, что v_T2 и v_T4 отличаются значения ):

var v_T2 T2
var v_T4 T4

v_T2.Hello(v_T2)
v_T2.Hello(v_T4)
v_T4.Hello(v_T2)
v_T4.Hello(v_T4)

type T3 T2

Это определяет новый типT3, который отличается от всех других типов.Согласно правилам типа, T3 не наследует методы T2 .Но поскольку они имеют один и тот же базовый тип, поля T3 и T2 одинаковы, включая встроенный T1.Это в свою очередь продвигает методы T1 к T3 .

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