登录
首页 >  Golang >  Go问答

用结构体的字段指针填充切片

来源:stackoverflow

时间:2024-04-15 13:36:31 234浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《用结构体的字段指针填充切片》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我正在创建一个接收 interface{} 的函数,该函数始终是一个结构体,但也可以是任何结构体。

我需要用接收到的结构体的所有字段的指针填充一个切片。下面的代码中我需要选择字段指针的位置用 **field pointer**

标记

我的最终目标是创建一个函数来接收相当于参数sqlquery中发送的查询的返回的结构。我想创建一个动态函数来执行任何类型的查询选择,始终使用为 .scan 接收的结构。

可能是我想错了,我还在开始golang。

func QuerySelect(entity interface{}, sqlQuery string) {
    val := reflect.Indirect(reflect.ValueOf(entity))
 
    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
        "password=%s dbname=%s sslmode=disable",
        host, port, user, password, dbname)

    // Validate database params
    db, err := sql.Open(driver, psqlInfo)

    // If returned any error
    if err != nil {
        panic(err)
    }

    // Validate connection with database
    err = db.Ping()
    if err != nil {
        panic(err)
    }

    // Execute query
    rows, err := db.Query(sqlQuery)

    countColumns := val.Type().NumField()

    var allRows []interface{}

    for rows.Next() {
        columnsPointers := make([]interface{}, countColumns)

        for i := 0; i < countColumns; i++ {
           columnsPointers[i] = **FIELD POINTER (entity struct)**
        }

        if err := rows.Scan(columnsPointers...); err != nil {
            log.Fatal(err)
        }

        allRows = append(allRows, entity)
    }
}

解决方案


根据 mkopriva 对问题的评论,使用以下内容获取该字段的地址:

for i := 0; i < countColumns; i++ {
   columnsPointers[i] = val.Field(i).Addr().Interface()
}

今天关于《用结构体的字段指针填充切片》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>