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

数据类型转换工具类

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

type_transformation_util.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
}

typeconv_util.go

interface{}的值转成对应的值

go
// Package typeconv 提供安全的 interface{} 到常用类型的转换函数。
package typeconv

import (
	"strconv"
	"strings"
)

// ToInt32 尝试将 v 转为 int32。
// 支持:int/uint/float/string 等。
func ToInt32(v interface{}) (int32, bool) {
	i64, ok := ToInt64(v)
	if !ok {
		return 0, false
	}
	if i64 < -2147483648 || i64 > 2147483647 { // int32 范围检查
		return 0, false
	}
	return int32(i64), true
}

// ToInt64 尝试将 v 转为 int64。
func ToInt64(v interface{}) (int64, bool) {
	switch x := v.(type) {
	case int:
		return int64(x), true
	case int8:
		return int64(x), true
	case int16:
		return int64(x), true
	case int32:
		return int64(x), true
	case int64:
		return x, true

	case uint:
		return int64(x), true
	case uint8:
		return int64(x), true
	case uint16:
		return int64(x), true
	case uint32:
		return int64(x), true
	case uint64:
		if x <= 9223372036854775807 { // math.MaxInt64
			return int64(x), true
		}
		return 0, false

	case float32:
		return int64(x), true
	case float64:
		return int64(x), true

	case string:
		x = strings.TrimSpace(x)
		if x == "" {
			return 0, false
		}
		if i, err := strconv.ParseInt(x, 10, 64); err == nil {
			return i, true
		}
		return 0, false

	case bool:
		return 0, false // 不自动转 bool 为 0/1

	default:
		return 0, false
	}
}

// ToString 尝试将 v 转为 string。
// 特别处理 nil、bool、数字等。
func ToString(v interface{}) (string, bool) {
	if v == nil {
		return "", false
	}
	switch x := v.(type) {
	case string:
		return x, true
	case int, int8, int16, int32, int64:
		return strconv.FormatInt(ToInt64Value(v), 10), true
	case uint, uint8, uint16, uint32, uint64:
		return strconv.FormatUint(ToUint64Value(v), 10), true
	case float32, float64:
		return strconv.FormatFloat(ToFloat64Value(v), 'f', -1, 64), true
	case bool:
		return strconv.FormatBool(x), true
	default:
		return "", false
	}
}

// ToBool 尝试将 v 转为 bool。
// 支持:true/false, "true"/"false", "1"/"0", 1/0 等。
func ToBool(v interface{}) (bool, bool) {
	switch x := v.(type) {
	case bool:
		return x, true
	case string:
		x = strings.ToLower(strings.TrimSpace(x))
		if x == "true" || x == "1" {
			return true, true
		}
		if x == "false" || x == "0" {
			return false, true
		}
		return false, false
	case int, int8, int16, int32, int64:
		i, _ := ToInt64(v)
		return i != 0, true
	case uint, uint8, uint16, uint32, uint64:
		i, _ := ToInt64(v)
		return i != 0, true
	case float32, float64:
		f, _ := ToFloat64(v)
		return f != 0, true
	default:
		return false, false
	}
}

// ToStringSlice 尝试将 v 转为 []string。
// 支持:[]interface{}, []string, 甚至单个 string(转为单元素切片)。
func ToStringSlice(v interface{}) ([]string, bool) {
	if v == nil {
		return nil, false
	}

	// 如果本身就是 []string
	if slice, ok := v.([]string); ok {
		return slice, true
	}

	// 如果是 []interface{}
	if arr, ok := v.([]interface{}); ok {
		result := make([]string, len(arr))
		for i, item := range arr {
			s, ok := ToString(item)
			if !ok {
				return nil, false
			}
			result[i] = s
		}
		return result, true
	}

	// 单个字符串?可选:是否允许自动包装?
	// 这里选择不允许,保持严格性
	return nil, false
}

// ToInt64Slice 尝试将 v 转为 []int64。
// 支持:[]interface{}, []int64, 甚至单个数字(不自动包装)。
func ToInt64Slice(v interface{}) ([]int64, bool) {
	if v == nil {
		return nil, false
	}

	// 如果本身就是 []int64
	if slice, ok := v.([]int64); ok {
		return slice, true
	}

	// 如果是 []interface{}
	if arr, ok := v.([]interface{}); ok {
		result := make([]int64, len(arr))
		for i, item := range arr {
			val, ok := ToInt64(item)
			if !ok {
				return nil, false
			}
			result[i] = val
		}
		return result, true
	}

	// 不支持单个值自动转为切片(保持类型安全)
	return nil, false
}

// ---- 辅助函数(内部使用)----

func ToInt64Value(v interface{}) int64 {
	if i, ok := ToInt64(v); ok {
		return i
	}
	return 0
}

func ToUint64Value(v interface{}) uint64 {
	switch x := v.(type) {
	case uint:
		return uint64(x)
	case uint8:
		return uint64(x)
	case uint16:
		return uint64(x)
	case uint32:
		return uint64(x)
	case uint64:
		return x
	case int:
		if x >= 0 {
			return uint64(x)
		}
	case int8:
		if x >= 0 {
			return uint64(x)
		}
	case int16:
		if x >= 0 {
			return uint64(x)
		}
	case int32:
		if x >= 0 {
			return uint64(x)
		}
	case int64:
		if x >= 0 {
			return uint64(x)
		}
	}
	return 0
}

func ToFloat64(v interface{}) (float64, bool) {
	switch x := v.(type) {
	case float32:
		return float64(x), true
	case float64:
		return x, true
	case int, int8, int16, int32, int64:
		i, ok := ToInt64(v)
		return float64(i), ok
	case uint, uint8, uint16, uint32, uint64:
		i, ok := ToInt64(v)
		return float64(i), ok
	case string:
		x = strings.TrimSpace(x)
		if x == "" {
			return 0, false
		}
		if f, err := strconv.ParseFloat(x, 64); err == nil {
			return f, true
		}
		return 0, false
	default:
		return 0, false
	}
}

func ToFloat64Value(v interface{}) float64 {
	if f, ok := ToFloat64(v); ok {
		return f
	}
	return 0
}

使用示例

go
package main

import (
	"fmt"
	"your-module/typeconv" // 替换为你的模块路径
)

func main() {
	// 测试各种转换
	cases := []interface{}{
		"123",
		float64(456),
		[]interface{}{"a", "b"},
		[]interface{}{1, 2, 3},
		"true",
		"1",
		0,
		nil,
	}

	for _, v := range cases {
		if s, ok := typeconv.ToString(v); ok {
			fmt.Printf("ToString(%v) = %q\n", v, s)
		}

		if i, ok := typeconv.ToInt32(v); ok {
			fmt.Printf("ToInt32(%v) = %d\n", v, i)
		}

		if b, ok := typeconv.ToBool(v); ok {
			fmt.Printf("ToBool(%v) = %t\n", v, b)
		}

		if arr, ok := typeconv.ToStringSlice(v); ok {
			fmt.Printf("ToStringSlice(%v) = %v\n", v, arr)
		}

		if iarr, ok := typeconv.ToInt64Slice(v); ok {
			fmt.Printf("ToInt64Slice(%v) = %v\n", v, iarr)
		}
		fmt.Println("---")
	}
}

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