Golang参数转换

时间:2018-03-03 13:36:12

标签: go struct interface

有人可以解释这怎么可能发生?

我将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}
}

我的问题是:如何为参数类型接口的函数传递不同类型的参数?这是如何在幕后工作的?

1 个答案:

答案 0 :(得分:2)

根据Golang Spec

  

接口类型指定称为其接口的方法集。一个   接口类型的变量可以使用方法存储任何类型的值   设置是接口的任何超集。据说这种类型   实现界面。

这是因为接口可以实现为每种类型的包装器。接口实际上指向两个东西,主要是一个是底层类型,这是一个结构在这里,另一个是该类型的值,它是一个指向DB的指针

您看到newFunc实际上正在将interface{}作为参数,因此您可以将类型T的任何内容传递给它,它也可以是原始类型。

func main() {
    db := model.InitDB()

    newFunc(db)
}

因此,如果您想获取基础值,则需要键入assert。接口在这里像struct的包装器一样工作,并保存它的类型和值,可以使用类型断言来获取。