duanping2809 2019-04-03 05:31
浏览 44
已采纳

如何从另一个函数调用dbmap.Insert(interface {})?

I have a bunch of very similar structs (A and B in the example) whose instances I want to handle in some function ( f() in the example) and then insert them into my database. I figured I could handle that with the empty interface somehow, but it seems this is not the solution as I get the error:

i: &{{6 2019-04-03 15:11:37.822100431 +0200 CEST m=+0.001291882} 7} *main.A
2019/04/03 15:11:37 Insert i no table found for type: 
exit status 1

I tried to create some minimal but executable example:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/mattn/go-sqlite3"
    gorp "gopkg.in/gorp.v2"
    "log"
    "time"
)

type Meta struct {
    Id        int
    CreatedAt time.Time
}

type A struct {
    Meta
    Value int
}

type B struct {
    Meta
    Value string
}

var dbmap *gorp.DbMap

func f(i interface{}) {
    fmt.Printf("i: %v %T
", i, i)

    err := dbmap.Insert(&i)
    checkErr(err, "Insert i")
}

func main() {
    Init()

    a := A{Meta: Meta{CreatedAt: time.Now()}, Value: 7}
    b := B{Meta: Meta{CreatedAt: time.Now()}, Value: "seven"}

    err := dbmap.Insert(&a)    // works
    checkErr(err, "Insert a")

    err = dbmap.Insert(&b)     // works
    checkErr(err, "Insert b")

    f(&a) // fails
}

func Init() {
    db, err := sql.Open("sqlite3", "/tmp/post_db.bin")
    checkErr(err, "sql.Open failed")
    dbmap = &gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
    dbmap.AddTableWithName(A{}, "As").SetKeys(true, "Id")
    dbmap.AddTableWithName(B{}, "Bs").SetKeys(true, "Id")
    err = dbmap.CreateTablesIfNotExists()
    checkErr(err, "Couldn't create tables")
}

func checkErr(err error, msg string) {
    if err != nil {
        log.Fatalln(msg, err)
    }
}

What's the right way to do that? In C++ I'd simply use templates ;)

展开全部

  • 写回答

1条回答 默认 最新

  • doufu5521 2019-04-04 04:30
    关注

    If you are calling you func like f(&a). You should call inside func f just dbmap.Insert(i), because your value is already a pointer. So your func will look like

    func f(i interface{}) {
        fmt.Printf("i: %v %T
    ", i, i)
    
        err := dbmap.Insert(i)
        checkErr(err, "Insert i")
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏
  • ¥20 校园网认证openwrt插件
  • ¥15 以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
  • ¥15 求GCMS辅导数据分析
  • ¥30 SD中的一段Unet下采样代码其中的resnet是谁跟谁进行残差连接
  • ¥15 Unet采样阶段的res_samples问题
  • ¥60 Python+pygame坦克大战游戏开发实验报告
  • ¥15 R语言regionNames()和demomap()无法选中中文地区的问题
  • ¥15 Open GL ES 的使用
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部