s2 := ((*T2)(&t1)).F2() // ok - not expected
работает, потому что вы приводите его к типу T2
, и это позволяет F2
.Так что ожидается работа.Затем вызывается функция F2
для вашего T2
объекта t1
, который возвращает t1.s
.
s0 := t2.F1() // error - expected ok
Для этого я не могу сказать вам наверняка, но только дам вам правдоподобную идеюа также:
F1 - это метод для типа T1.Поскольку t2 не относится к типу T1, вы не можете вызвать F1 на t2.Итак, как вы заметили, разделяются только поля данных, а не методы этих типов.
Также см. Go для программистов на C ++ , в которых говорится:
Методы определены для именованных типов.Если вы преобразуете значение в другой тип, новое значение будет иметь методы нового типа, а не старого типа.