gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:09:02 25 4
gpt4 key购买 nike

我有一堆非常相似的结构(示例中的 A 和 B),我想在某些函数(示例中的 f())中处理它们的实例,然后将它们插入到我的数据库中.我想我可以以某种方式用空接口(interface)处理它,但似乎这不是解决方案,因为我收到错误:

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

我尝试创建一些最小但可执行的示例:

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\n", 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)
}
}

正确的做法是什么?在 C++ 中,我会简单地使用模板;)

最佳答案

如果你像 f(&a) 这样调用你的 func。您应该在 func f 内部调用 dbmap.Insert(i),因为您的值已经是一个指针。所以你的 func 看起来像

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

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

关于go - 如何从另一个函数调用 dbmap.Insert(interface{})?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com