Хорошо положено https://go101.org/article/type-system-overview.html:
новый определенный тип и его соответствующий тип источника в определениях типов - это два разных типа.
Это работает:
package main
import(
"fmt"
)
type MyType struct {
Id int
}
func (mt *MyType)Method() {
fmt.Printf("Method called %d\n", mt.Id)
}
type MyOtherType MyType
func main(){
mt := &MyType{Id:3}
mt.Method()
//mt2 := &MyOtherType{Id:5}
//mt2.Method()
}
Но если вы раскомментируете mt2.Method()
, вы получите ошибку:
mt2.Method undefined (type *MyOtherType has no field or method Method)
Композиция работает по-разному. Структура действительно получает методы структур, из которых она состоит:
package main
import (
"fmt"
)
type MyType struct {
Id int
}
func (mt *MyType) Method() {
fmt.Printf("Method called %d\n", mt.Id)
}
type MyOtherType struct {
MyType
}
func main() {
mt := &MyType{Id: 3}
mt.Method()
mt2 := &MyOtherType{MyType{Id: 5}}
mt2.Method()
}
Это волшебство композиции типа.
$ go run t.go
Method called 3
Method called 5