mirror of
https://gitee.com/johng/gf
synced 2026-06-06 16:21:40 +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.
288 lines
6.2 KiB
Go
288 lines
6.2 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 gbinary
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/binary"
|
|
"fmt"
|
|
"math"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/internal/intlog"
|
|
)
|
|
|
|
// LeEncode encodes one or multiple `values` into bytes using LittleEndian.
|
|
// It uses type asserting checking the type of each value of `values` and internally
|
|
// calls corresponding converting function do the bytes converting.
|
|
//
|
|
// It supports common variable type asserting, and finally it uses fmt.Sprintf converting
|
|
// value to string and then to bytes.
|
|
func LeEncode(values ...any) []byte {
|
|
buf := new(bytes.Buffer)
|
|
for i := 0; i < len(values); i++ {
|
|
if values[i] == nil {
|
|
return buf.Bytes()
|
|
}
|
|
switch value := values[i].(type) {
|
|
case int:
|
|
buf.Write(LeEncodeInt(value))
|
|
case int8:
|
|
buf.Write(LeEncodeInt8(value))
|
|
case int16:
|
|
buf.Write(LeEncodeInt16(value))
|
|
case int32:
|
|
buf.Write(LeEncodeInt32(value))
|
|
case int64:
|
|
buf.Write(LeEncodeInt64(value))
|
|
case uint:
|
|
buf.Write(LeEncodeUint(value))
|
|
case uint8:
|
|
buf.Write(LeEncodeUint8(value))
|
|
case uint16:
|
|
buf.Write(LeEncodeUint16(value))
|
|
case uint32:
|
|
buf.Write(LeEncodeUint32(value))
|
|
case uint64:
|
|
buf.Write(LeEncodeUint64(value))
|
|
case bool:
|
|
buf.Write(LeEncodeBool(value))
|
|
case string:
|
|
buf.Write(LeEncodeString(value))
|
|
case []byte:
|
|
buf.Write(value)
|
|
case float32:
|
|
buf.Write(LeEncodeFloat32(value))
|
|
case float64:
|
|
buf.Write(LeEncodeFloat64(value))
|
|
|
|
default:
|
|
if err := binary.Write(buf, binary.LittleEndian, value); err != nil {
|
|
intlog.Errorf(context.TODO(), `%+v`, err)
|
|
buf.Write(LeEncodeString(fmt.Sprintf("%v", value)))
|
|
}
|
|
}
|
|
}
|
|
return buf.Bytes()
|
|
}
|
|
|
|
func LeEncodeByLength(length int, values ...any) []byte {
|
|
b := LeEncode(values...)
|
|
if len(b) < length {
|
|
b = append(b, make([]byte, length-len(b))...)
|
|
} else if len(b) > length {
|
|
b = b[0:length]
|
|
}
|
|
return b
|
|
}
|
|
|
|
func LeDecode(b []byte, values ...any) error {
|
|
var (
|
|
err error
|
|
buf = bytes.NewBuffer(b)
|
|
)
|
|
for i := 0; i < len(values); i++ {
|
|
if err = binary.Read(buf, binary.LittleEndian, values[i]); err != nil {
|
|
err = gerror.Wrap(err, `binary.Read failed`)
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func LeEncodeString(s string) []byte {
|
|
return []byte(s)
|
|
}
|
|
|
|
func LeDecodeToString(b []byte) string {
|
|
return string(b)
|
|
}
|
|
|
|
func LeEncodeBool(b bool) []byte {
|
|
if b {
|
|
return []byte{1}
|
|
} else {
|
|
return []byte{0}
|
|
}
|
|
}
|
|
|
|
func LeEncodeInt(i int) []byte {
|
|
if i <= math.MaxInt8 {
|
|
return EncodeInt8(int8(i))
|
|
} else if i <= math.MaxInt16 {
|
|
return EncodeInt16(int16(i))
|
|
} else if i <= math.MaxInt32 {
|
|
return EncodeInt32(int32(i))
|
|
} else {
|
|
return EncodeInt64(int64(i))
|
|
}
|
|
}
|
|
|
|
func LeEncodeUint(i uint) []byte {
|
|
if i <= math.MaxUint8 {
|
|
return EncodeUint8(uint8(i))
|
|
} else if i <= math.MaxUint16 {
|
|
return EncodeUint16(uint16(i))
|
|
} else if i <= math.MaxUint32 {
|
|
return EncodeUint32(uint32(i))
|
|
} else {
|
|
return EncodeUint64(uint64(i))
|
|
}
|
|
}
|
|
|
|
func LeEncodeInt8(i int8) []byte {
|
|
return []byte{byte(i)}
|
|
}
|
|
|
|
func LeEncodeUint8(i uint8) []byte {
|
|
return []byte{i}
|
|
}
|
|
|
|
func LeEncodeInt16(i int16) []byte {
|
|
b := make([]byte, 2)
|
|
binary.LittleEndian.PutUint16(b, uint16(i))
|
|
return b
|
|
}
|
|
|
|
func LeEncodeUint16(i uint16) []byte {
|
|
b := make([]byte, 2)
|
|
binary.LittleEndian.PutUint16(b, i)
|
|
return b
|
|
}
|
|
|
|
func LeEncodeInt32(i int32) []byte {
|
|
b := make([]byte, 4)
|
|
binary.LittleEndian.PutUint32(b, uint32(i))
|
|
return b
|
|
}
|
|
|
|
func LeEncodeUint32(i uint32) []byte {
|
|
b := make([]byte, 4)
|
|
binary.LittleEndian.PutUint32(b, i)
|
|
return b
|
|
}
|
|
|
|
func LeEncodeInt64(i int64) []byte {
|
|
b := make([]byte, 8)
|
|
binary.LittleEndian.PutUint64(b, uint64(i))
|
|
return b
|
|
}
|
|
|
|
func LeEncodeUint64(i uint64) []byte {
|
|
b := make([]byte, 8)
|
|
binary.LittleEndian.PutUint64(b, i)
|
|
return b
|
|
}
|
|
|
|
func LeEncodeFloat32(f float32) []byte {
|
|
bits := math.Float32bits(f)
|
|
b := make([]byte, 4)
|
|
binary.LittleEndian.PutUint32(b, bits)
|
|
return b
|
|
}
|
|
|
|
func LeEncodeFloat64(f float64) []byte {
|
|
bits := math.Float64bits(f)
|
|
b := make([]byte, 8)
|
|
binary.LittleEndian.PutUint64(b, bits)
|
|
return b
|
|
}
|
|
|
|
func LeDecodeToInt(b []byte) int {
|
|
if len(b) < 2 {
|
|
return int(LeDecodeToUint8(b))
|
|
} else if len(b) < 3 {
|
|
return int(LeDecodeToUint16(b))
|
|
} else if len(b) < 5 {
|
|
return int(LeDecodeToUint32(b))
|
|
} else {
|
|
return int(LeDecodeToUint64(b))
|
|
}
|
|
}
|
|
|
|
func LeDecodeToUint(b []byte) uint {
|
|
if len(b) < 2 {
|
|
return uint(LeDecodeToUint8(b))
|
|
} else if len(b) < 3 {
|
|
return uint(LeDecodeToUint16(b))
|
|
} else if len(b) < 5 {
|
|
return uint(LeDecodeToUint32(b))
|
|
} else {
|
|
return uint(LeDecodeToUint64(b))
|
|
}
|
|
}
|
|
|
|
func LeDecodeToBool(b []byte) bool {
|
|
if len(b) == 0 {
|
|
return false
|
|
}
|
|
if bytes.Equal(b, make([]byte, len(b))) {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func LeDecodeToInt8(b []byte) int8 {
|
|
if len(b) == 0 {
|
|
panic(`empty slice given`)
|
|
}
|
|
return int8(b[0])
|
|
}
|
|
|
|
func LeDecodeToUint8(b []byte) uint8 {
|
|
if len(b) == 0 {
|
|
panic(`empty slice given`)
|
|
}
|
|
return b[0]
|
|
}
|
|
|
|
func LeDecodeToInt16(b []byte) int16 {
|
|
return int16(binary.LittleEndian.Uint16(LeFillUpSize(b, 2)))
|
|
}
|
|
|
|
func LeDecodeToUint16(b []byte) uint16 {
|
|
return binary.LittleEndian.Uint16(LeFillUpSize(b, 2))
|
|
}
|
|
|
|
func LeDecodeToInt32(b []byte) int32 {
|
|
return int32(binary.LittleEndian.Uint32(LeFillUpSize(b, 4)))
|
|
}
|
|
|
|
func LeDecodeToUint32(b []byte) uint32 {
|
|
return binary.LittleEndian.Uint32(LeFillUpSize(b, 4))
|
|
}
|
|
|
|
func LeDecodeToInt64(b []byte) int64 {
|
|
return int64(binary.LittleEndian.Uint64(LeFillUpSize(b, 8)))
|
|
}
|
|
|
|
func LeDecodeToUint64(b []byte) uint64 {
|
|
return binary.LittleEndian.Uint64(LeFillUpSize(b, 8))
|
|
}
|
|
|
|
func LeDecodeToFloat32(b []byte) float32 {
|
|
return math.Float32frombits(binary.LittleEndian.Uint32(LeFillUpSize(b, 4)))
|
|
}
|
|
|
|
func LeDecodeToFloat64(b []byte) float64 {
|
|
return math.Float64frombits(binary.LittleEndian.Uint64(LeFillUpSize(b, 8)))
|
|
}
|
|
|
|
// LeFillUpSize fills up the bytes `b` to given length `l` using LittleEndian.
|
|
//
|
|
// Note that it creates a new bytes slice by copying the original one to avoid changing
|
|
// the original parameter bytes.
|
|
func LeFillUpSize(b []byte, l int) []byte {
|
|
if len(b) >= l {
|
|
return b[:l]
|
|
}
|
|
c := make([]byte, l)
|
|
copy(c, b)
|
|
return c
|
|
}
|