使用反射和 DRYing 一些代码

Use of reflection and DRYing out some code

我有一个函数需要接收类型,确定子类型,然后创建子类型的副本。我一直盯着这个功能,我觉得这可以简化,但我就是想不通如何让它发挥作用。这是代码:

func AddProp(prop prop, x, y int) []prop {

  v := reflect.ValueOf(prop)
  fmt.Printf("Prop type is %v", v.Type())

  switch v.Type() {
  case reflect.TypeOf(&Fence{}):
      f := Fence{}
      f.New(x, y)
      props = append(props, &f)
  case reflect.TypeOf(&Rock{}):
      f := Rock{}
      f.New(x, y)
      props = append(props, &f)
  }
  return props
}

实际上比这个要长很多,案例更多。感谢您的观看!

编辑: 非常合理的问题 - 道具是什么?

type prop interface {
    New(int, int)
}

第二次编辑: 我的结构如下所示:

type Prop struct {
    fullImage image.Image
    x, y int
}
type Fence struct {
    Prop
    horizontal bool
} 

我为两者都定义了 New(x,y int)

func (p *Prop) New(x, y int)
func (p *Fence) New(x, y int)

我需要获取 Fence 结构并根据 Fence 而不是 Prop 调用 New

如果所有类型都具有 New 方法,您可以简化此操作:

package main

import (
    "fmt"
    "reflect"
)

func main() {

    props := AddProp(&Rock{}, 1, 1)
    fmt.Printf("%#v\n", props)

    props = AddProp(&Fence{}, 1, 1)
    fmt.Printf("%#v\n", props)

}

type Rock struct{}

func (r *Rock) New(x, y int) {}

type Fence struct{}

func (r *Fence) New(x, y int) {}

type prop interface {
    New(x, y int)
}

func AddProp(p prop, x, y int) (props []prop) {
    newValue := reflect.New(reflect.TypeOf(p).Elem()).Interface()
    z := newValue.(prop)
    z.New(x, y)
    props = append(props, z)
    return props
}