Golang中函数的推广

时间:2018-03-14 10:10:08

标签: sql function go generalization

我想编写一个处理SQL查询的泛型函数。

Sqlx模块提供函数StructScan(),它会自动将结果扫描到struct字段中。

type Place struct {
    Country       string
    City          sql.NullString
    TelephoneCode int `db:"telcode"`
}

rows, err := db.Queryx("SELECT * FROM place")
for rows.Next() {
    var p Place
    err = rows.StructScan(&p)
}

因此,建议的函数签名如下:

func Query(db *sql.DB, query) {
    rows, err := db.Queryx("SELECT * FROM place")
    for rows.Next() {
        var p CustomType
        err = rows.StructScan(&p)
    }
}

问题在于我事先并不知道变量的确切类型表示为自定义类型,因为它根据特定查询而有所不同(某些查询返回字符串,另一个 int < / strong>等)。

其中一个选项是将类型 CustomType作为参数传递给Query。但是,我不知道如何使用所需类型初始化局部变量p

有办法吗?

1 个答案:

答案 0 :(得分:3)

回答你的一般问题:那不是惯用的Go。相反,找到一种传递接收器的方法,而不是动态创建它。后者实际上是不可能的,而且反正难以使用。

要回答您的具体用例,只需使用sqlx的DB.GetDB.Select,它们与您提出的包装函数完全相同,但是采用Go-idiomatic方式。