http://play.golang.org/p/icQO_bAZNE

我正在练习使用堆的排序方式,但

1
2
3
  prog.go:85: type bucket is not an expression
  prog.go:105: cannot use heap.Pop(bucket[i].([]IntArr)) (type interface {}) as type int in assignment: need type assertion
  [process exited with non-zero status]

我遇到那些错误,无法弄清楚如何正确输入assert

问题出在以下几行:

1
2
3
  heap.Push(bucket[x].([]IntArr), elem)

  arr[index] = heap.Pop(bucket[i].([]IntArr))

因为我想使用堆结构以便从每个存储桶中提取值

每个存储区为[]IntArr

IntArr[]int,如下所示:

1
2
type IntArr []int
type bucket [10]IntArr

我在周末尝试了很多方法,无法弄清楚,对此我深表感谢。


要使用堆包,应为您的类型(在本例中为IntArr类型)实现heap.Interface。您可以在此处找到示例:http://golang.org/pkg/container/heap/#pkg-examples

然后您可以执行类似

的操作

1
heap.Push(bucket[x], elem)
  • play.golang.org/p/F0J4qXdmzD我尝试了此操作,但仍无法正常工作...您如何更改我的代码才能正常工作?
  • play.golang.org/p/i7O8HB6ez8-使用它作为起点。调试算法,排序不起作用

来自go spec:

For an expression x of interface type and a type T, the primary
expression

x.(T)

asserts that x is not nil and that the value stored in x is of type T.
The notation x.(T) is called a type assertion.

bucket[x]不是接口类型的表达式,请参见此处。

  • 是的,您是对的,但是我无法弄清楚如何使bucket [x]成为具有类型断言的接口类型,但我做不到。您能否简要说明一下如何更改我的代码?
  • @MaynardEPSILON我认为您应该考虑@kluyg关于实现heap.Interface的说法,而不是任何类型的断言。