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)
}