输入类型后,不能再混合

时间:2019-01-18 03:26:16

标签: go

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 :(得分:1)

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