type SetTime struct {
CreateTime int64 `json:"create_time"`
UpdateTime int64 `json:"update_time"`
}
func (s *SetTime) Set(v int64) {
s.CreateTime = v
s.UpdateTime = v
}
type Out struct {
Name string
SetTime
}
要想访问嵌套结构体的字段以及方法,需要以这种形式
var out Out
out.SetTime.Set()
在json序列化时,展示的效果如下:
{
"Name": "TEST",
"create_time": 1632479850,
"update_time": 1632479850
}
create_timeupdate_timecreatescan
DEMO1:
package main
import (
"encoding/json"
"time"
)
type SetTime struct {
CreateTime int64 `json:"create_time"`
UpdateTime int64 `json:"update_time"`
}
func (s *SetTime) Set(v int64) {
s.CreateTime = v
s.UpdateTime = v
}
type A struct {
Name string
SetTime
}
func main() {
var a A
a.Name = "TEST"
a.SetTime.Set(time.Now().Unix())
b, _ := json.MarshalIndent(a, "", " ")
println(string(b))
}
输出结果如下:
$ go run main.go
{
"Name": "TEST",
"create_time": 1632479850,
"update_time": 1632479850
}
GORM DEMO
foo.sql
DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`age` smallint(5) UNSIGNED NOT NULL DEFAULT 0,
`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
`price` decimal(10, 2) NOT NULL DEFAULT 0.00,
`create_time` int(11) NOT NULL DEFAULT 0,
`update_time` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
main.go
package main
import (
"encoding/json"
"fmt"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type FieldTime struct {
CreateTime int64
UpdateTime int64
}
func (ft *FieldTime) SetNow() {
t := time.Now().Unix()
ft.CreateTime = t
ft.UpdateTime = t
}
type Foo struct {
Id int
Name string
Age int
Pri float64 `gorm:"column:price"`
FieldTime
}
func NewFoo(name string, age int, price float64) *Foo {
foo := &Foo{
Name: name,
Age: age,
Pri: price,
}
foo.FieldTime.SetNow()
return foo
}
func insertRecord(db *gorm.DB, name string, age int, price float64) int {
foo := NewFoo(name, age, price)
result := db.Table("foo").Create(foo)
// fmt.Println(result.RowsAffected)
if result.Error != nil {
panic(result.Error)
}
return foo.Id
}
func QueryID(db *gorm.DB, id int) {
foo := Foo{}
result := db.Table("foo").Where("id = ?", id).Scan(&foo)
if result.Error != nil {
panic(result.Error)
} else {
b, _ := json.MarshalIndent(foo, "", " ")
println(string(b))
}
}
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "root:123456@tcp(127.0.0.1:3306)/foo?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println(err)
} else {
println("DB CONNECT SUCCESS!")
}
id := insertRecord(db, "f7", 21312, 12310.2)
QueryID(db, id)
}