1

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

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里面没有数据怎么可能操作plus?

该函数还接收

  func String(A MatrixRO) string {

MatrixRO 作为参数。

怎么可能?是因为线

DenseMatrix() *DenseMatrix
SparseMatrix() *SparseMatrix

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

DenseMatrix
SparseMatrix

ps DenseMatrix 和 SparseMatrix 结构的定义如下:

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

1 回答 1

3

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

  1. 仅使用接口公开的方法。
  2. 使用类型断言将其转换为具体类型。

我对所讨论的代码一无所知,但我怀疑这种MatrixRO类型的实现者可能会将两者结合起来。

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

如果它不能识别其他操作数的类型,则DenseMatrixorSparseMatrix方法提供了一种访问执行操作所需数据的方法。

于 2013-11-03T04:33:38.590 回答