golang在开关内部动态创建接收器

时间:2015-08-01 21:28:48

标签: types go interface dynamically-generated receiver

我想通过Process界面中实现的Read和Write方法读取,提取和保存来自不同来源的数据 该代码在第一个example

中运行得非常严谨
type Process interface {
    Read()
    write() string
}

type Nc struct {
    data string
}

type Ctd Nc
type Btl Nc

func (nc *Ctd) Read() {
    nc.data = "CTD"
}
func (nc *Ctd) Write() string {
    return nc.data
}
func (nc *Btl) Read() {
    nc.data = "BTL"
}
func (nc *Btl) Write() string {
    return nc.data
}

func main() {
    var ctd = new(Ctd)
    var btl= new(Btl)
    ctd.Read()
    btl.Read()
    fmt.Println(ctd.Write())
    fmt.Println(btl.Write())
}

现在,我想从文件中动态读取数据,方法get_config应该返回一个我希望在switch块中处理的常量类型:

func main() {
    // bitMask = get_config()
    bitMask := 1
    // or bitmask := 2
    var nc = new(Nc)
    switch bitMask {
    case 1:
        nc = Ctd(nc)
    case 2:
        nc = Btl(nc)
    }
    nc.Read()
    fmt.Println(nc.Write())
}

我不知道如何在开关块外面用rigth类型声明nc

谢谢,

1 个答案:

答案 0 :(得分:0)

在接口中,方法write是小写的,因此它是私有的。结构Ctd和Btl没有实现这个接口,因为它们有Write方法大写。

所以:

type Process interface {
    Read()
    Write() string
}

....

func main() {
  bitMask := 2
  // or bitMask := 2
  var nc Process
  switch bitMask {
  case 1:
    nc = &Ctd{}
  case 2:
    nc = &Btl{}
  }
  nc.Read()
  fmt.Println(nc.Write())
}

http://play.golang.org/p/IORCIY4z6B