Go 通过引用传递接收器结构

Go 通过引用传递接收器结构,go,struct,Go,Struct,我需要一个函数来返回调用方传递到函数中的结构。每次调用函数时,结构都会不同 我正在使用和ORM postgres驱动程序“github.com/go pg/pg”。 据我所知,ORM要求在调用.Query()之前定义结构,该.Query()使用数据库中的数据填充结构 func PgSql(user User, statement string)(output []string, err error) { _, err = db.Query(&users, `SELECT * FROM

我需要一个函数来返回调用方传递到函数中的结构。每次调用函数时,结构都会不同

我正在使用和ORM postgres驱动程序“github.com/go pg/pg”。 据我所知,ORM要求在调用.Query()之前定义结构,该.Query()使用数据库中的数据填充结构

func PgSql(user User, statement string)(output []string, err error) {

_, err = db.Query(&users, `SELECT * FROM standard_lookup WHERE pkid_ = 'STATE|AFKDZ'`)

}

结果将显示在用户结构中。但是,我需要在另一个包中定义此结构并将其传递到此函数中。这里有什么接口魔法吗?

如果每次都需要传入不同的类型,则参数需要是一个接口,并且指向要填充的结构的指针需要传入该接口:

func PgSql(dest interface{}, statement string)(output []string, err error) {
    _, err = db.Query(dest, statement)
    // handle error
}

func main() {
    var user User
    _, err := PgSql(&user, `SELECT * FROM standard_lookup WHERE pkid_ = 'STATE|AFKDZ'`)
    // handle error
}

请注意,在
PgSql
函数中,您直接传递的是
dest
接口变量,而不是指向它的指针。这是因为该接口已经拥有一个指针(它是用
&user
调用的),所以您不需要传递对接口的引用,只需要传递接口的值(在本代码中,接口本身是对
main()
中的
user
变量的引用),但是,如果您希望调用方传入一个结构并填充其值,则该函数应该使用
*User
而不是
User
,并将该指针直接传递到
db.Query()
。谢谢,抱歉,我不清楚。结构用户需要是动态的。调用方需要定义sql结果的外观。如果它传入的语句类似于“select field1,field2,from table”,那么结构用户需要在其中定义field1和field2。(每个字段都是数据库中的列名)。问题是每次调用此pgSql func时签名都会不同。该结构在不同包中的范围外定义。方法是它需要在pgsql中定义结构,这使得它不像我需要的那样灵活。我想知道我能做些什么来克服这个限制。第一个参数应该是
interface{}
类型。这正是我想要的。非常感谢你。我知道这是我需要的一个界面,感谢您解释引用它的正确方式。这让我很开心!有一个好朋友自己上网!