我有一个结构,其中一个字段类型是interface,我如何将接口映射到db字段(应该是列类型)中,以便检索它?在下面的代码中,我想知道如何映射数据库中的Task字段,这样我就可以存储";a";以及";b";数据库中。如果它不是一个接口,我本可以映射到底层结构。我在postgres包中没有任何限制要使用
package main
import (
"fmt"
)
type Sai struct {
Name string. // can map this in db as string
Task Test. // how should i map this
}
type Test interface {
Print()
}
type dummyStruct1 struct {
Name StringStruct
}
type StringStruct struct {
Name string
}
type dummyStruct2 struct {
Name StringStruct
}
func main() {
fmt.Println("Hello, playground")
s1 := dummyStruct1{Name: StringStruct{"jon"}}
s2 := dummyStruct1{Name: StringStruct{"smith"}}
a := Sai{Name: "task1", Task: s1.Hello()}
b := Sai{Name: "task1", Task: s2.Hello()}
a.Task.Print()
b.Task.Print()
}
func (s StringStruct) Print() {
fmt.Println(s.Name)
}
func (d dummyStruct1) Hello() StringStruct {
return d.Name
}
func (d dummyStruct2) Hello() StringStruct {
return d.Name
}
如果您是实现接口Test
:的具体类型的人
如果你可以修改Test
本身做:
import (
"database/sql"
"database/sql/driver"
)
// other stuff
type Test interface{
sql.Scanner
driver.Valuer
Print()
}
否则创建一个新型TestDB
import (
"database/sql"
"database/sql/driver"
)
// other stuff
type TestDB interface{
sql.Scanner
driver.Valuer
Test
}
现在,无论您创建哪种新类型,都必须实现sql。扫描仪和驱动程序。估价师接口。当向数据库写入值或从数据库扫描数据时,lib/pq
会在内部自动使用这些值。
作为的一个例子
// Assuming Test can implement Valuer and Scanner interfaces
package main
import (
"fmt"
"database/sql"
"database/sql/driver"
)
type Sai struct {
Name string // can map this in db as string
Task Test // how should i map this
}
type Test interface {
sql.Scanner
driver.Valuer
Print()
}
type StringStruct struct {
Name string
}
func main() {
...
}
func (s StringStruct) Print() {
fmt.Println(s.Name)
}
func (s StringStruct) Value() (driver.Value, error) {
return s.Name
}
func (s *StringStruct) Scan(src interface{}) error {
v, ok := src.(string)
if !ok {
return fmt.Errorf("not a string")
}
s.Name = v
}
// more code
...
...
现在,您可以在postgres中存储任何类型为StringStruct
(也是Test
)的内容作为简单的varchar
或text
。这也不仅限于string
s,尽管正如您所知,实际上这是我当前从pq存储和检索json的方法。