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

Interface 接口作为参数。怎么可能呢?,interface,go,Interface,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,

接口作为参数。怎么可能呢

这个包有这个接口

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
p、 s.DenseMatrix和SparseMatrix结构的定义如下:

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

一个接口仅由一组方法组成,因此,如果您收到一个接口值,则有两个选项:

  • 仅使用接口公开的方法
  • 使用a将其转换为具体类型
  • 我对所讨论的代码并不熟悉,但我怀疑这种
    MatrixRO
    类型的实现者可能会将两者结合起来

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


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

    如果您还没有完成,我建议您使用它。Go中的类型和方法的工作方式与您可能习惯的有点不同。从本教程的第二部分开始,它介绍了Go中结构和接口的工作方式