Это:
type Form Rectangle
Создает тип нового с именем Form
, имеющим Rectangle
в качестве своего типа , лежащие в основе.
Это означает, что поля Rectangle
(который является структурой) будут определены для Form
.
Но методы привязаны к определенному типу. Когда вы создаете новый тип (Form
), этот новый тип не будет иметь каких-либо методов его базового типа, поэтому вы не можете позвонить c.SomethingElse()
, так как SomethingElse()
- это метод типа Rectangle
.
c.Circle.Something()
работы, потому что c.Circle
является полем типа Circle
и Something()
представляет собой метод Circle
типа.
Если вы хотите позвонить по методу Rectangle.SomethingElse()
, для которого требуется значение типа Rectangle
(тип приемника: Rectangle
). Поскольку основной тип Form
является Rectangle
, вы можете просто получить значение типа Rectangle
из значения типа Form
с помощью простого типа conversion:
Rectangle(c).SomethingElse() // This works
Преимущества создания нового типа является то, что таким образом Вы можете создать/добавьте свои собственные методы. Общим примером является использование интерфейса sort.Interface
. Допустим, у вас есть кусочек чего-то, например. []Rectangle
или фрагмент некоторого типа, который у вас нет контроля (потому что он является частью другого пакета), а методы для типа могут быть определены только в одном пакете). Если вы хотите отсортировать этот кусок, вы создаете новый тип, для которого можно определить методы, методы sort.Interface
и т.д .:
type SortRectangle []Rectangle
func (s SortRectangle) Len() int { return len(s) }
func (s SortRectangle) Less(i, j int) bool { return s[i] <some-logic> s[j] }
func (s SortRectangle) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
sort.Sort()
функция может сортировать любые значения, которые реализуют sort.Interface
. []Rectangle
нет, но мы только что создали новый тип SortRectangle
, который делает.И если у нас есть значение типа []Rectangle
, мы можем преобразовать его в SortRectangle
, потому что первый является базовым типом последнего, и, выполнив преобразование, мы имеем значение типа SortRectangle
, которое может быть передано sort.Sort()
, чтобы есть она сортируется:
rs := []Rectangle{}
// Sort rs:
sort.Sort(SortRectangle(rs))
Обратите внимание, что преобразование, как выше SortRectangle(rs)
только изменяет информацию о типе времени выполнения, это не меняет представление памяти rs
, так что pefectly безопасно и эффективного.
Если вы хотите, чтобы новый тип имел методы «старого» типа, тогда используйте вложение. См. Ответ Айнара-Г. На самом деле, вы уже сделали это, встраивая Circle
в Rectangle
: тип Rectangle
имеет метод Something()
, потому что Something()
является метод Circle
:
Rectangle{}.Something() // Prints "something"
Thx для отличного объяснения! – simplebird