有人可以解释这怎么可能发生?
我将interface
作为参数放在函数中。在调用此函数时,我将struct
传递给它,但它并没有给我错误。这是代码
package main
import (
"fmt"
"github.com/myusername/gomodel/domain"
"github.com/myusername/gomodel/model"
)
func main() {
db := model.InitDB()
newFunc(db)
}
func newFunc(db domain.IUser) {
r, err := db.CreateUserTable()
if err != nil {
fmt.Println("error", err)
}
fmt.Println(r)
}
我已经在代码中的其他地方实现了接口,因为程序只是作为预期实现的接口工作。
IUser
是一个接口,其成员为:
type IUser interface {
CreateUserTable() (sql.Result, error)
}
InitDB
是一个打开数据库并返回数据库结构的函数:
type DB struct {
*sql.DB
}
//InitDB initializes the database
func InitDB() *DB {
db, err := sql.Open(dbDriver, dbName)
if err != nil {
log.Fatal("failed to initialize database: ",err)
}
err2 := db.Ping()
if err2 != nil {
log.Fatal(err2)
}
return &DB{db}
}
我的问题是:如何为参数类型接口的函数传递不同类型的参数?这是如何在幕后工作的?
答案 0 :(得分:2)
接口类型指定称为其接口的方法集。一个 接口类型的变量可以使用方法存储任何类型的值 设置是接口的任何超集。据说这种类型 实现界面。
这是因为接口可以实现为每种类型的包装器。接口实际上指向两个东西,主要是一个是底层类型,这是一个结构在这里,另一个是该类型的值,它是一个指向DB的指针
您看到newFunc
实际上正在将interface{}
作为参数,因此您可以将类型T
的任何内容传递给它,它也可以是原始类型。
func main() {
db := model.InitDB()
newFunc(db)
}
因此,如果您想获取基础值,则需要键入assert。接口在这里像struct的包装器一样工作,并保存它的类型和值,可以使用类型断言来获取。