Go 通过引用传递接收器结构
我需要一个函数来返回调用方传递到函数中的结构。每次调用函数时,结构都会不同 我正在使用和ORM postgres驱动程序“github.com/go pg/pg”。 据我所知,ORM要求在调用.Query()之前定义结构,该.Query()使用数据库中的数据填充结构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
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{}
类型。这正是我想要的。非常感谢你。我知道这是我需要的一个界面,感谢您解释引用它的正确方式。这让我很开心!有一个好朋友自己上网!