当前仓库属于暂停状态,部分功能使用受限,详情请查阅 仓库状态说明
1 Star 0 Fork 0

玄学编程 / task-flow
暂停

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
utils.go 1.43 KB
一键复制 编辑 原始数据 按行查看 历史
玄学编程 提交于 2023-09-11 15:57 . supply testcase and fix bugs
package task
import (
"reflect"
"runtime"
"strings"
)
func GetFuncName(f interface{}) string {
funcValue := reflect.ValueOf(f)
funcType := funcValue.Type()
if funcType.Kind() != reflect.Func {
panic("param must be func")
}
absoluteName := runtime.FuncForPC(funcValue.Pointer()).Name()
if len(absoluteName) == 0 {
panic("It is not allowed to use GetFuncName to an anonymous function.")
}
if strings.Contains(absoluteName, ".") {
splits := strings.Split(absoluteName, ".")
return splits[len(splits)-1]
}
return absoluteName
}
func CopyProperties(src, dst interface{}) {
srcValue := reflect.ValueOf(src)
dstValue := reflect.ValueOf(dst)
if srcValue.Kind() != reflect.Ptr || dstValue.Kind() != reflect.Ptr {
panic("Both src and dst must be pointers")
}
srcElem := srcValue.Elem()
dstElem := dstValue.Elem()
srcType := srcElem.Type()
for i := 0; i < srcElem.NumField(); i++ {
srcField := srcElem.Field(i)
srcFieldName := srcType.Field(i).Name
if dstField := dstElem.FieldByName(srcFieldName); dstField.IsValid() && dstField.Type() == srcField.Type() {
if !srcField.IsZero() {
dstField.Set(srcField)
}
}
}
}
func CreateStruct[T any](src any) (target T) {
srcValue := reflect.ValueOf(src)
if srcValue.Kind() != reflect.Ptr {
panic("src must be a pointer")
}
if reflect.TypeOf(target).Kind() != reflect.Struct {
panic("The generic type is not a struct")
}
CopyProperties(src, &target)
return target
}
Go
1
https://gitee.com/MetaphysicCoding/task-flow.git
git@gitee.com:MetaphysicCoding/task-flow.git
MetaphysicCoding
task-flow
task-flow
v1.2.0

搜索帮助