浏览代码

修改bug

yjp 1 年之前
父节点
当前提交
26fbac9089
共有 2 个文件被更改,包括 21 次插入7 次删除
  1. 9 3
      examples/assign_tag/main.go
  2. 12 4
      tag/assign_struct.go

+ 9 - 3
examples/assign_tag/main.go

@@ -3,6 +3,7 @@ package main
 import (
 	"fmt"
 	"git.sxidc.com/go-framework/baize/tag"
+	"time"
 )
 
 type JsonBodyID struct {
@@ -11,7 +12,8 @@ type JsonBodyID struct {
 
 type UpdateClassJsonBody struct {
 	JsonBodyID
-	Name string `assign:"toField:Name"`
+	Name       string `assign:"toField:Name"`
+	CreateTime *time.Time
 }
 
 type DomainID struct {
@@ -20,15 +22,19 @@ type DomainID struct {
 
 type ClassDomain struct {
 	DomainID
-	Name string
+	Name       string
+	CreateTime *time.Time
 }
 
 func main() {
+	now := time.Now()
+
 	jsonBody := &UpdateClassJsonBody{
 		JsonBodyID: JsonBodyID{
 			ID: "test_id",
 		},
-		Name: "test",
+		Name:       "test",
+		CreateTime: &now,
 	}
 
 	class, err := tag.AssignTo[*ClassDomain](jsonBody)

+ 12 - 4
tag/assign_struct.go

@@ -63,12 +63,20 @@ func assignTo(fromElemValue reflect.Value, retElemValue *reflect.Value) error {
 	for i := 0; i < fromElemValue.NumField(); i++ {
 		fromField := fromElemValue.Type().Field(i)
 		tagStr := fromField.Tag.Get(assignTagKey)
+
+		// 结构上没有添加Tag, 先尝试直接按照字段赋值结构,如果失败,进一步进入内部尝试
 		if strutils.IsStringEmpty(tagStr) &&
-			(fromField.Type.Kind() == reflect.Struct ||
-				(fromField.Type.Kind() == reflect.Ptr && fromField.Type.Elem().Kind() == reflect.Struct)) {
+			((fromField.Type.Kind() == reflect.Struct && fromField.Type.String() != "time.Time") ||
+				(fromField.Type.Kind() == reflect.Ptr &&
+					fromField.Type.Elem().Kind() == reflect.Struct &&
+					fromField.Type.Elem().String() != "time.Time")) {
 			fromStructElemValue := fromElemValue.Field(i)
 			if fromField.Type.Kind() == reflect.Ptr {
-				fromStructElemValue = fromElemValue.Elem()
+				if !fromStructElemValue.IsValid() || fromStructElemValue.IsZero() {
+					continue
+				}
+
+				fromStructElemValue = fromStructElemValue.Elem()
 			}
 
 			err := assignTo(fromStructElemValue, retElemValue)
@@ -145,7 +153,7 @@ func assignField(fromFieldElemValue reflect.Value, retFieldElemValue reflect.Val
 			break
 		}
 
-		if retKind == reflect.Struct {
+		if fromFieldElemValue.Type().String() != "time.Time" && retKind == reflect.Struct {
 			return assignTo(fromFieldElemValue, &retFieldElemValue)
 		}