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

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


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

}


烙印99
浏览 303回答 1
1回答

哆啦的时光机

一个接口只包含一组方法,所以如果你得到一个接口值,你有两个选择:仅使用接口公开的方法。使用类型断言将其转换为具体类型。我对所讨论的代码并不熟悉,但我怀疑这种MatrixRO类型的实现者可能会将两者结合起来。如果一个特定的MatrixRO实现知道Plus当另一个操作数是相同类型时的快速实现方式,它可以使用类型断言来决定是否调用快速路径。如果它不能识别其他操作数的类型,则DenseMatrixorSparseMatrix方法提供了一种访问执行操作所需数据的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go