支持嵌套结构体 #1
							
								
								
									
										27
									
								
								builder.go
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								builder.go
									
									
									
									
									
								
							| @ -1,6 +1,10 @@ | |||||||
| package dynamicstruct | package dynamicstruct | ||||||
|  |  | ||||||
| import "reflect" | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"reflect" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| 	// Builder 运行时动态生成结构体的接口约束 | 	// Builder 运行时动态生成结构体的接口约束 | ||||||
| @ -86,8 +90,28 @@ func MergeStructs(values ...any) Builder { | |||||||
| 	return builder | 	return builder | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // IsNestedField 判断是否是嵌套结构体 | ||||||
|  | func (b *builderImpl) parseNestedField(fieldName string) ([]string, bool) { | ||||||
|  | 	fieldNameArr := strings.Split(strings.Trim(fieldName, "."), ".") | ||||||
|  | 	return fieldNameArr, len(fieldNameArr) > 1 | ||||||
|  | } | ||||||
|  |  | ||||||
| // AddField 添加结构体字段 | // AddField 添加结构体字段 | ||||||
| func (b *builderImpl) AddField(name string, pkg string, typ any, tag string, anonymous bool) Builder { | func (b *builderImpl) AddField(name string, pkg string, typ any, tag string, anonymous bool) Builder { | ||||||
|  | 	// 判断是否嵌套结构体 | ||||||
|  | 	fieldNameArr, isNestedField := b.parseNestedField(name) | ||||||
|  | 	if !isNestedField { | ||||||
|  | 		// 普通字段 | ||||||
|  | 		b.addNormalField(name, pkg, typ, tag, anonymous) | ||||||
|  | 		return b | ||||||
|  | 	} | ||||||
|  | 	// TODO : 添加嵌套的结构体 | ||||||
|  | 	fmt.Println(fieldNameArr) | ||||||
|  | 	return b | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // addNormalField 添加普通无嵌套的字段 | ||||||
|  | func (b *builderImpl) addNormalField(name string, pkg string, typ any, tag string, anonymous bool) Builder { | ||||||
| 	if existFieldCfg := b.GetField(name); nil != existFieldCfg { | 	if existFieldCfg := b.GetField(name); nil != existFieldCfg { | ||||||
| 		// 说明已存在指定名称字段 | 		// 说明已存在指定名称字段 | ||||||
| 		// 重复添加, 则会议后面的标签以及类型, 覆盖前面的值 | 		// 重复添加, 则会议后面的标签以及类型, 覆盖前面的值 | ||||||
| @ -102,7 +126,6 @@ func (b *builderImpl) AddField(name string, pkg string, typ any, tag string, ano | |||||||
| 		anonymous: anonymous, | 		anonymous: anonymous, | ||||||
| 		pkg:       pkg, | 		pkg:       pkg, | ||||||
| 	}) | 	}) | ||||||
| 	return b |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // RemoveField 根据名称移除结构体字段 | // RemoveField 根据名称移除结构体字段 | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user