После ввода типа, больше нельзя смешивать - PullRequest
0 голосов
/ 18 января 2019

config.Config имеет метод func String(string) string и я хочу смешать эти методы с моим типом Config 1. это нормально, когда

// type Config struct
type Config struct {
    // a struct has many methods
    config.Config
    Path string
}
// new and call string method
var a Config = &Config{}
a.String("test")

  1. это не нормально, когда
// type Config struct
type (
   Configure config.Config
   Config struct {
       Configure
       Path string
   }
)
// new and call string method
var a Config = &Config{}
// error, can not call `String()`
a.String("test")

1 Ответ

0 голосов
/ 18 января 2019

Хорошо положено 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...