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