函数参数中的多态性

我发现了几个标题相似的问题,但在其中找不到我的问题的答案:


我有以下简单的场景:


类型:


    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);

}

做工作:


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


显然有效的是:


var rects []intMappedSortable;

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


for i,v:= range values {

    r := Rectangle{v,v};

    rects[i] = r;

}

但是这些矩形现在是被复制还是只是接口的内存表示及其引用被复制?此外,现在无法访问矩形的长度和宽度,因为切片不再明确属于矩形类型。


那么,我将如何实现这个场景?我想创建一个任何结构的切片,它实现了 mapToInt(),对切片进行排序,然后在它之后继续使用具体类型


编辑/跟进:


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


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


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

}

我怎么能这样做,或者这是不可能的。我的意思不是说它是“注定要完成的”,我知道它不是。但有可能吗?^^


翻翻过去那场雪
浏览 220回答 1
1回答

德玛西亚99

但是这些矩形现在是被复制还是只是接口的内存表示及其引用被复制?后者,见“&nbsp;golang中的意思是interface{}什么?&nbsp;”接口值由两个数据字构成:一个词用于指向值的基础类型的方法表,另一个词用于指向该值所持有的实际数据。我想创建一个任何结构的切片,它实现了 mapToInt(),对切片进行排序,然后在它之后继续使用具体类型这是不可能的,因为 Go 中没有通用性。请参阅“&nbsp;Go 中的泛型是什么?&nbsp;”这就是为什么你有像“&nbsp;gen&nbsp;”这样的项目:在开发时使用命令行为您的类型生成代码。gen不是进口;生成的源代码成为您项目的一部分,并且不需要任何外部依赖项。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go