Golan SQL和Gorp期望所有类型都包括附加到该类型的Scan and Value方法,以便将行读取到结构中。即使可以通用化方法,这也会在我的项目中添加很多样板代码,因为我正在向此列中写入JSON。
type Type1 struct {
Type2 Type2
Type3 Type3
Type4 Type4
}
type Type2 struct { some primitives... }
type Type3 struct { some primitives... }
type Type4 struct { some primitives... }
func (q Type2) Value() (driver.Value, error) {
return json.Marshal(q)
}
func (q *Type2) Scan(src interface{}) error {
source, _ := src.([]byte)
if string(source) == "null" {
return nil
}
return json.Unmarshal(source, q)
}
func (q Type3) Value() (driver.Value, error) {
return json.Marshal(q)
}
func (q *Type3) Scan(src interface{}) error {
source, _ := src.([]byte)
if string(source) == "null" {
return nil
}
return json.Unmarshal(source, q)
}
func (q Type4) Value() (driver.Value, error) {
return json.Marshal(q)
}
func (q *Type4) Scan(src interface{}) error {
source, _ := src.([]byte)
if string(source) == "null" {
return nil
}
return json.Unmarshal(source, q)
}
是否可以避免为每个结构定义所有相同的Value和Scan方法?
该表应如下所示:
Table: Type1
-----------------------
ROW Type2 Type3 Type4
1 {"name": "MyName"} {"other": "bla"} {"other": "bla"}
我尝试使用@danicheeta建议的成分:
type Base struct {}
type Type2 struct { Base, some primitives... }
func (q Base) Value() (driver.Value, error) {
return json.Marshal(q)
}
func (q *Base) Scan(src interface{}) error {
source, _ := src.([]byte)
if string(source) == "null" {
return nil
}
return json.Unmarshal(source, q)
}
但是如果我对数据库执行插入操作,结果将是:
Table: Type1
-----------------------
ROW Type2 Type3 Type4
1 {} {} {}
类似地,如果我已经“手动”插入了数据库,则:
Table: Type1
-----------------------
ROW Type2 Type3 Type4
1 {"name": "MyName"} {"other": "bla"} {"other": "bla"}
尝试做一个select * from Type1
我得到的东西:
Type1: {
Type2: {}
Type3: {}
Type4: {}
}
答案 0 :(得分:0)
这是一个解决方案:
type Base struct {}
type Type2 struct { Base, some primitives... }
type Type3 struct { Base, some primitives... }
type Type4 struct { Base, some primitives... }
func (q Base) Value() (driver.Value, error) {
return json.Marshal(q)
}
func (q *Base) Scan(src interface{}) error {
source, _ := src.([]byte)
if string(source) == "null" {
return nil
}
return json.Unmarshal(source, q)
}
注意,嵌入在结构中的Base之前不应包含var(我的意思是type Type2 struct { b Base, some primitives... }
)