2021-01-17 21:46:25 +08:00
|
|
|
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
2017-12-31 11:09:16 +08:00
|
|
|
//
|
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
2019-02-02 16:18:25 +08:00
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
2017-12-31 18:19:58 +08:00
|
|
|
|
2020-04-29 00:14:29 +08:00
|
|
|
// Package gconv implements powerful and convenient converting functionality for any types of variables.
|
2020-06-04 20:13:33 +08:00
|
|
|
//
|
2024-09-09 16:17:01 +08:00
|
|
|
// This package should keep much fewer dependencies with other packages.
|
2017-12-31 11:09:16 +08:00
|
|
|
package gconv
|
|
|
|
|
|
|
|
|
|
import (
|
2025-03-06 23:04:26 +08:00
|
|
|
"reflect"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
|
|
|
"github.com/gogf/gf/v2/util/gconv/internal/converter"
|
2024-09-09 16:17:01 +08:00
|
|
|
"github.com/gogf/gf/v2/util/gconv/internal/localinterface"
|
|
|
|
|
"github.com/gogf/gf/v2/util/gconv/internal/structcache"
|
2017-12-31 11:09:16 +08:00
|
|
|
)
|
|
|
|
|
|
2025-03-06 23:04:26 +08:00
|
|
|
// Converter is the manager for type converting.
|
|
|
|
|
type Converter interface {
|
|
|
|
|
ConverterForConvert
|
|
|
|
|
ConverterForRegister
|
|
|
|
|
ConverterForInt
|
|
|
|
|
ConverterForUint
|
|
|
|
|
ConverterForTime
|
|
|
|
|
ConverterForFloat
|
|
|
|
|
ConverterForMap
|
|
|
|
|
ConverterForSlice
|
|
|
|
|
ConverterForStruct
|
|
|
|
|
ConverterForBasic
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForBasic is the basic converting interface.
|
|
|
|
|
type ConverterForBasic interface {
|
2025-03-14 18:23:07 +08:00
|
|
|
Scan(srcValue, dstPointer any, option ...ScanOption) (err error)
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
String(anyInput any) (string, error)
|
|
|
|
|
Bool(anyInput any) (bool, error)
|
|
|
|
|
Rune(anyInput any) (rune, error)
|
2025-03-06 23:04:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForTime is the converting interface for time.
|
|
|
|
|
type ConverterForTime interface {
|
|
|
|
|
Time(v any, format ...string) (time.Time, error)
|
|
|
|
|
Duration(v any) (time.Duration, error)
|
|
|
|
|
GTime(v any, format ...string) (*gtime.Time, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForInt is the converting interface for integer.
|
|
|
|
|
type ConverterForInt interface {
|
|
|
|
|
Int(v any) (int, error)
|
|
|
|
|
Int8(v any) (int8, error)
|
|
|
|
|
Int16(v any) (int16, error)
|
|
|
|
|
Int32(v any) (int32, error)
|
|
|
|
|
Int64(v any) (int64, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForUint is the converting interface for unsigned integer.
|
|
|
|
|
type ConverterForUint interface {
|
|
|
|
|
Uint(v any) (uint, error)
|
|
|
|
|
Uint8(v any) (uint8, error)
|
|
|
|
|
Uint16(v any) (uint16, error)
|
|
|
|
|
Uint32(v any) (uint32, error)
|
|
|
|
|
Uint64(v any) (uint64, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForFloat is the converting interface for float.
|
|
|
|
|
type ConverterForFloat interface {
|
|
|
|
|
Float32(v any) (float32, error)
|
|
|
|
|
Float64(v any) (float64, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForMap is the converting interface for map.
|
|
|
|
|
type ConverterForMap interface {
|
2025-03-14 18:23:07 +08:00
|
|
|
Map(v any, option ...MapOption) (map[string]any, error)
|
|
|
|
|
MapStrStr(v any, option ...MapOption) (map[string]string, error)
|
2025-03-06 23:04:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForSlice is the converting interface for slice.
|
|
|
|
|
type ConverterForSlice interface {
|
|
|
|
|
Bytes(v any) ([]byte, error)
|
|
|
|
|
Runes(v any) ([]rune, error)
|
2025-03-14 18:23:07 +08:00
|
|
|
SliceAny(v any, option ...SliceOption) ([]any, error)
|
|
|
|
|
SliceFloat32(v any, option ...SliceOption) ([]float32, error)
|
|
|
|
|
SliceFloat64(v any, option ...SliceOption) ([]float64, error)
|
|
|
|
|
SliceInt(v any, option ...SliceOption) ([]int, error)
|
|
|
|
|
SliceInt32(v any, option ...SliceOption) ([]int32, error)
|
|
|
|
|
SliceInt64(v any, option ...SliceOption) ([]int64, error)
|
|
|
|
|
SliceUint(v any, option ...SliceOption) ([]uint, error)
|
|
|
|
|
SliceUint32(v any, option ...SliceOption) ([]uint32, error)
|
|
|
|
|
SliceUint64(v any, option ...SliceOption) ([]uint64, error)
|
|
|
|
|
SliceStr(v any, option ...SliceOption) ([]string, error)
|
|
|
|
|
SliceMap(v any, option ...SliceMapOption) ([]map[string]any, error)
|
2025-03-06 23:04:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForStruct is the converting interface for struct.
|
|
|
|
|
type ConverterForStruct interface {
|
2025-03-14 18:23:07 +08:00
|
|
|
Struct(params, pointer any, option ...StructOption) (err error)
|
|
|
|
|
Structs(params, pointer any, option ...StructsOption) (err error)
|
2025-03-06 23:04:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForConvert is the converting interface for custom converting.
|
|
|
|
|
type ConverterForConvert interface {
|
2025-03-14 18:23:07 +08:00
|
|
|
ConvertWithRefer(fromValue, referValue any, option ...ConvertOption) (any, error)
|
|
|
|
|
ConvertWithTypeName(fromValue any, toTypeName string, option ...ConvertOption) (any, error)
|
2025-03-06 23:04:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ConverterForRegister is the converting interface for custom converter registration.
|
|
|
|
|
type ConverterForRegister interface {
|
|
|
|
|
RegisterTypeConverterFunc(f any) error
|
|
|
|
|
RegisterAnyConverterFunc(f AnyConvertFunc, types ...reflect.Type)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type (
|
|
|
|
|
// AnyConvertFunc is the function type for converting any to specified type.
|
|
|
|
|
AnyConvertFunc = structcache.AnyConvertFunc
|
|
|
|
|
|
|
|
|
|
// MapOption specifies the option for map converting.
|
|
|
|
|
MapOption = converter.MapOption
|
|
|
|
|
|
|
|
|
|
// SliceOption is the option for Slice type converting.
|
|
|
|
|
SliceOption = converter.SliceOption
|
|
|
|
|
|
2025-03-14 18:23:07 +08:00
|
|
|
// SliceMapOption is the option for SliceMap function.
|
|
|
|
|
SliceMapOption = converter.SliceMapOption
|
|
|
|
|
|
2025-03-06 23:04:26 +08:00
|
|
|
// ScanOption is the option for the Scan function.
|
|
|
|
|
ScanOption = converter.ScanOption
|
|
|
|
|
|
|
|
|
|
// StructOption is the option for Struct converting.
|
|
|
|
|
StructOption = converter.StructOption
|
|
|
|
|
|
2025-03-14 18:23:07 +08:00
|
|
|
// StructsOption is the option for Structs function.
|
|
|
|
|
StructsOption = converter.StructsOption
|
|
|
|
|
|
2025-03-06 23:04:26 +08:00
|
|
|
// ConvertOption is the option for converting.
|
|
|
|
|
ConvertOption = converter.ConvertOption
|
2019-03-15 00:22:39 +08:00
|
|
|
)
|
|
|
|
|
|
2024-09-23 11:50:48 +08:00
|
|
|
// IUnmarshalValue is the interface for custom defined types customizing value assignment.
|
|
|
|
|
// Note that only pointer can implement interface IUnmarshalValue.
|
|
|
|
|
type IUnmarshalValue = localinterface.IUnmarshalValue
|
|
|
|
|
|
2025-03-06 23:04:26 +08:00
|
|
|
var (
|
|
|
|
|
// defaultConverter is the default management object converting.
|
|
|
|
|
defaultConverter = converter.NewConverter()
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// NewConverter creates and returns management object for type converting.
|
|
|
|
|
func NewConverter() Converter {
|
|
|
|
|
return converter.NewConverter()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RegisterConverter registers custom converter.
|
2025-11-10 21:40:35 +08:00
|
|
|
//
|
2025-03-06 23:04:26 +08:00
|
|
|
// Deprecated: use RegisterTypeConverterFunc instead for clear
|
|
|
|
|
func RegisterConverter(fn any) (err error) {
|
|
|
|
|
return RegisterTypeConverterFunc(fn)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RegisterTypeConverterFunc registers custom converter.
|
|
|
|
|
func RegisterTypeConverterFunc(fn any) (err error) {
|
|
|
|
|
return defaultConverter.RegisterTypeConverterFunc(fn)
|
2024-09-09 16:17:01 +08:00
|
|
|
}
|
2025-03-14 18:23:07 +08:00
|
|
|
|
|
|
|
|
// RegisterAnyConverterFunc registers custom type converting function for specified type.
|
|
|
|
|
func RegisterAnyConverterFunc(f AnyConvertFunc, types ...reflect.Type) {
|
|
|
|
|
defaultConverter.RegisterAnyConverterFunc(f, types...)
|
|
|
|
|
}
|