接口作为参数。这怎么可能?

时间:2013-11-03 04:03:19

标签: interface go

作为参数的接口。怎么可能?

https://github.com/skelterjohn/go.matrix/blob/go1/matrix.go

此包具有此界面

type MatrixRO interface {
  Nil() bool
  Rows() int
  Cols() int
  NumElements() int
  GetSize() (int, int)
  Get(i, j int) float64

  Plus(MatrixRO) (Matrix, error)
  Minus(MatrixRO) (Matrix, error)
  Times(MatrixRO) (Matrix, error)

  Det() float64
  Trace() float64

  String() string

  DenseMatrix() *DenseMatrix
  SparseMatrix() *SparseMatrix
}

接口只有方法。不是数据结构。 那么Plus(MatrixRO)如何接收接口作为参数? 即使MatrixRO中没有任何数据,如何才能运行?

此功能也接收

  func String(A MatrixRO) string {

MatrixRO作为参数。

怎么可能?是因为行

DenseMatrix() *DenseMatrix
SparseMatrix() *SparseMatrix

?如果它需要嵌入某些东西,那么它不应该像下面那样吗?

DenseMatrix
SparseMatrix

P.S。 DenseMatrix和SparseMatrix结构定义如下:

type DenseMatrix struct {
  matrix
  elements []float64
  step int
}

1 个答案:

答案 0 :(得分:3)

接口只包含一组方法,所以如果你有一个接口值,你有两个选择:

  1. 仅使用界面公开的方法。
  2. 使用type assertion将其转换为具体类型。
  3. 我对相关代码并不熟悉,但我怀疑这种MatrixRO类型的实施者可能会将两者结合起来。

    如果特定MatrixRO实现在另一个操作数属于同一类型时知道实现Plus的快速方法,则可以使用类型断言来决定是否调用快速路径。

    如果它无法识别其他操作数的类型,DenseMatrixSparseMatrix方法提供了访问执行操作所需数据的方法。