我发现了几个标题相似的问题,但在其中找不到我的问题的答案:
我有以下简单的场景:
类型:
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
}
我怎么能这样做,或者这是不可能的。我的意思不是说它是“注定要完成的”,我知道它不是。但有可能吗?^^
德玛西亚99
相关分类