Skip to content
鼓励作者:欢迎打赏犒劳

数据类型转换工具类

go的类型转换真的烦!!!!!!!

type_transformation.go

指针转值

go
func StringVal(p *string) string {
    if p == nil {
        return ""
    }
    return *p
}

func IntVal(p *int) int {
    if p == nil {
        return 0
    }
    return *p
}

func Int32Val(p *int32) int32 {
    if p == nil {
        return 0
    }
    return *p
}

func Int64Val(p *int64) int64 {
    if p == nil {
        return 0
    }
    return *p
}

func TimeVal(p *time.Time) int64 {
    if p == nil {
        return 0
    }
    return p.Unix()
}

值转指针

go
// Package ptr 提供快速创建基本类型指针的辅助函数。
// 常用于 GORM 模型初始化、API 请求体构造、可选配置字段等场景。
package ptr

import "time"

// String 返回字符串指针
func String(v string) *string {
	return &v
}

// Int 返回整型指针
func Int(v int) *int {
	return &v
}

// Int8 返回 int8 指针
func Int8(v int8) *int8 {
	return &v
}

// Int16 返回 int16 指针
func Int16(v int16) *int16 {
	return &v
}

// Int32 返回 int32 指针
func Int32(v int32) *int32 {
	return &v
}

// Int64 返回 int64 指针
func Int64(v int64) *int64 {
	return &v
}

// Uint 返回 uint 指针
func Uint(v uint) *uint {
	return &v
}

// Uint8 返回 uint8 指针
func Uint8(v uint8) *uint8 {
	return &v
}

// Uint16 返回 uint16 指针
func Uint16(v uint16) *uint16 {
	return &v
}

// Uint32 返回 uint32 指针
func Uint32(v uint32) *uint32 {
	return &v
}

// Uint64 返回 uint64 指针
func Uint64(v uint64) *uint64 {
	return &v
}

// Float32 返回 float32 指针
func Float32(v float32) *float32 {
	return &v
}

// Float64 返回 float64 指针
func Float64(v float64) *float64 {
	return &v
}

// Bool 返回布尔值指针
func Bool(v bool) *bool {
	return &v
}

// Byte 返回 byte(uint8)指针
func Byte(v byte) *byte {
	return &v
}

// Time 返回 time.Time 指针
func Time(t time.Time) *time.Time {
	return &t
}

// Any 返回任意类型的指针(泛型)
func Any[T any](v T) *T {
	return &v
}

StructToMap

go
package bean_cover_util

import (
	"reflect"
	"strings"
)

// StructToMap 将结构体转换为 map[string]interface{}。
//
// 支持:
//   - 指针或值类型的 struct
//   - json tag 解析(忽略 `,omitempty` 等修饰)
//   - 嵌套 struct 转 map
//   - struct slice 转 []map[string]interface{}
//
// 规则:
//   - 忽略 json:"-" 或无 json tag 的字段
//   - 若 tag 包含 ,(如 "name,omitempty"),仅取前面部分
//   - 若 tag 为空,则使用小驼峰字段名(fieldName)
//   - 非导出字段(小写开头)不会被反射访问
func StructToMap(v interface{}) map[string]interface{} {
	m := make(map[string]interface{})
	rv := reflect.ValueOf(v)

	// 解引用指针
	if rv.Kind() == reflect.Ptr {
		rv = rv.Elem()
	}

	// 确保是结构体
	if rv.Kind() != reflect.Struct {
		return m
	}

	rt := rv.Type()
	for i := 0; i < rv.NumField(); i++ {
		field := rt.Field(i)
		value := rv.Field(i)

		// 获取 json tag
		tag := field.Tag.Get("json")
		if tag == "-" || tag == "" {
			continue
		}

		// 去除 tag 中的选项(如 ",omitempty")
		if idx := strings.Index(tag, ","); idx != -1 {
			tag = tag[:idx]
		}

		// 如果 tag 为空,使用小驼峰字段名
		if tag == "" {
			tag = strings.ToLower(field.Name[:1]) + field.Name[1:]
		}

		// 处理嵌套结构体
		if value.Kind() == reflect.Struct {
			m[tag] = StructToMap(value.Interface())
		} else if value.Kind() == reflect.Slice {
			// 处理 []struct 类型
			elemKind := value.Type().Elem().Kind()
			if elemKind == reflect.Struct {
				sliceMap := make([]interface{}, value.Len())
				for j := 0; j < value.Len(); j++ {
					sliceMap[j] = StructToMap(value.Index(j).Interface())
				}
				m[tag] = sliceMap
			} else {
				// 普通 slice(如 []string, []int)
				m[tag] = value.Interface()
			}
		} else {
			// 基本类型直接赋值
			m[tag] = value.Interface()
		}
	}

	return m
}

如有转载或 CV 的请标注本站原文地址