Postgres中的Golang包装查询执行

I am using the following code to wrap execution of aquery on a postgres database in a API I am building just to learn Go.

func QueryDB(qstring string) (*sql.Rows) {
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s dbname=%s sslmode=disable", host, port, user, dbname)
    db, err := sql.Open("postgres", psqlInfo)
    if err != nil {
      panic(err)
    }
    defer db.Close()

    //Ping method opens the connection
    err = db.Ping()
    if err != nil {
       panic(err)
    }

    //rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)
    log.Printf("executing SQL %s
",qstring)
    rows, err := db.Query(qstring)
    if err != nil {
       log.Fatal(err)
    }
    return rows
}

my question is as per the documentation the db.Query() method accepts a query strgin and ...interface{} arguments otherwise. tried adding a second argument params ...interface{} to my function arguments and passing params as the second argument to the DB.Query method, and this doesn't work. it only seems to work if I specifically pull the arguments out of the interface slice. Any suggestions?

This may help you

Variadic functions can be called in the usual way with individual arguments. If you already have multiple args in a slice, apply them to a variadic function using func(slice...)

If you want send data from an slice, just add elipsis:

rows, err := db.Query(qstring, data...)
if err != nil {
   log.Fatal(err)
}

If you has the values separated in different variables:

rows, err := db.Query(qstring, val1, val2, val3, valN)
if err != nil {
   log.Fatal(err)
}

I figured it out by lookingin the source code of the SQL module and seeing how it was implemented in the db.Query() method. you add the elipsis to the end of the slice argument to pass it through. Like params...