Golang 中函数的泛化

Generalisation of function in Golang

我想编写一个处理 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)
    }
}

问题是我事先不知道表示为自定义类型的变量的确切类型,因为它因特定查询而异(某些查询 returns string,另一个 int 等)。

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

有办法吗?

回答您的一般性问题:这不是 Go 的惯用语言。相反,找到一种方法来传递接收器,而不是动态创建它。后者几乎是不可能的,而且更难使用。

要回答您的特定用例,只需使用 sqlx 的 DB.Get or DB.Select,它完成与您建议的包装函数完全相同的事情,但以 Go-idiomatic 方式。