去函数参数中的多态性

时间:2014-08-22 12:28:36

标签: go polymorphism

我发现了几个类似标题的问题,但找不到我的问题的答案:

我有以下简单方案:

类型:

    type intMappedSortable interface {
       getIntMapping() int
    }

    type Rectangle struct {
       length, width int
    }

    func (r Rectangle) getIntMapping() int {
        return r.Area();
    }

    func (Rectangle r) getIntMapping() int {
        return r.length * r.width;
    }

主:

func main() {
    r := rand.New(rand.NewSource(time.Now().UnixNano()))

    var values []int
    values = make([]int, 0)

    for i := 0; i < 10; i++ {
        values = append(values, r.Intn(20))
    }

    var rects []Rectangle;
    rects = make([]intMappedSortable, len(values));

    for i,v:= range values {
        r := Rectangle{v,v};
        rects[i] = r;
    }
    for i,v:= range rects {
        fmt.Println(v.Area());
    }


    rectsRet := make(chan intMappedSortable, len(rects));
    sort(rects, rectsRet);
}

的doWork:

func sort(values []intMappedSortable, out chan intMappedSortable) {...}

如何设置将矩形传递给排序函数,然后使用main中的排序矩形?

我试过了:

var rects []*Rectangle;
rects = make([]*Rectangle, len(values));

作为我C日的习惯,我不想复制矩形,只是地址,所以我可以直接在原始切片中排序,防止整个数据的2个复制过程。

在此尝试失败后我尝试了:

var rects []intMappedSortable;
rects = make([]*Rectangle, len(values));

我了解到Go通过保持指向未公开的原始数据的指针来处理“多态”,所以我将* Rectangle更改为Rectangle,两者都给了我的Rectangle不是[] intMappedSortable

的compilererror

显然有效的是:

var rects []intMappedSortable;
rects = make([]intMappedSortable, len(values));

for i,v:= range values {
    r := Rectangle{v,v};
    rects[i] = r;
}

但这些矩形现在是复制的还是只是复制了它们的引用的接口的存储器表示?此外,现在无法访问矩形的长度和宽度,因为切片不再明确为矩形类型。

那么,我将如何实现这种情况? 我想创建一个ANY结构的片段,它实现mapToInt(),对切片进行排序,然后继续使用其后的具体类型

EDIT /随访:

我知道它的风格并不好,但我正在尝试:

我可以以某种方式使用类型断言与动态类型,如:

func maptest(values []intMappedSortable, out interface{}) {
    oType := reflect.TypeOf(out);
    fmt.Println(oType); // --> chan main.intMappedSortable  
    test := values[0].(oType) //i know this is not working AND wrong even in thought because oType holds "chan intMappedSortable", but just for theory's sake
}

我怎么能这样做,或者这是不可能的。我并不是说它“意味着要完成”,我知道事实并非如此。但这可能吗?^^

1 个答案:

答案 0 :(得分:1)

  

但这些矩形现在是复制还是只是接口的内存表示,并且复制了它们的引用?

后者,请参阅“what is the meaning of interface{} in golang?

  

接口值由两个数据字构成:

     
      
  • 一个词用于指向值的基础类型
  • 的方法表   
  • ,另一个词用于指向该值所持有的实际数据。
  •   

  

我想创建一个ANY结构的片段,它实现mapToInt(),对切片进行排序,然后继续使用其后的具体类型

这是不可能的,因为Go中没有通用性 请参阅“What would generics in Go be?

这就是为什么你有像“gen”这样的项目:

  

使用命令行在开发时为您的类型生成代码   gen不是导入;生成的源成为项目的一部分,不需要外部依赖。