Files
gf/encoding/gbinary/gbinary_be.go
hailaz ee24da4e72 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

288 lines
6.1 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"
)
// BeEncode encodes one or multiple `values` into bytes using BigEndian.
// 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 BeEncode(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(BeEncodeInt(value))
case int8:
buf.Write(BeEncodeInt8(value))
case int16:
buf.Write(BeEncodeInt16(value))
case int32:
buf.Write(BeEncodeInt32(value))
case int64:
buf.Write(BeEncodeInt64(value))
case uint:
buf.Write(BeEncodeUint(value))
case uint8:
buf.Write(BeEncodeUint8(value))
case uint16:
buf.Write(BeEncodeUint16(value))
case uint32:
buf.Write(BeEncodeUint32(value))
case uint64:
buf.Write(BeEncodeUint64(value))
case bool:
buf.Write(BeEncodeBool(value))
case string:
buf.Write(BeEncodeString(value))
case []byte:
buf.Write(value)
case float32:
buf.Write(BeEncodeFloat32(value))
case float64:
buf.Write(BeEncodeFloat64(value))
default:
if err := binary.Write(buf, binary.BigEndian, value); err != nil {
intlog.Errorf(context.TODO(), `%+v`, err)
buf.Write(BeEncodeString(fmt.Sprintf("%v", value)))
}
}
}
return buf.Bytes()
}
func BeEncodeByLength(length int, values ...any) []byte {
b := BeEncode(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 BeDecode(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.BigEndian, values[i]); err != nil {
err = gerror.Wrap(err, `binary.Read failed`)
return err
}
}
return nil
}
func BeEncodeString(s string) []byte {
return []byte(s)
}
func BeDecodeToString(b []byte) string {
return string(b)
}
func BeEncodeBool(b bool) []byte {
if b {
return []byte{1}
} else {
return []byte{0}
}
}
func BeEncodeInt(i int) []byte {
if i <= math.MaxInt8 {
return BeEncodeInt8(int8(i))
} else if i <= math.MaxInt16 {
return BeEncodeInt16(int16(i))
} else if i <= math.MaxInt32 {
return BeEncodeInt32(int32(i))
} else {
return BeEncodeInt64(int64(i))
}
}
func BeEncodeUint(i uint) []byte {
if i <= math.MaxUint8 {
return BeEncodeUint8(uint8(i))
} else if i <= math.MaxUint16 {
return BeEncodeUint16(uint16(i))
} else if i <= math.MaxUint32 {
return BeEncodeUint32(uint32(i))
} else {
return BeEncodeUint64(uint64(i))
}
}
func BeEncodeInt8(i int8) []byte {
return []byte{byte(i)}
}
func BeEncodeUint8(i uint8) []byte {
return []byte{i}
}
func BeEncodeInt16(i int16) []byte {
b := make([]byte, 2)
binary.BigEndian.PutUint16(b, uint16(i))
return b
}
func BeEncodeUint16(i uint16) []byte {
b := make([]byte, 2)
binary.BigEndian.PutUint16(b, i)
return b
}
func BeEncodeInt32(i int32) []byte {
b := make([]byte, 4)
binary.BigEndian.PutUint32(b, uint32(i))
return b
}
func BeEncodeUint32(i uint32) []byte {
b := make([]byte, 4)
binary.BigEndian.PutUint32(b, i)
return b
}
func BeEncodeInt64(i int64) []byte {
b := make([]byte, 8)
binary.BigEndian.PutUint64(b, uint64(i))
return b
}
func BeEncodeUint64(i uint64) []byte {
b := make([]byte, 8)
binary.BigEndian.PutUint64(b, i)
return b
}
func BeEncodeFloat32(f float32) []byte {
bits := math.Float32bits(f)
b := make([]byte, 4)
binary.BigEndian.PutUint32(b, bits)
return b
}
func BeEncodeFloat64(f float64) []byte {
bits := math.Float64bits(f)
b := make([]byte, 8)
binary.BigEndian.PutUint64(b, bits)
return b
}
func BeDecodeToInt(b []byte) int {
if len(b) < 2 {
return int(BeDecodeToUint8(b))
} else if len(b) < 3 {
return int(BeDecodeToUint16(b))
} else if len(b) < 5 {
return int(BeDecodeToUint32(b))
} else {
return int(BeDecodeToUint64(b))
}
}
func BeDecodeToUint(b []byte) uint {
if len(b) < 2 {
return uint(BeDecodeToUint8(b))
} else if len(b) < 3 {
return uint(BeDecodeToUint16(b))
} else if len(b) < 5 {
return uint(BeDecodeToUint32(b))
} else {
return uint(BeDecodeToUint64(b))
}
}
func BeDecodeToBool(b []byte) bool {
if len(b) == 0 {
return false
}
if bytes.Equal(b, make([]byte, len(b))) {
return false
}
return true
}
func BeDecodeToInt8(b []byte) int8 {
if len(b) == 0 {
panic(`empty slice given`)
}
return int8(b[0])
}
func BeDecodeToUint8(b []byte) uint8 {
if len(b) == 0 {
panic(`empty slice given`)
}
return b[0]
}
func BeDecodeToInt16(b []byte) int16 {
return int16(binary.BigEndian.Uint16(BeFillUpSize(b, 2)))
}
func BeDecodeToUint16(b []byte) uint16 {
return binary.BigEndian.Uint16(BeFillUpSize(b, 2))
}
func BeDecodeToInt32(b []byte) int32 {
return int32(binary.BigEndian.Uint32(BeFillUpSize(b, 4)))
}
func BeDecodeToUint32(b []byte) uint32 {
return binary.BigEndian.Uint32(BeFillUpSize(b, 4))
}
func BeDecodeToInt64(b []byte) int64 {
return int64(binary.BigEndian.Uint64(BeFillUpSize(b, 8)))
}
func BeDecodeToUint64(b []byte) uint64 {
return binary.BigEndian.Uint64(BeFillUpSize(b, 8))
}
func BeDecodeToFloat32(b []byte) float32 {
return math.Float32frombits(binary.BigEndian.Uint32(BeFillUpSize(b, 4)))
}
func BeDecodeToFloat64(b []byte) float64 {
return math.Float64frombits(binary.BigEndian.Uint64(BeFillUpSize(b, 8)))
}
// BeFillUpSize fills up the bytes `b` to given length `l` using big BigEndian.
//
// Note that it creates a new bytes slice by copying the original one to avoid changing
// the original parameter bytes.
func BeFillUpSize(b []byte, l int) []byte {
if len(b) >= l {
return b[:l]
}
c := make([]byte, l)
copy(c[l-len(b):], b)
return c
}