mirror of
https://gitee.com/johng/gf
synced 2026-06-06 02:25:47 +08:00
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.
357 lines
6.6 KiB
Go
357 lines
6.6 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// 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,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package gvar_test
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/gogf/gf/v2/container/gvar"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/test/gtest"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
)
|
|
|
|
func Test_Set(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var v gvar.Var
|
|
v.Set(123.456)
|
|
t.Assert(v.Val(), 123.456)
|
|
})
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var v gvar.Var
|
|
v.Set(123.456)
|
|
t.Assert(v.Val(), 123.456)
|
|
})
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
objOne := gvar.New("old", true)
|
|
objOneOld, _ := objOne.Set("new").(string)
|
|
t.Assert(objOneOld, "old")
|
|
|
|
objTwo := gvar.New("old", false)
|
|
objTwoOld, _ := objTwo.Set("new").(string)
|
|
t.Assert(objTwoOld, "old")
|
|
})
|
|
}
|
|
|
|
func Test_Val(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
objOne := gvar.New(1, true)
|
|
objOneOld, _ := objOne.Val().(int)
|
|
t.Assert(objOneOld, 1)
|
|
|
|
objTwo := gvar.New(1, false)
|
|
objTwoOld, _ := objTwo.Val().(int)
|
|
t.Assert(objTwoOld, 1)
|
|
|
|
objOne = nil
|
|
t.Assert(objOne.Val(), nil)
|
|
})
|
|
}
|
|
|
|
func Test_Interface(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
objOne := gvar.New(1, true)
|
|
objOneOld, _ := objOne.Interface().(int)
|
|
t.Assert(objOneOld, 1)
|
|
|
|
objTwo := gvar.New(1, false)
|
|
objTwoOld, _ := objTwo.Interface().(int)
|
|
t.Assert(objTwoOld, 1)
|
|
})
|
|
}
|
|
|
|
func Test_IsNil(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
objOne := gvar.New(nil, true)
|
|
t.Assert(objOne.IsNil(), true)
|
|
|
|
objTwo := gvar.New("noNil", false)
|
|
t.Assert(objTwo.IsNil(), false)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Bytes(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
x := int32(1)
|
|
bytesBuffer := bytes.NewBuffer([]byte{})
|
|
binary.Write(bytesBuffer, binary.BigEndian, x)
|
|
|
|
objOne := gvar.New(bytesBuffer.Bytes(), true)
|
|
|
|
bBuf := bytes.NewBuffer(objOne.Bytes())
|
|
var y int32
|
|
binary.Read(bBuf, binary.BigEndian, &y)
|
|
|
|
t.Assert(x, y)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_String(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var str string = "hello"
|
|
objOne := gvar.New(str, true)
|
|
t.Assert(objOne.String(), str)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Bool(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var ok bool = true
|
|
objOne := gvar.New(ok, true)
|
|
t.Assert(objOne.Bool(), ok)
|
|
|
|
ok = false
|
|
objTwo := gvar.New(ok, true)
|
|
t.Assert(objTwo.Bool(), ok)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Int(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num int = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Int(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Int8(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num int8 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Int8(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Int16(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num int16 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Int16(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Int32(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num int32 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Int32(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Int64(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num int64 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Int64(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Uint(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num uint = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Uint(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Uint8(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num uint8 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Uint8(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Uint16(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num uint16 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Uint16(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Uint32(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num uint32 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Uint32(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Uint64(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num uint64 = 1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Uint64(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Float32(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num float32 = 1.1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Float32(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Float64(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var num float64 = 1.1
|
|
objOne := gvar.New(num, true)
|
|
t.Assert(objOne.Float64(), num)
|
|
|
|
})
|
|
}
|
|
|
|
func Test_Time(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var timeUnix int64 = 1556242660
|
|
objOne := gvar.New(timeUnix, true)
|
|
t.Assert(objOne.Time().Unix(), timeUnix)
|
|
})
|
|
}
|
|
|
|
func Test_GTime(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var timeUnix int64 = 1556242660
|
|
objOne := gvar.New(timeUnix, true)
|
|
t.Assert(objOne.GTime().Unix(), timeUnix)
|
|
})
|
|
}
|
|
|
|
func Test_Duration(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
var timeUnix int64 = 1556242660
|
|
objOne := gvar.New(timeUnix, true)
|
|
t.Assert(objOne.Duration(), time.Duration(timeUnix))
|
|
})
|
|
}
|
|
|
|
func Test_UnmarshalJson(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
type V struct {
|
|
Name string
|
|
Var *gvar.Var
|
|
}
|
|
var v *V
|
|
err := gconv.Struct(map[string]any{
|
|
"name": "john",
|
|
"var": "v",
|
|
}, &v)
|
|
t.AssertNil(err)
|
|
t.Assert(v.Name, "john")
|
|
t.Assert(v.Var.String(), "v")
|
|
})
|
|
gtest.C(t, func(t *gtest.T) {
|
|
type V struct {
|
|
Name string
|
|
Var gvar.Var
|
|
}
|
|
var v *V
|
|
err := gconv.Struct(map[string]any{
|
|
"name": "john",
|
|
"var": "v",
|
|
}, &v)
|
|
t.AssertNil(err)
|
|
t.Assert(v.Name, "john")
|
|
t.Assert(v.Var.String(), "v")
|
|
})
|
|
}
|
|
|
|
func Test_UnmarshalValue(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
type V struct {
|
|
Name string
|
|
Var *gvar.Var
|
|
}
|
|
var v *V
|
|
err := gconv.Struct(map[string]any{
|
|
"name": "john",
|
|
"var": "v",
|
|
}, &v)
|
|
t.AssertNil(err)
|
|
t.Assert(v.Name, "john")
|
|
t.Assert(v.Var.String(), "v")
|
|
})
|
|
gtest.C(t, func(t *gtest.T) {
|
|
type V struct {
|
|
Name string
|
|
Var gvar.Var
|
|
}
|
|
var v *V
|
|
err := gconv.Struct(map[string]any{
|
|
"name": "john",
|
|
"var": "v",
|
|
}, &v)
|
|
t.AssertNil(err)
|
|
t.Assert(v.Name, "john")
|
|
t.Assert(v.Var.String(), "v")
|
|
})
|
|
}
|
|
|
|
func Test_Copy(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
src := g.Map{
|
|
"k1": "v1",
|
|
"k2": "v2",
|
|
}
|
|
srcVar := gvar.New(src)
|
|
dstVar := srcVar.Copy()
|
|
t.Assert(srcVar.Map(), src)
|
|
t.Assert(dstVar.Map(), src)
|
|
|
|
dstVar.Map()["k3"] = "v3"
|
|
t.Assert(srcVar.Map(), g.Map{
|
|
"k1": "v1",
|
|
"k2": "v2",
|
|
})
|
|
t.Assert(dstVar.Map(), g.Map{
|
|
"k1": "v1",
|
|
"k2": "v2",
|
|
"k3": "v3",
|
|
})
|
|
})
|
|
}
|
|
|
|
func Test_DeepCopy(t *testing.T) {
|
|
gtest.C(t, func(t *gtest.T) {
|
|
src := g.Map{
|
|
"k1": "v1",
|
|
"k2": "v2",
|
|
}
|
|
srcVar := gvar.New(src)
|
|
copyVar := srcVar.DeepCopy().(*gvar.Var)
|
|
copyVar.Set(g.Map{
|
|
"k3": "v3",
|
|
"k4": "v4",
|
|
})
|
|
t.AssertNE(srcVar, copyVar)
|
|
|
|
srcVar = nil
|
|
t.AssertNil(srcVar.DeepCopy())
|
|
})
|
|
}
|