Compare commits

..

15 Commits

Author SHA1 Message Date
5073f25691 chore: chmod +x update_version.sh (#4413) 2025-09-03 10:36:56 +08:00
40e97f1325 fix: #4269 (#4412)
fixed #4269
2025-09-02 22:49:05 +08:00
502d158bc0 fix: version 2.9.2 (#4405) 2025-09-01 15:33:50 +08:00
f08897a114 chore(tablewriter): upgrade to v1.0.9 and refactor table rendering logic (#4352)
### What’s Changed

* Upgraded `github.com/olekukonko/tablewriter` from previous version to
**v1.0.9**.

---------

Co-authored-by: hailaz <739476267@qq.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-01 12:20:22 +08:00
b6181e4bde fix: report coverage on the latest go version (#4398) 2025-08-29 16:10:37 +08:00
613
f8cdeae2d7 fix(net/goai): fix g.Meta is passed as parameters of a request (#4397)
fix https://github.com/gogf/gf/issues/4247

<img width="2860" height="2308" alt="image"
src="https://github.com/user-attachments/assets/755cfe8a-b3ae-4c5a-ba04-68cc1b188ca7"
/>
2025-08-29 15:30:28 +08:00
bea060af4c feat: update linter config and deprecation notice (#4399)
- Add `gofmt` rewrite-rules to `.golangci.yml` for code formatting
consistency.
- Update deprecation comment in `gpage.go` to specify removal in version
3.0.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-29 15:26:56 +08:00
94cc233325 fix: disable specific staticcheck rules and update lint config (#4396)
fix: disable specific staticcheck rules and update lint config

- Disabled staticcheck rules SA1029, SA1019, S1000, and related checks
in `.golangci.yml` to filter out unwanted linter errors.
- Updated staticcheck checks list for more precise linting control.
- Clarified configuration for easier maintenance and future updates.

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: hailaz <739476267@qq.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-29 10:32:30 +08:00
fsl
71743e6903 chore: add OpenSSF Scorecard for README.md (#3696)
Why is this needed:

The OpenSSF Scorecard improves open-source project's security by
providing automated, transparent assessments of their security
practices. It will help you identify vulnerabilities, adhere to best
practices, and continuously enhance your security posture, increasing
user trust and reducing the risk of security exploits.

I'll be the one to create the PR to add the scorecard GitHub action, and
I will also work with you to remediate the identified vulnerabilities.
I'll go through each [scorecard
check](https://github.com/ossf/scorecard/blob/main/docs/checks.md) to
see where the score has dropped and how it can be improved.


Integrate [scorecard](https://github.com/ossf/scorecard) in CI, and
display a Scorecard badge on the gogf repository
You also need to manually create a project, refer to
https://bestpractices.coreinfrastructure.org/en/projects
Manually create an gogf organization to report results, please see
https://sonarcloud.io/explore/projects?sort=-analysis_date

Signed-off-by: fsl <1171313930@qq.com>
2025-08-29 10:28:29 +08:00
f9ec3b19f7 fix(net/ghttp): wrong in-tag param parse for query param (#4227) (#4228)
Fixed issue #4227 and add unit test

---------

Co-authored-by: hailaz <739476267@qq.com>
2025-08-29 09:46:48 +08:00
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
26f20787ba perf(net/gclient): optimize default http.Transport connection pool configuration (#4390) 2025-08-28 15:08:25 +08:00
1371b3bad5 fix: revert #4388 (#4392) 2025-08-28 13:00:08 +08:00
1da73451b9 fix: spacing in min value validation message (#4388)
Fix spacing in min value validation message
2025-08-27 19:05:55 +08:00
94b623e126 fix: update dependencies to version v2.9.1 for various contrib modules and drivers (#4386)
Fixes #4385
2025-08-27 12:21:38 +08:00
647 changed files with 5011 additions and 4578 deletions

View File

@ -38,7 +38,6 @@ jobs:
# 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
# When adding new go version to the list, make sure:
# 1. Update the `LATEST_GO_VERSION` env variable.
# 2. Update the `Report Coverage` action.
# 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
go-version: [ "1.23", "1.24", "1.25" ]
goarch: [ "386", "amd64" ]
@ -48,9 +47,9 @@ jobs:
# Service containers to run with `code-test`
services:
# Etcd service.
# docker run -d --name etcd -p 2379:2379 -e ALLOW_NONE_AUTHENTICATION=yes bitnami/etcd:3.4.24
# docker run -d --name etcd -p 2379:2379 -e ALLOW_NONE_AUTHENTICATION=yes bitnamilegacy/etcd:3.4.24
etcd:
image: bitnami/etcd:3.4.24
image: bitnamilegacy/etcd:3.4.24
env:
ALLOW_NONE_AUTHENTICATION: yes
ports:
@ -263,8 +262,8 @@ jobs:
- name: Report Coverage
uses: codecov/codecov-action@v4
# Only report coverage on the latest go version and amd64 arch
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && matrix.go-version == '1.23' && matrix.goarch == 'amd64' }}
# Only report coverage on the latest go version
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && matrix.go-version == env.LATEST_GO_VERSION }}
with:
flags: go-${{ matrix.go-version }}-${{ matrix.goarch }}
token: ${{ secrets.CODECOV_TOKEN }}

View File

@ -30,7 +30,7 @@ concurrency:
env:
TZ: "Asia/Shanghai"
# for unit testing cases of some components that only execute on the latest go version.
LATEST_GO_VERSION: "1.24"
LATEST_GO_VERSION: "1.25"
jobs:
code-test:

View File

@ -4,7 +4,7 @@
# If a copy of the MIT was not distributed with this file,
# You can obtain one at https://github.com/gogf/gf.
name: GolangCI Lint
name: golangci-lint
on:
push:
branches:
@ -36,6 +36,8 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Setup Golang ${{ matrix.go-version }}
uses: actions/setup-go@v5
with:

50
.github/workflows/scripts/update_version.sh vendored Executable file
View File

@ -0,0 +1,50 @@
#!/usr/bin/env bash
# Check if the number of parameters is 2
if [ $# -ne 2 ]; then
echo "Invalid parameters, please execute in format: version.sh [directory] [version]"
echo "Example: version.sh ./contrib v1.0.0"
exit 1
fi
# Check if the first parameter is a directory and exists
if [ ! -d "$1" ]; then
echo "Error: Directory does not exist"
exit 1
fi
# Check if the second parameter starts with 'v'
if [[ "$2" != v* ]]; then
echo "Error: Version number does not start with 'v'"
exit 1
fi
workdir=$1
newVersion=$2
echo "Preparing to replace version numbers in all go.mod files under ${workdir} directory to ${newVersion}"
# Check if file exists
if [ -f "go.work" ]; then
# File exists, rename it
mv go.work go.work.${newVersion}
echo "Backup go.work file to avoid affecting the upgrade"
fi
for file in `find ${workdir} -name go.mod`; do
goModPath=$(dirname $file)
echo ""
echo "processing dir: $goModPath"
cd $goModPath
go mod tidy
go list -f "{{if and (not .Indirect) (not .Main)}}{{.Path}}@${newVersion}{{end}}" -m all | grep "^github.com/gogf/gf"
go list -f "{{if and (not .Indirect) (not .Main)}}{{.Path}}@${newVersion}{{end}}" -m all | grep "^github.com/gogf/gf" | xargs -L1 go get -v
go mod tidy
cd -
done
if [ -f "go.work.${newVersion}" ]; then
# File exists, rename it back
mv go.work.${newVersion} go.work
echo "Restore go.work file"
fi

View File

@ -4,13 +4,12 @@ on:
push:
# Sequence of patterns matched against refs/tags
tags:
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
env:
TZ: Asia/Shanghai
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
build:
name: Auto Creating Tags
@ -18,22 +17,43 @@ jobs:
steps:
- name: Checkout Github Code
uses: actions/checkout@v5
- name: Auto Creating Tags For Contrib Packages
run: |
git config --global user.email "tagrobot@goframe.org"
git config --global user.name "TagRobot"
# auto create tags for contrib packages.
for file in `find contrib -name go.mod`; do
tag=$(dirname $file)/$GITHUB_REF_NAME
tag=$(dirname $file)/${{ github.ref_name }}
git tag $tag
git push origin $tag
done
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
commit-message: 'update gf cli to ${{ github.ref_name }}'
title: 'fix: update gf cli to ${{ github.ref_name }}'
base: master
branch: fix/${{ github.ref_name }}
delete-branch: true
- name: Commit & Push changes
uses: actions-js/push@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: fix/${{ github.ref_name }}
author_name: TagRobot
author_email: tagrobot@goframe.org
message: 'fix: update gf cli to ${{ github.ref_name }}'
- name: update dependencies
run: |
go env -w GOPRIVATE=github.com/gogf/gf
.github/workflows/scripts/update_version.sh ./cmd/gfly ${{ github.ref_name }}
- name: Auto Creating Tags For cli tool
run: |
git config --global user.email "tagrobot@goframe.org"
git config --global user.name "TagRobot"
# auto create tag for cli tool
for file in `find cmd -name go.mod`; do
tag=$(dirname $file)/$GITHUB_REF_NAME
tag=$(dirname $file)/${{ github.ref_name }}
git tag $tag
git push origin $tag
done

View File

@ -1,7 +1,7 @@
version: "2"
run:
concurrency: 4
go: "1.23"
go: "1.25"
modules-download-mode: readonly
issues-exit-code: 2
tests: false
@ -188,7 +188,7 @@ formatters:
- blank
- default
- dot
- prefix(github.com/gogf/gf)
- prefix(github.com/gogf/gf/v2)
- prefix(github.com/gogf/gf/cmd)
- prefix(github.com/gogf/gfcontrib)
- prefix(github.com/gogf/gf/example)
@ -196,6 +196,19 @@ formatters:
no-lex-order: false
gofmt:
simplify: true
rewrite-rules:
- pattern: 'interface{}'
replacement: 'any'
- pattern: 'reflect.Ptr'
replacement: 'reflect.Pointer'
- pattern: 'ioutil.ReadAll'
replacement: 'io.ReadAll'
- pattern: 'ioutil.WriteFile'
replacement: 'os.WriteFile'
- pattern: 'ioutil.ReadFile'
replacement: 'os.ReadFile'
- pattern: 'ioutil.NopCloser'
replacement: 'io.NopCloser'
goimports:
local-prefixes:
- github.com/gogf/gf/v2

View File

@ -1,4 +1,19 @@
#!/usr/bin/env bash
# Function to detect OS and set sed parameters
setup_sed() {
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
SED_INPLACE="sed -i ''"
else
# Linux/Windows Git Bash
SED_INPLACE="sed -i"
fi
}
# Initialize sed command
setup_sed
if [ $# -ne 2 ]; then
echo "Parameter exception, please execute in the format of $0 [directory] [version number]"
echo "PS$0 ./ v2.4.0"
@ -28,10 +43,10 @@ fi
if [[ true ]]; then
# Use sed to replace the version number in version.go
sed -i '' 's/VERSION = ".*"/VERSION = "'${newVersion}'"/' version.go
$SED_INPLACE 's/VERSION = ".*"/VERSION = "'${newVersion}'"/' version.go
# Use sed to replace the version number in README.MD
sed -i '' 's/version=[^"]*/version='${newVersion}'/' README.MD
$SED_INPLACE 's/version=[^"]*/version='${newVersion}'/' README.MD
fi
if [ -f "go.work" ]; then
@ -67,7 +82,7 @@ for file in `find ${workdir} -name go.mod`; do
fi
go mod tidy
# Remove toolchain line if exists
sed -i '' '/^toolchain/d' go.mod
$SED_INPLACE '/^toolchain/d' go.mod
# Upgrading only GoFrame related libraries, sometimes even if a version number is specified,
# it may not be possible to successfully upgrade. Please confirm before submitting the code
@ -75,7 +90,7 @@ for file in `find ${workdir} -name go.mod`; do
go list -f "{{if and (not .Indirect) (not .Main)}}{{.Path}}@${newVersion}{{end}}" -m all | grep "^github.com/gogf/gf" | xargs -L1 go get -v
go mod tidy
# Remove toolchain line if exists
sed -i '' '/^toolchain/d' go.mod
$SED_INPLACE '/^toolchain/d' go.mod
if [ $goModPath = "./cmd/gf" ]; then
go mod edit -dropreplace github.com/gogf/gf/v2
go mod edit -dropreplace github.com/gogf/gf/contrib/drivers/clickhouse/v2

View File

@ -4,6 +4,8 @@
[![Go Reference](https://pkg.go.dev/badge/github.com/gogf/gf/v2.svg)](https://pkg.go.dev/github.com/gogf/gf/v2)
[![GoFrame CI](https://github.com/gogf/gf/actions/workflows/ci-main.yml/badge.svg)](https://github.com/gogf/gf/actions/workflows/ci-main.yml)
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/gogf/gf/badge)](https://scorecard.dev/viewer/?uri=github.com/gogf/gf)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/9233/badge)](https://bestpractices.coreinfrastructure.org/projects/9233)
[![Go Report Card](https://goreportcard.com/badge/github.com/gogf/gf/v2)](https://goreportcard.com/report/github.com/gogf/gf/v2)
[![Code Coverage](https://codecov.io/gh/gogf/gf/branch/master/graph/badge.svg)](https://codecov.io/gh/gogf/gf)
[![Production Ready](https://img.shields.io/badge/production-ready-blue.svg?style=flat)](https://github.com/gogf/gf)
@ -36,7 +38,7 @@ A powerful framework for faster, easier, and more efficient project development.
💖 [Thanks to all the contributors who made GoFrame possible](https://github.com/gogf/gf/graphs/contributors) 💖
<a href="https://github.com/gogf/gf/graphs/contributors">
<img src="https://goframe.org/img/contributors.svg?version=v2.9.0" alt="goframe contributors"/>
<img src="https://goframe.org/img/contributors.svg?version=v2.9.2" alt="goframe contributors"/>
</a>
# License

View File

@ -3,15 +3,15 @@ module github.com/gogf/gf/cmd/gf/v2
go 1.23.0
require (
github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.9.1
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.9.1
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.1
github.com/gogf/gf/contrib/drivers/oracle/v2 v2.9.1
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.9.1
github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.9.1
github.com/gogf/gf/v2 v2.9.1
github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.9.2
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.9.2
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.2
github.com/gogf/gf/contrib/drivers/oracle/v2 v2.9.2
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.9.2
github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.9.2
github.com/gogf/gf/v2 v2.9.2
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f
github.com/olekukonko/tablewriter v0.0.5
github.com/olekukonko/tablewriter v1.0.9
github.com/schollz/progressbar/v3 v3.15.0
golang.org/x/mod v0.26.0
golang.org/x/tools v0.35.0
@ -42,6 +42,8 @@ require (
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/microsoft/go-mssqldb v1.7.1 // indirect
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
github.com/olekukonko/errors v1.1.0 // indirect
github.com/olekukonko/ll v0.0.9 // indirect
github.com/paulmach/orb v0.7.1 // indirect
github.com/pierrec/lz4/v4 v4.1.14 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect

View File

@ -90,7 +90,6 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
@ -99,8 +98,12 @@ github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpth
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/mkevac/debugcharts v0.0.0-20191222103121-ae1c48aa8615/go.mod h1:Ad7oeElCZqA1Ufj0U9/liOF4BtVepxRcTvr2ey7zTvM=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM=
github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g=
github.com/olekukonko/tablewriter v1.0.9 h1:XGwRsYLC2bY7bNd93Dk51bcPZksWZmLYuaTHR0FqfL8=
github.com/olekukonko/tablewriter v1.0.9/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo=
github.com/paulmach/orb v0.7.1 h1:Zha++Z5OX/l168sqHK3k4z18LDvr+YAO/VjK0ReQ9rU=
github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=

View File

@ -11,6 +11,8 @@ import (
"context"
"github.com/olekukonko/tablewriter"
"github.com/olekukonko/tablewriter/renderer"
"github.com/olekukonko/tablewriter/tw"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gproc"
@ -61,10 +63,23 @@ func (c cEnv) Index(ctx context.Context, in cEnvInput) (out *cEnvOutput, err err
}
array = append(array, []string{gstr.Trim(match[1]), gstr.Trim(match[2])})
}
tw := tablewriter.NewWriter(buffer)
tw.SetColumnAlignment([]int{tablewriter.ALIGN_LEFT, tablewriter.ALIGN_LEFT})
tw.AppendBulk(array)
tw.Render()
table := tablewriter.NewTable(buffer,
tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{
Settings: tw.Settings{
Separators: tw.Separators{BetweenRows: tw.Off, BetweenColumns: tw.On},
},
Symbols: tw.NewSymbols(tw.StyleASCII),
})),
tablewriter.WithConfig(tablewriter.Config{
Row: tw.CellConfig{
Formatting: tw.CellFormatting{AutoWrap: tw.WrapNone},
Alignment: tw.CellAlignment{PerColumn: []tw.Align{tw.AlignLeft, tw.AlignLeft}},
ColMaxWidths: tw.CellWidth{Global: 84},
},
}),
)
table.Bulk(array)
table.Render()
mlog.Print(buffer.String())
return
}

View File

@ -104,7 +104,7 @@ func Test_Build_Single_VarMap(t *testing.T) {
t.Assert(gfile.Exists(binaryPath), false)
_, err = f.Index(ctx, cBuildInput{
VarMap: map[string]interface{}{
VarMap: map[string]any{
"a": "1",
"b": "2",
},

View File

@ -378,7 +378,7 @@ func Test_Gen_Dao_Issue3459(t *testing.T) {
filepath.FromSlash(testPath + "/model/do/table_user.go"),
filepath.FromSlash(testPath + "/model/entity/table_user.go"),
}
for i, _ := range files {
for i := range files {
//_ = gfile.PutContents(expectFiles[i], gfile.GetContents(files[i]))
t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i]))
}
@ -450,7 +450,7 @@ func Test_Gen_Dao_Issue3749(t *testing.T) {
filepath.FromSlash(testPath + "/model/do/table_user.go"),
filepath.FromSlash(testPath + "/model/entity/table_user.go"),
}
for i, _ := range files {
for i := range files {
//_ = gfile.PutContents(expectFiles[i], gfile.GetContents(files[i]))
t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i]))
}

View File

@ -107,7 +107,7 @@ func Test_Gen_Dao_Default(t *testing.T) {
filepath.FromSlash(testPath + "/model/do/table_user.go"),
filepath.FromSlash(testPath + "/model/entity/table_user.go"),
}
for i, _ := range files {
for i := range files {
t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i]))
}
})
@ -208,7 +208,7 @@ func Test_Gen_Dao_TypeMapping(t *testing.T) {
filepath.FromSlash(testPath + "/model/do/table_user.go"),
filepath.FromSlash(testPath + "/model/entity/table_user.go"),
}
for i, _ := range files {
for i := range files {
//_ = gfile.PutContents(expectFiles[i], gfile.GetContents(files[i]))
t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i]))
}
@ -311,7 +311,7 @@ func Test_Gen_Dao_FieldMapping(t *testing.T) {
filepath.FromSlash(testPath + "/model/do/table_user.go"),
filepath.FromSlash(testPath + "/model/entity/table_user.go"),
}
for i, _ := range files {
for i := range files {
//_ = gfile.PutContents(expectFiles[i], gfile.GetContents(files[i]))
t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i]))
}
@ -403,7 +403,7 @@ func Test_Gen_Dao_Sqlite3(t *testing.T) {
filepath.FromSlash(testPath + "/model/do/table_user.go"),
filepath.FromSlash(testPath + "/model/entity/table_user.go"),
}
for i, _ := range files {
for i := range files {
//_ = gfile.PutContents(expectFiles[i], gfile.GetContents(files[i]))
t.Assert(gfile.GetContents(files[i]), gfile.GetContents(expectFiles[i]))
}

View File

@ -9,13 +9,14 @@ package genctrl
import (
"context"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
const (

View File

@ -11,6 +11,9 @@ import (
"fmt"
"strings"
"github.com/olekukonko/tablewriter"
"github.com/olekukonko/tablewriter/renderer"
"github.com/olekukonko/tablewriter/tw"
"golang.org/x/mod/modfile"
"github.com/gogf/gf/v2/container/garray"
@ -99,6 +102,20 @@ var (
Type: "float64",
},
}
// tablewriter Options
twRenderer = tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{
Borders: tw.Border{Top: tw.Off, Bottom: tw.Off, Left: tw.Off, Right: tw.Off},
Settings: tw.Settings{
Separators: tw.Separators{BetweenRows: tw.Off, BetweenColumns: tw.Off},
},
Symbols: tw.NewSymbols(tw.StyleASCII),
}))
twConfig = tablewriter.WithConfig(tablewriter.Config{
Row: tw.CellConfig{
Formatting: tw.CellFormatting{AutoWrap: tw.WrapNone},
},
})
)
func (c CGenDao) Dao(ctx context.Context, in CGenDaoInput) (out *CGenDaoOutput, err error) {

View File

@ -211,13 +211,9 @@ func generateColumnNamesForDao(fieldMap map[string]*gdb.TableField, removeFieldP
fmt.Sprintf(` #"%s",`, field.Name),
}
}
tw := tablewriter.NewWriter(buffer)
tw.SetBorder(false)
tw.SetRowLine(false)
tw.SetAutoWrapText(false)
tw.SetColumnSeparator("")
tw.AppendBulk(array)
tw.Render()
table := tablewriter.NewTable(buffer, twRenderer, twConfig)
table.Bulk(array)
table.Render()
namesContent := buffer.String()
// Let's do this hack of table writer for indent!
namesContent = gstr.Replace(namesContent, " #", "")
@ -252,13 +248,9 @@ func generateColumnDefinitionForDao(fieldMap map[string]*gdb.TableField, removeF
" #" + fmt.Sprintf(`// %s`, comment),
}
}
tw := tablewriter.NewWriter(buffer)
tw.SetBorder(false)
tw.SetRowLine(false)
tw.SetAutoWrapText(false)
tw.SetColumnSeparator("")
tw.AppendBulk(array)
tw.Render()
table := tablewriter.NewTable(buffer, twRenderer, twConfig)
table.Bulk(array)
table.Render()
defineContent := buffer.String()
// Let's do this hack of table writer for indent!
defineContent = gstr.Replace(defineContent, " #", "")

View File

@ -45,14 +45,14 @@ func generateDo(ctx context.Context, in CGenDaoInternalInput) {
IsDo: true,
})
)
// replace all types to interface{}.
// replace all types to any.
structDefinition, _ = gregex.ReplaceStringFuncMatch(
"([A-Z]\\w*?)\\s+([\\w\\*\\.]+?)\\s+(//)",
structDefinition,
func(match []string) string {
// If the type is already a pointer/slice/map, it does nothing.
if !gstr.HasPrefix(match[2], "*") && !gstr.HasPrefix(match[2], "[]") && !gstr.HasPrefix(match[2], "map") {
return fmt.Sprintf(`%s interface{} %s`, match[1], match[3])
return fmt.Sprintf(`%s any %s`, match[1], match[3])
}
return match[0]
},

View File

@ -41,22 +41,18 @@ func generateStructDefinition(ctx context.Context, in generateStructDefinitionIn
appendImports = append(appendImports, imports)
}
}
tw := tablewriter.NewWriter(buffer)
tw.SetBorder(false)
tw.SetRowLine(false)
tw.SetAutoWrapText(false)
tw.SetColumnSeparator("")
tw.AppendBulk(array)
tw.Render()
table := tablewriter.NewTable(buffer, twRenderer, twConfig)
table.Bulk(array)
table.Render()
stContent := buffer.String()
// Let's do this hack of table writer for indent!
stContent = gstr.Replace(stContent, " #", "")
stContent = gstr.Replace(stContent, "` ", "`")
stContent = gstr.Replace(stContent, "``", "")
buffer.Reset()
buffer.WriteString(fmt.Sprintf("type %s struct {\n", in.StructName))
fmt.Fprintf(buffer, "type %s struct {\n", in.StructName)
if in.IsDo {
buffer.WriteString(fmt.Sprintf("g.Meta `orm:\"table:%s, do:true\"`\n", in.TableName))
fmt.Fprintf(buffer, "g.Meta `orm:\"table:%s, do:true\"`\n", in.TableName)
}
buffer.WriteString(stContent)
buffer.WriteString("}")

View File

@ -113,12 +113,12 @@ func (p *EnumsParser) ParsePackage(pkg *packages.Package) {
}
func (p *EnumsParser) Export() string {
var typeEnumMap = make(map[string][]interface{})
var typeEnumMap = make(map[string][]any)
for _, enum := range p.enums {
if typeEnumMap[enum.Type] == nil {
typeEnumMap[enum.Type] = make([]interface{}, 0)
typeEnumMap[enum.Type] = make([]any, 0)
}
var value interface{}
var value any
switch enum.Kind {
case constant.Int:
value = gconv.Int64(enum.Value)

View File

@ -109,7 +109,7 @@ func (c CGenPb) tagCommentIntoListMap(comment string, lineTagMap *gmap.ListMap)
func (c CGenPb) listMapToStructTag(lineTagMap *gmap.ListMap) string {
var tag string
lineTagMap.Iterator(func(key, value interface{}) bool {
lineTagMap.Iterator(func(key, value any) bool {
if tag != "" {
tag += " "
}

View File

@ -15,6 +15,8 @@ import (
"strings"
"github.com/olekukonko/tablewriter"
"github.com/olekukonko/tablewriter/renderer"
"github.com/olekukonko/tablewriter/tw"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/container/gset"
@ -443,13 +445,22 @@ func generateEntityMessageDefinition(entityName string, fieldMap map[string]*gdb
appendImports = append(appendImports, imports)
}
}
tw := tablewriter.NewWriter(buffer)
tw.SetBorder(false)
tw.SetRowLine(false)
tw.SetAutoWrapText(false)
tw.SetColumnSeparator("")
tw.AppendBulk(array)
tw.Render()
table := tablewriter.NewTable(buffer,
tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{
Borders: tw.Border{Top: tw.Off, Bottom: tw.Off, Left: tw.On, Right: tw.Off},
Settings: tw.Settings{
Separators: tw.Separators{BetweenRows: tw.Off, BetweenColumns: tw.Off},
},
Symbols: tw.NewSymbolCustom("Proto").WithColumn(" "),
})),
tablewriter.WithConfig(tablewriter.Config{
Row: tw.CellConfig{
Formatting: tw.CellFormatting{AutoWrap: tw.WrapNone},
},
}),
)
table.Bulk(array)
table.Render()
stContent := buffer.String()
// Let's do this hack of table writer for indent!
stContent = regexp.MustCompile(`\s+\n`).ReplaceAllString(gstr.Replace(stContent, " #", ""), "\n")

View File

@ -13,8 +13,6 @@ import (
"sync"
"sync/atomic"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/container/gset"
@ -25,6 +23,9 @@ import (
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
const (

View File

@ -33,7 +33,7 @@ func (c CGenService) generateType(generatedContent *bytes.Buffer, srcStructFunct
generatedContent.WriteString("type(")
generatedContent.WriteString("\n")
srcStructFunctions.Iterator(func(key, value interface{}) bool {
srcStructFunctions.Iterator(func(key, value any) bool {
var (
funcContents = make([]string, 0)
funcContent string
@ -71,7 +71,7 @@ func (c CGenService) generateVar(generatedContent *bytes.Buffer, srcStructFuncti
// Generating variable and register definitions.
var variableContent string
srcStructFunctions.Iterator(func(key, value interface{}) bool {
srcStructFunctions.Iterator(func(key, value any) bool {
structName := key.(string)
variableContent += gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentVariable, g.MapStrStr{
"{StructName}": structName,
@ -93,7 +93,7 @@ func (c CGenService) generateVar(generatedContent *bytes.Buffer, srcStructFuncti
// See: const.TemplateGenServiceContentRegister
func (c CGenService) generateFunc(generatedContent *bytes.Buffer, srcStructFunctions *gmap.ListMap) {
// Variable register function definitions.
srcStructFunctions.Iterator(func(key, value interface{}) bool {
srcStructFunctions.Iterator(func(key, value any) bool {
structName := key.(string)
generatedContent.WriteString(gstr.Trim(gstr.ReplaceByMap(consts.TemplateGenServiceContentRegister, g.MapStrStr{
"{StructName}": structName,

View File

@ -12,11 +12,11 @@ import (
// TableUser is the golang structure of table table_user for DAO operations like Where/Data.
type TableUser struct {
g.Meta `orm:"table:table_user, do:true"`
Id interface{} // User ID
Passport interface{} // User Passport
Password interface{} // User Password
Nickname interface{} // User Nickname
Score interface{} // Total score amount.
Id any // User ID
Passport any // User Passport
Password any // User Password
Nickname any // User Nickname
Score any // Total score amount.
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -12,11 +12,11 @@ import (
// TableUser is the golang structure of table table_user for DAO operations like Where/Data.
type TableUser struct {
g.Meta `orm:"table:table_user, do:true"`
Id interface{} // User ID
Passport interface{} // User Passport
Password interface{} // User Password
Nickname interface{} // User Nickname
Score interface{} // Total score amount.
Id any // User ID
Passport any // User Passport
Password any // User Password
Nickname any // User Nickname
Score any // Total score amount.
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -12,10 +12,10 @@ import (
// TableUser is the golang structure of table table_user for DAO operations like Where/Data.
type TableUser struct {
g.Meta `orm:"table:table_user, do:true"`
Id interface{} //
Passport interface{} //
Password interface{} //
Nickname interface{} //
Id any //
Passport any //
Password any //
Nickname any //
CreatedAt *gtime.Time //
UpdatedAt *gtime.Time //
}

View File

@ -12,11 +12,11 @@ import (
// TableUser is the golang structure of table table_user for DAO operations like Where/Data.
type TableUser struct {
g.Meta `orm:"table:table_user, do:true"`
Id interface{} // User ID
Passport interface{} // User Passport
Password interface{} // User Password
Nickname interface{} // User Nickname
Score interface{} // Total score amount.
Id any // User ID
Passport any // User Passport
Password any // User Password
Nickname any // User Nickname
Score any // Total score amount.
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -63,14 +63,14 @@ func (s *sArticle) T3(ctx context.Context, b *gdbas.Model) (c, d *gdbas.Model, e
* random comment
*/
// func (s *sArticle) T4(i interface{}) interface{}
// func (s *sArticle) T4(i any) any
// # $ % ^ & * ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /
func (s *sArticle) T4(i interface{}) interface{} {
func (s *sArticle) T4(i any) any {
return nil
}
/**
* func (s *sArticle) T4(i interface{}) interface{} {
* func (s *sArticle) T4(i any) any {
* return nil
* }
*/

View File

@ -36,9 +36,9 @@ type (
* @author oldme
*/
T3(ctx context.Context, b *gdbas.Model) (c *gdbas.Model, d *gdbas.Model, err error)
// func (s *sArticle) T4(i interface{}) interface{}
// func (s *sArticle) T4(i any) any
// # $ % ^ & * ( ) _ + - = { } | [ ] \ : " ; ' < > ? , . /
T4(i interface{}) interface{}
T4(i any) any
}
)

View File

@ -12,11 +12,11 @@ import (
// User1 is the golang structure of table user1 for DAO operations like Where/Data.
type User1 struct {
g.Meta `orm:"table:user1, do:true"`
Id interface{} // User ID
Passport interface{} // User Passport
Password interface{} // User Password
Nickname interface{} // User Nickname
Score interface{} // Total score amount.
Id any // User ID
Passport any // User Passport
Password any // User Password
Nickname any // User Nickname
Score any // Total score amount.
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -12,11 +12,11 @@ import (
// User2 is the golang structure of table user2 for DAO operations like Where/Data.
type User2 struct {
g.Meta `orm:"table:user2, do:true"`
Id interface{} // User ID
Passport interface{} // User Passport
Password interface{} // User Password
Nickname interface{} // User Nickname
Score interface{} // Total score amount.
Id any // User ID
Passport any // User Passport
Password any // User Password
Nickname any // User Nickname
Score any // Total score amount.
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -12,11 +12,11 @@ import (
// User1 is the golang structure of table user1 for DAO operations like Where/Data.
type User1 struct {
g.Meta `orm:"table:user1, do:true"`
Id interface{} // User ID
Passport interface{} // User Passport
Password interface{} // User Password
Nickname interface{} // User Nickname
Score interface{} // Total score amount.
Id any // User ID
Passport any // User Passport
Password any // User Password
Nickname any // User Nickname
Score any // Total score amount.
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -12,11 +12,11 @@ import (
// User2 is the golang structure of table user2 for DAO operations like Where/Data.
type User2 struct {
g.Meta `orm:"table:user2, do:true"`
Id interface{} // User ID
Passport interface{} // User Passport
Password interface{} // User Password
Nickname interface{} // User Nickname
Score interface{} // Total score amount.
Id any // User ID
Passport any // User Passport
Password any // User Password
Nickname any // User Nickname
Score any // Total score amount.
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -12,11 +12,11 @@ import (
// TableUser is the golang structure of table table_user for DAO operations like Where/Data.
type TableUser struct {
g.Meta `orm:"table:table_user, do:true"`
Id interface{} // User ID
ParentId interface{} //
Passport interface{} // User Passport
PassWord interface{} // User Password
Nickname2 interface{} // User Nickname
Id any // User ID
ParentId any //
Passport any // User Passport
PassWord any // User Password
Nickname2 any // User Nickname
CreateAt *gtime.Time // Created Time
UpdateAt *gtime.Time // Updated Time
}

View File

@ -51,26 +51,26 @@ func SetHeaderPrint(enabled bool) {
}
}
func Print(v ...interface{}) {
func Print(v ...any) {
logger.Print(ctx, v...)
}
func Printf(format string, v ...interface{}) {
func Printf(format string, v ...any) {
logger.Printf(ctx, format, v...)
}
func Fatal(v ...interface{}) {
func Fatal(v ...any) {
logger.Fatal(ctx, v...)
}
func Fatalf(format string, v ...interface{}) {
func Fatalf(format string, v ...any) {
logger.Fatalf(ctx, format, v...)
}
func Debug(v ...interface{}) {
func Debug(v ...any) {
logger.Debug(ctx, v...)
}
func Debugf(format string, v ...interface{}) {
func Debugf(format string, v ...any) {
logger.Debugf(ctx, format, v...)
}

View File

@ -12,12 +12,13 @@ import (
"golang.org/x/tools/imports"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gproc"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
// GoFmt formats the source file and adds or removes import statements as necessary.

View File

@ -28,7 +28,7 @@ import (
// when its initialization and cannot be changed then.
type Array struct {
mu rwmutex.RWMutex
array []interface{}
array []any
}
// New creates and returns an empty array.
@ -49,7 +49,7 @@ func NewArray(safe ...bool) *Array {
func NewArraySize(size int, cap int, safe ...bool) *Array {
return &Array{
mu: rwmutex.Create(safe...),
array: make([]interface{}, size, cap),
array: make([]any, size, cap),
}
}
@ -59,7 +59,7 @@ func NewArrayRange(start, end, step int, safe ...bool) *Array {
if step == 0 {
panic(fmt.Sprintf(`invalid step value: %d`, step))
}
slice := make([]interface{}, 0)
slice := make([]any, 0)
index := 0
for i := start; i <= end; i += step {
slice = append(slice, i)
@ -70,20 +70,20 @@ func NewArrayRange(start, end, step int, safe ...bool) *Array {
// NewFrom is alias of NewArrayFrom.
// See NewArrayFrom.
func NewFrom(array []interface{}, safe ...bool) *Array {
func NewFrom(array []any, safe ...bool) *Array {
return NewArrayFrom(array, safe...)
}
// NewFromCopy is alias of NewArrayFromCopy.
// See NewArrayFromCopy.
func NewFromCopy(array []interface{}, safe ...bool) *Array {
func NewFromCopy(array []any, safe ...bool) *Array {
return NewArrayFromCopy(array, safe...)
}
// NewArrayFrom creates and returns an array with given slice `array`.
// The parameter `safe` is used to specify whether using array in concurrent-safety,
// which is false in default.
func NewArrayFrom(array []interface{}, safe ...bool) *Array {
func NewArrayFrom(array []any, safe ...bool) *Array {
return &Array{
mu: rwmutex.Create(safe...),
array: array,
@ -93,8 +93,8 @@ func NewArrayFrom(array []interface{}, safe ...bool) *Array {
// NewArrayFromCopy creates and returns an array from a copy of given slice `array`.
// The parameter `safe` is used to specify whether using array in concurrent-safety,
// which is false in default.
func NewArrayFromCopy(array []interface{}, safe ...bool) *Array {
newArray := make([]interface{}, len(array))
func NewArrayFromCopy(array []any, safe ...bool) *Array {
newArray := make([]any, len(array))
copy(newArray, array)
return &Array{
mu: rwmutex.Create(safe...),
@ -104,14 +104,14 @@ func NewArrayFromCopy(array []interface{}, safe ...bool) *Array {
// At returns the value by the specified index.
// If the given `index` is out of range of the array, it returns `nil`.
func (a *Array) At(index int) (value interface{}) {
func (a *Array) At(index int) (value any) {
value, _ = a.Get(index)
return
}
// Get returns the value by the specified index.
// If the given `index` is out of range of the array, the `found` is false.
func (a *Array) Get(index int) (value interface{}, found bool) {
func (a *Array) Get(index int) (value any, found bool) {
a.mu.RLock()
defer a.mu.RUnlock()
if index < 0 || index >= len(a.array) {
@ -121,7 +121,7 @@ func (a *Array) Get(index int) (value interface{}, found bool) {
}
// Set sets value to specified index.
func (a *Array) Set(index int, value interface{}) error {
func (a *Array) Set(index int, value any) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
@ -132,7 +132,7 @@ func (a *Array) Set(index int, value interface{}) error {
}
// SetArray sets the underlying slice array with the given `array`.
func (a *Array) SetArray(array []interface{}) *Array {
func (a *Array) SetArray(array []any) *Array {
a.mu.Lock()
defer a.mu.Unlock()
a.array = array
@ -140,7 +140,7 @@ func (a *Array) SetArray(array []interface{}) *Array {
}
// Replace replaces the array items by given `array` from the beginning of array.
func (a *Array) Replace(array []interface{}) *Array {
func (a *Array) Replace(array []any) *Array {
a.mu.Lock()
defer a.mu.Unlock()
max := len(array)
@ -164,7 +164,7 @@ func (a *Array) Sum() (sum int) {
}
// SortFunc sorts the array by custom function `less`.
func (a *Array) SortFunc(less func(v1, v2 interface{}) bool) *Array {
func (a *Array) SortFunc(less func(v1, v2 any) bool) *Array {
a.mu.Lock()
defer a.mu.Unlock()
sort.Slice(a.array, func(i, j int) bool {
@ -174,26 +174,26 @@ func (a *Array) SortFunc(less func(v1, v2 interface{}) bool) *Array {
}
// InsertBefore inserts the `values` to the front of `index`.
func (a *Array) InsertBefore(index int, values ...interface{}) error {
func (a *Array) InsertBefore(index int, values ...any) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.NewCodef(gcode.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]interface{}{}, a.array[index:]...)
rear := append([]any{}, a.array[index:]...)
a.array = append(a.array[0:index], values...)
a.array = append(a.array, rear...)
return nil
}
// InsertAfter inserts the `values` to the back of `index`.
func (a *Array) InsertAfter(index int, values ...interface{}) error {
func (a *Array) InsertAfter(index int, values ...any) error {
a.mu.Lock()
defer a.mu.Unlock()
if index < 0 || index >= len(a.array) {
return gerror.NewCodef(gcode.CodeInvalidParameter, "index %d out of array range %d", index, len(a.array))
}
rear := append([]interface{}{}, a.array[index+1:]...)
rear := append([]any{}, a.array[index+1:]...)
a.array = append(a.array[0:index+1], values...)
a.array = append(a.array, rear...)
return nil
@ -201,14 +201,14 @@ func (a *Array) InsertAfter(index int, values ...interface{}) error {
// Remove removes an item by index.
// If the given `index` is out of range of the array, the `found` is false.
func (a *Array) Remove(index int) (value interface{}, found bool) {
func (a *Array) Remove(index int) (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
return a.doRemoveWithoutLock(index)
}
// doRemoveWithoutLock removes an item by index without lock.
func (a *Array) doRemoveWithoutLock(index int) (value interface{}, found bool) {
func (a *Array) doRemoveWithoutLock(index int) (value any, found bool) {
if index < 0 || index >= len(a.array) {
return nil, false
}
@ -232,7 +232,7 @@ func (a *Array) doRemoveWithoutLock(index int) (value interface{}, found bool) {
// RemoveValue removes an item by value.
// It returns true if value is found in the array, or else false if not found.
func (a *Array) RemoveValue(value interface{}) bool {
func (a *Array) RemoveValue(value any) bool {
a.mu.Lock()
defer a.mu.Unlock()
if i := a.doSearchWithoutLock(value); i != -1 {
@ -243,7 +243,7 @@ func (a *Array) RemoveValue(value interface{}) bool {
}
// RemoveValues removes multiple items by `values`.
func (a *Array) RemoveValues(values ...interface{}) {
func (a *Array) RemoveValues(values ...any) {
a.mu.Lock()
defer a.mu.Unlock()
for _, value := range values {
@ -254,7 +254,7 @@ func (a *Array) RemoveValues(values ...interface{}) {
}
// PushLeft pushes one or multiple items to the beginning of array.
func (a *Array) PushLeft(value ...interface{}) *Array {
func (a *Array) PushLeft(value ...any) *Array {
a.mu.Lock()
a.array = append(value, a.array...)
a.mu.Unlock()
@ -263,7 +263,7 @@ func (a *Array) PushLeft(value ...interface{}) *Array {
// PushRight pushes one or multiple items to the end of array.
// It equals to Append.
func (a *Array) PushRight(value ...interface{}) *Array {
func (a *Array) PushRight(value ...any) *Array {
a.mu.Lock()
a.array = append(a.array, value...)
a.mu.Unlock()
@ -272,14 +272,14 @@ func (a *Array) PushRight(value ...interface{}) *Array {
// PopRand randomly pops and return an item out of array.
// Note that if the array is empty, the `found` is false.
func (a *Array) PopRand() (value interface{}, found bool) {
func (a *Array) PopRand() (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
return a.doRemoveWithoutLock(grand.Intn(len(a.array)))
}
// PopRands randomly pops and returns `size` items out of array.
func (a *Array) PopRands(size int) []interface{} {
func (a *Array) PopRands(size int) []any {
a.mu.Lock()
defer a.mu.Unlock()
if size <= 0 || len(a.array) == 0 {
@ -288,7 +288,7 @@ func (a *Array) PopRands(size int) []interface{} {
if size >= len(a.array) {
size = len(a.array)
}
array := make([]interface{}, size)
array := make([]any, size)
for i := 0; i < size; i++ {
array[i], _ = a.doRemoveWithoutLock(grand.Intn(len(a.array)))
}
@ -297,7 +297,7 @@ func (a *Array) PopRands(size int) []interface{} {
// PopLeft pops and returns an item from the beginning of array.
// Note that if the array is empty, the `found` is false.
func (a *Array) PopLeft() (value interface{}, found bool) {
func (a *Array) PopLeft() (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
if len(a.array) == 0 {
@ -310,7 +310,7 @@ func (a *Array) PopLeft() (value interface{}, found bool) {
// PopRight pops and returns an item from the end of array.
// Note that if the array is empty, the `found` is false.
func (a *Array) PopRight() (value interface{}, found bool) {
func (a *Array) PopRight() (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
index := len(a.array) - 1
@ -323,7 +323,7 @@ func (a *Array) PopRight() (value interface{}, found bool) {
}
// PopLefts pops and returns `size` items from the beginning of array.
func (a *Array) PopLefts(size int) []interface{} {
func (a *Array) PopLefts(size int) []any {
a.mu.Lock()
defer a.mu.Unlock()
if size <= 0 || len(a.array) == 0 {
@ -340,7 +340,7 @@ func (a *Array) PopLefts(size int) []interface{} {
}
// PopRights pops and returns `size` items from the end of array.
func (a *Array) PopRights(size int) []interface{} {
func (a *Array) PopRights(size int) []any {
a.mu.Lock()
defer a.mu.Unlock()
if size <= 0 || len(a.array) == 0 {
@ -364,7 +364,7 @@ func (a *Array) PopRights(size int) []interface{} {
// If `end` is negative, then the offset will start from the end of array.
// If `end` is omitted, then the sequence will have everything from start up
// until the end of the array.
func (a *Array) Range(start int, end ...int) []interface{} {
func (a *Array) Range(start int, end ...int) []any {
a.mu.RLock()
defer a.mu.RUnlock()
offsetEnd := len(a.array)
@ -377,9 +377,9 @@ func (a *Array) Range(start int, end ...int) []interface{} {
if start < 0 {
start = 0
}
array := ([]interface{})(nil)
array := ([]any)(nil)
if a.mu.IsSafe() {
array = make([]interface{}, offsetEnd-start)
array = make([]any, offsetEnd-start)
copy(array, a.array[start:offsetEnd])
} else {
array = a.array[start:offsetEnd]
@ -400,7 +400,7 @@ func (a *Array) Range(start int, end ...int) []interface{} {
// If it is omitted, then the sequence will have everything from offset up until the end of the array.
//
// Any possibility crossing the left border of array, it will fail.
func (a *Array) SubSlice(offset int, length ...int) []interface{} {
func (a *Array) SubSlice(offset int, length ...int) []any {
a.mu.RLock()
defer a.mu.RUnlock()
size := len(a.array)
@ -429,7 +429,7 @@ func (a *Array) SubSlice(offset int, length ...int) []interface{} {
size = len(a.array) - offset
}
if a.mu.IsSafe() {
s := make([]interface{}, size)
s := make([]any, size)
copy(s, a.array[offset:])
return s
} else {
@ -438,7 +438,7 @@ func (a *Array) SubSlice(offset int, length ...int) []interface{} {
}
// Append is alias of PushRight, please See PushRight.
func (a *Array) Append(value ...interface{}) *Array {
func (a *Array) Append(value ...any) *Array {
a.PushRight(value...)
return a
}
@ -454,11 +454,11 @@ func (a *Array) Len() int {
// Slice returns the underlying data of array.
// Note that, if it's in concurrent-safe usage, it returns a copy of underlying data,
// or else a pointer to the underlying data.
func (a *Array) Slice() []interface{} {
func (a *Array) Slice() []any {
if a.mu.IsSafe() {
a.mu.RLock()
defer a.mu.RUnlock()
array := make([]interface{}, len(a.array))
array := make([]any, len(a.array))
copy(array, a.array)
return array
} else {
@ -466,15 +466,15 @@ func (a *Array) Slice() []interface{} {
}
}
// Interfaces returns current array as []interface{}.
func (a *Array) Interfaces() []interface{} {
// Interfaces returns current array as []any.
func (a *Array) Interfaces() []any {
return a.Slice()
}
// Clone returns a new array, which is a copy of current array.
func (a *Array) Clone() (newArray *Array) {
a.mu.RLock()
array := make([]interface{}, len(a.array))
array := make([]any, len(a.array))
copy(array, a.array)
a.mu.RUnlock()
return NewArrayFrom(array, a.mu.IsSafe())
@ -484,26 +484,26 @@ func (a *Array) Clone() (newArray *Array) {
func (a *Array) Clear() *Array {
a.mu.Lock()
if len(a.array) > 0 {
a.array = make([]interface{}, 0)
a.array = make([]any, 0)
}
a.mu.Unlock()
return a
}
// Contains checks whether a value exists in the array.
func (a *Array) Contains(value interface{}) bool {
func (a *Array) Contains(value any) bool {
return a.Search(value) != -1
}
// Search searches array by `value`, returns the index of `value`,
// or returns -1 if not exists.
func (a *Array) Search(value interface{}) int {
func (a *Array) Search(value any) int {
a.mu.RLock()
defer a.mu.RUnlock()
return a.doSearchWithoutLock(value)
}
func (a *Array) doSearchWithoutLock(value interface{}) int {
func (a *Array) doSearchWithoutLock(value any) int {
if len(a.array) == 0 {
return -1
}
@ -527,9 +527,9 @@ func (a *Array) Unique() *Array {
}
var (
ok bool
temp interface{}
uniqueSet = make(map[interface{}]struct{})
uniqueArray = make([]interface{}, 0, len(a.array))
temp any
uniqueSet = make(map[any]struct{})
uniqueArray = make([]any, 0, len(a.array))
)
for i := 0; i < len(a.array); i++ {
temp = a.array[i]
@ -544,7 +544,7 @@ func (a *Array) Unique() *Array {
}
// LockFunc locks writing by callback function `f`.
func (a *Array) LockFunc(f func(array []interface{})) *Array {
func (a *Array) LockFunc(f func(array []any)) *Array {
a.mu.Lock()
defer a.mu.Unlock()
f(a.array)
@ -552,7 +552,7 @@ func (a *Array) LockFunc(f func(array []interface{})) *Array {
}
// RLockFunc locks reading by callback function `f`.
func (a *Array) RLockFunc(f func(array []interface{})) *Array {
func (a *Array) RLockFunc(f func(array []any)) *Array {
a.mu.RLock()
defer a.mu.RUnlock()
f(a.array)
@ -563,13 +563,13 @@ func (a *Array) RLockFunc(f func(array []interface{})) *Array {
// The parameter `array` can be any garray or slice type.
// The difference between Merge and Append is Append supports only specified slice type,
// but Merge supports more parameter types.
func (a *Array) Merge(array interface{}) *Array {
func (a *Array) Merge(array any) *Array {
return a.Append(gconv.Interfaces(array)...)
}
// Fill fills an array with num entries of the value `value`,
// keys starting at the `startIndex` parameter.
func (a *Array) Fill(startIndex int, num int, value interface{}) error {
func (a *Array) Fill(startIndex int, num int, value any) error {
a.mu.Lock()
defer a.mu.Unlock()
if startIndex < 0 || startIndex > len(a.array) {
@ -588,7 +588,7 @@ func (a *Array) Fill(startIndex int, num int, value interface{}) error {
// Chunk splits an array into multiple arrays,
// the size of each array is determined by `size`.
// The last chunk may contain less than size elements.
func (a *Array) Chunk(size int) [][]interface{} {
func (a *Array) Chunk(size int) [][]any {
if size < 1 {
return nil
}
@ -596,7 +596,7 @@ func (a *Array) Chunk(size int) [][]interface{} {
defer a.mu.RUnlock()
length := len(a.array)
chunks := int(math.Ceil(float64(length) / float64(size)))
var n [][]interface{}
var n [][]any
for i, end := 0, 0; chunks > 0; chunks-- {
end = (i + 1) * size
if end > length {
@ -612,7 +612,7 @@ func (a *Array) Chunk(size int) [][]interface{} {
// If size is positive then the array is padded on the right, or negative on the left.
// If the absolute value of `size` is less than or equal to the length of the array
// then no padding takes place.
func (a *Array) Pad(size int, val interface{}) *Array {
func (a *Array) Pad(size int, val any) *Array {
a.mu.Lock()
defer a.mu.Unlock()
if size == 0 || (size > 0 && size < len(a.array)) || (size < 0 && size > -len(a.array)) {
@ -623,7 +623,7 @@ func (a *Array) Pad(size int, val interface{}) *Array {
n = -size
}
n -= len(a.array)
tmp := make([]interface{}, n)
tmp := make([]any, n)
for i := 0; i < n; i++ {
tmp[i] = val
}
@ -636,7 +636,7 @@ func (a *Array) Pad(size int, val interface{}) *Array {
}
// Rand randomly returns one item from array(no deleting).
func (a *Array) Rand() (value interface{}, found bool) {
func (a *Array) Rand() (value any, found bool) {
a.mu.RLock()
defer a.mu.RUnlock()
if len(a.array) == 0 {
@ -646,13 +646,13 @@ func (a *Array) Rand() (value interface{}, found bool) {
}
// Rands randomly returns `size` items from array(no deleting).
func (a *Array) Rands(size int) []interface{} {
func (a *Array) Rands(size int) []any {
a.mu.RLock()
defer a.mu.RUnlock()
if size <= 0 || len(a.array) == 0 {
return nil
}
array := make([]interface{}, size)
array := make([]any, size)
for i := 0; i < size; i++ {
array[i] = a.array[grand.Intn(len(a.array))]
}
@ -697,8 +697,8 @@ func (a *Array) Join(glue string) string {
}
// CountValues counts the number of occurrences of all values in the array.
func (a *Array) CountValues() map[interface{}]int {
m := make(map[interface{}]int)
func (a *Array) CountValues() map[any]int {
m := make(map[any]int)
a.mu.RLock()
defer a.mu.RUnlock()
for _, v := range a.array {
@ -708,13 +708,13 @@ func (a *Array) CountValues() map[interface{}]int {
}
// Iterator is alias of IteratorAsc.
func (a *Array) Iterator(f func(k int, v interface{}) bool) {
func (a *Array) Iterator(f func(k int, v any) bool) {
a.IteratorAsc(f)
}
// IteratorAsc iterates the array readonly in ascending order with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (a *Array) IteratorAsc(f func(k int, v interface{}) bool) {
func (a *Array) IteratorAsc(f func(k int, v any) bool) {
a.mu.RLock()
defer a.mu.RUnlock()
for k, v := range a.array {
@ -726,7 +726,7 @@ func (a *Array) IteratorAsc(f func(k int, v interface{}) bool) {
// IteratorDesc iterates the array readonly in descending order with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (a *Array) IteratorDesc(f func(k int, v interface{}) bool) {
func (a *Array) IteratorDesc(f func(k int, v any) bool) {
a.mu.RLock()
defer a.mu.RUnlock()
for i := len(a.array) - 1; i >= 0; i-- {
@ -772,7 +772,7 @@ func (a Array) MarshalJSON() ([]byte, error) {
// UnmarshalJSON implements the interface UnmarshalJSON for json.Unmarshal.
func (a *Array) UnmarshalJSON(b []byte) error {
if a.array == nil {
a.array = make([]interface{}, 0)
a.array = make([]any, 0)
}
a.mu.Lock()
defer a.mu.Unlock()
@ -783,7 +783,7 @@ func (a *Array) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for array.
func (a *Array) UnmarshalValue(value interface{}) error {
func (a *Array) UnmarshalValue(value any) error {
a.mu.Lock()
defer a.mu.Unlock()
switch value.(type) {
@ -798,7 +798,7 @@ func (a *Array) UnmarshalValue(value interface{}) error {
// Filter iterates array and filters elements using custom callback function.
// It removes the element from array if callback function `filter` returns true,
// it or else does nothing and continues iterating.
func (a *Array) Filter(filter func(index int, value interface{}) bool) *Array {
func (a *Array) Filter(filter func(index int, value any) bool) *Array {
a.mu.Lock()
defer a.mu.Unlock()
for i := 0; i < len(a.array); {
@ -841,7 +841,7 @@ func (a *Array) FilterEmpty() *Array {
}
// Walk applies a user supplied function `f` to every item of array.
func (a *Array) Walk(f func(value interface{}) interface{}) *Array {
func (a *Array) Walk(f func(value any) any) *Array {
a.mu.Lock()
defer a.mu.Unlock()
for i, v := range a.array {
@ -856,13 +856,13 @@ func (a *Array) IsEmpty() bool {
}
// DeepCopy implements interface for deep copy of current type.
func (a *Array) DeepCopy() interface{} {
func (a *Array) DeepCopy() any {
if a == nil {
return nil
}
a.mu.RLock()
defer a.mu.RUnlock()
newSlice := make([]interface{}, len(a.array))
newSlice := make([]any, len(a.array))
for i, v := range a.array {
newSlice[i] = deepcopy.Copy(v)
}

View File

@ -478,11 +478,11 @@ func (a *IntArray) Slice() []int {
return array
}
// Interfaces returns current array as []interface{}.
func (a *IntArray) Interfaces() []interface{} {
// Interfaces returns current array as []any.
func (a *IntArray) Interfaces() []any {
a.mu.RLock()
defer a.mu.RUnlock()
array := make([]interface{}, len(a.array))
array := make([]any, len(a.array))
for k, v := range a.array {
array[k] = v
}
@ -581,7 +581,7 @@ func (a *IntArray) RLockFunc(f func(array []int)) *IntArray {
// The parameter `array` can be any garray or slice type.
// The difference between Merge and Append is Append supports only specified slice type,
// but Merge supports more parameter types.
func (a *IntArray) Merge(array interface{}) *IntArray {
func (a *IntArray) Merge(array any) *IntArray {
return a.Append(gconv.Ints(array)...)
}
@ -788,7 +788,7 @@ func (a *IntArray) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for array.
func (a *IntArray) UnmarshalValue(value interface{}) error {
func (a *IntArray) UnmarshalValue(value any) error {
a.mu.Lock()
defer a.mu.Unlock()
switch value.(type) {
@ -846,7 +846,7 @@ func (a *IntArray) IsEmpty() bool {
}
// DeepCopy implements interface for deep copy of current type.
func (a *IntArray) DeepCopy() interface{} {
func (a *IntArray) DeepCopy() any {
if a == nil {
return nil
}

View File

@ -454,11 +454,11 @@ func (a *StrArray) Slice() []string {
return array
}
// Interfaces returns current array as []interface{}.
func (a *StrArray) Interfaces() []interface{} {
// Interfaces returns current array as []any.
func (a *StrArray) Interfaces() []any {
a.mu.RLock()
defer a.mu.RUnlock()
array := make([]interface{}, len(a.array))
array := make([]any, len(a.array))
for k, v := range a.array {
array[k] = v
}
@ -573,7 +573,7 @@ func (a *StrArray) RLockFunc(f func(array []string)) *StrArray {
// The parameter `array` can be any garray or slice type.
// The difference between Merge and Append is Append supports only specified slice type,
// but Merge supports more parameter types.
func (a *StrArray) Merge(array interface{}) *StrArray {
func (a *StrArray) Merge(array any) *StrArray {
return a.Append(gconv.Strings(array)...)
}
@ -787,7 +787,7 @@ func (a *StrArray) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for array.
func (a *StrArray) UnmarshalValue(value interface{}) error {
func (a *StrArray) UnmarshalValue(value any) error {
a.mu.Lock()
defer a.mu.Unlock()
switch value.(type) {
@ -845,7 +845,7 @@ func (a *StrArray) IsEmpty() bool {
}
// DeepCopy implements interface for deep copy of current type.
func (a *StrArray) DeepCopy() interface{} {
func (a *StrArray) DeepCopy() any {
if a == nil {
return nil
}

View File

@ -29,9 +29,9 @@ import (
// when its initialization and cannot be changed then.
type SortedArray struct {
mu rwmutex.RWMutex
array []interface{}
unique bool // Whether enable unique feature(false)
comparator func(a, b interface{}) int // Comparison function(it returns -1: a < b; 0: a == b; 1: a > b)
array []any
unique bool // Whether enable unique feature(false)
comparator func(a, b any) int // Comparison function(it returns -1: a < b; 0: a == b; 1: a > b)
}
// NewSortedArray creates and returns an empty sorted array.
@ -40,28 +40,28 @@ type SortedArray struct {
// if it returns value < 0, means `a` < `b`; the `a` will be inserted before `b`;
// if it returns value = 0, means `a` = `b`; the `a` will be replaced by `b`;
// if it returns value > 0, means `a` > `b`; the `a` will be inserted after `b`;
func NewSortedArray(comparator func(a, b interface{}) int, safe ...bool) *SortedArray {
func NewSortedArray(comparator func(a, b any) int, safe ...bool) *SortedArray {
return NewSortedArraySize(0, comparator, safe...)
}
// NewSortedArraySize create and returns an sorted array with given size and cap.
// The parameter `safe` is used to specify whether using array in concurrent-safety,
// which is false in default.
func NewSortedArraySize(cap int, comparator func(a, b interface{}) int, safe ...bool) *SortedArray {
func NewSortedArraySize(cap int, comparator func(a, b any) int, safe ...bool) *SortedArray {
return &SortedArray{
mu: rwmutex.Create(safe...),
array: make([]interface{}, 0, cap),
array: make([]any, 0, cap),
comparator: comparator,
}
}
// NewSortedArrayRange creates and returns an array by a range from `start` to `end`
// with step value `step`.
func NewSortedArrayRange(start, end, step int, comparator func(a, b interface{}) int, safe ...bool) *SortedArray {
func NewSortedArrayRange(start, end, step int, comparator func(a, b any) int, safe ...bool) *SortedArray {
if step == 0 {
panic(fmt.Sprintf(`invalid step value: %d`, step))
}
slice := make([]interface{}, 0)
slice := make([]any, 0)
index := 0
for i := start; i <= end; i += step {
slice = append(slice, i)
@ -73,7 +73,7 @@ func NewSortedArrayRange(start, end, step int, comparator func(a, b interface{})
// NewSortedArrayFrom creates and returns an sorted array with given slice `array`.
// The parameter `safe` is used to specify whether using array in concurrent-safety,
// which is false in default.
func NewSortedArrayFrom(array []interface{}, comparator func(a, b interface{}) int, safe ...bool) *SortedArray {
func NewSortedArrayFrom(array []any, comparator func(a, b any) int, safe ...bool) *SortedArray {
a := NewSortedArraySize(0, comparator, safe...)
a.array = array
sort.Slice(a.array, func(i, j int) bool {
@ -85,21 +85,21 @@ func NewSortedArrayFrom(array []interface{}, comparator func(a, b interface{}) i
// NewSortedArrayFromCopy creates and returns an sorted array from a copy of given slice `array`.
// The parameter `safe` is used to specify whether using array in concurrent-safety,
// which is false in default.
func NewSortedArrayFromCopy(array []interface{}, comparator func(a, b interface{}) int, safe ...bool) *SortedArray {
newArray := make([]interface{}, len(array))
func NewSortedArrayFromCopy(array []any, comparator func(a, b any) int, safe ...bool) *SortedArray {
newArray := make([]any, len(array))
copy(newArray, array)
return NewSortedArrayFrom(newArray, comparator, safe...)
}
// At returns the value by the specified index.
// If the given `index` is out of range of the array, it returns `nil`.
func (a *SortedArray) At(index int) (value interface{}) {
func (a *SortedArray) At(index int) (value any) {
value, _ = a.Get(index)
return
}
// SetArray sets the underlying slice array with the given `array`.
func (a *SortedArray) SetArray(array []interface{}) *SortedArray {
func (a *SortedArray) SetArray(array []any) *SortedArray {
a.mu.Lock()
defer a.mu.Unlock()
a.array = array
@ -111,7 +111,7 @@ func (a *SortedArray) SetArray(array []interface{}) *SortedArray {
// SetComparator sets/changes the comparator for sorting.
// It resorts the array as the comparator is changed.
func (a *SortedArray) SetComparator(comparator func(a, b interface{}) int) {
func (a *SortedArray) SetComparator(comparator func(a, b any) int) {
a.mu.Lock()
defer a.mu.Unlock()
a.comparator = comparator
@ -134,12 +134,12 @@ func (a *SortedArray) Sort() *SortedArray {
// Add adds one or multiple values to sorted array, the array always keeps sorted.
// It's alias of function Append, see Append.
func (a *SortedArray) Add(values ...interface{}) *SortedArray {
func (a *SortedArray) Add(values ...any) *SortedArray {
return a.Append(values...)
}
// Append adds one or multiple values to sorted array, the array always keeps sorted.
func (a *SortedArray) Append(values ...interface{}) *SortedArray {
func (a *SortedArray) Append(values ...any) *SortedArray {
if len(values) == 0 {
return a
}
@ -157,14 +157,14 @@ func (a *SortedArray) Append(values ...interface{}) *SortedArray {
if cmp > 0 {
index++
}
a.array = append(a.array[:index], append([]interface{}{value}, a.array[index:]...)...)
a.array = append(a.array[:index], append([]any{value}, a.array[index:]...)...)
}
return a
}
// Get returns the value by the specified index.
// If the given `index` is out of range of the array, the `found` is false.
func (a *SortedArray) Get(index int) (value interface{}, found bool) {
func (a *SortedArray) Get(index int) (value any, found bool) {
a.mu.RLock()
defer a.mu.RUnlock()
if index < 0 || index >= len(a.array) {
@ -175,14 +175,14 @@ func (a *SortedArray) Get(index int) (value interface{}, found bool) {
// Remove removes an item by index.
// If the given `index` is out of range of the array, the `found` is false.
func (a *SortedArray) Remove(index int) (value interface{}, found bool) {
func (a *SortedArray) Remove(index int) (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
return a.doRemoveWithoutLock(index)
}
// doRemoveWithoutLock removes an item by index without lock.
func (a *SortedArray) doRemoveWithoutLock(index int) (value interface{}, found bool) {
func (a *SortedArray) doRemoveWithoutLock(index int) (value any, found bool) {
if index < 0 || index >= len(a.array) {
return nil, false
}
@ -206,7 +206,7 @@ func (a *SortedArray) doRemoveWithoutLock(index int) (value interface{}, found b
// RemoveValue removes an item by value.
// It returns true if value is found in the array, or else false if not found.
func (a *SortedArray) RemoveValue(value interface{}) bool {
func (a *SortedArray) RemoveValue(value any) bool {
a.mu.Lock()
defer a.mu.Unlock()
if i, r := a.binSearch(value, false); r == 0 {
@ -217,7 +217,7 @@ func (a *SortedArray) RemoveValue(value interface{}) bool {
}
// RemoveValues removes an item by `values`.
func (a *SortedArray) RemoveValues(values ...interface{}) {
func (a *SortedArray) RemoveValues(values ...any) {
a.mu.Lock()
defer a.mu.Unlock()
for _, value := range values {
@ -229,7 +229,7 @@ func (a *SortedArray) RemoveValues(values ...interface{}) {
// PopLeft pops and returns an item from the beginning of array.
// Note that if the array is empty, the `found` is false.
func (a *SortedArray) PopLeft() (value interface{}, found bool) {
func (a *SortedArray) PopLeft() (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
if len(a.array) == 0 {
@ -242,7 +242,7 @@ func (a *SortedArray) PopLeft() (value interface{}, found bool) {
// PopRight pops and returns an item from the end of array.
// Note that if the array is empty, the `found` is false.
func (a *SortedArray) PopRight() (value interface{}, found bool) {
func (a *SortedArray) PopRight() (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
index := len(a.array) - 1
@ -256,14 +256,14 @@ func (a *SortedArray) PopRight() (value interface{}, found bool) {
// PopRand randomly pops and return an item out of array.
// Note that if the array is empty, the `found` is false.
func (a *SortedArray) PopRand() (value interface{}, found bool) {
func (a *SortedArray) PopRand() (value any, found bool) {
a.mu.Lock()
defer a.mu.Unlock()
return a.doRemoveWithoutLock(grand.Intn(len(a.array)))
}
// PopRands randomly pops and returns `size` items out of array.
func (a *SortedArray) PopRands(size int) []interface{} {
func (a *SortedArray) PopRands(size int) []any {
a.mu.Lock()
defer a.mu.Unlock()
if size <= 0 || len(a.array) == 0 {
@ -272,7 +272,7 @@ func (a *SortedArray) PopRands(size int) []interface{} {
if size >= len(a.array) {
size = len(a.array)
}
array := make([]interface{}, size)
array := make([]any, size)
for i := 0; i < size; i++ {
array[i], _ = a.doRemoveWithoutLock(grand.Intn(len(a.array)))
}
@ -280,7 +280,7 @@ func (a *SortedArray) PopRands(size int) []interface{} {
}
// PopLefts pops and returns `size` items from the beginning of array.
func (a *SortedArray) PopLefts(size int) []interface{} {
func (a *SortedArray) PopLefts(size int) []any {
a.mu.Lock()
defer a.mu.Unlock()
if size <= 0 || len(a.array) == 0 {
@ -297,7 +297,7 @@ func (a *SortedArray) PopLefts(size int) []interface{} {
}
// PopRights pops and returns `size` items from the end of array.
func (a *SortedArray) PopRights(size int) []interface{} {
func (a *SortedArray) PopRights(size int) []any {
a.mu.Lock()
defer a.mu.Unlock()
if size <= 0 || len(a.array) == 0 {
@ -321,7 +321,7 @@ func (a *SortedArray) PopRights(size int) []interface{} {
// If `end` is negative, then the offset will start from the end of array.
// If `end` is omitted, then the sequence will have everything from start up
// until the end of the array.
func (a *SortedArray) Range(start int, end ...int) []interface{} {
func (a *SortedArray) Range(start int, end ...int) []any {
a.mu.RLock()
defer a.mu.RUnlock()
offsetEnd := len(a.array)
@ -334,9 +334,9 @@ func (a *SortedArray) Range(start int, end ...int) []interface{} {
if start < 0 {
start = 0
}
array := ([]interface{})(nil)
array := ([]any)(nil)
if a.mu.IsSafe() {
array = make([]interface{}, offsetEnd-start)
array = make([]any, offsetEnd-start)
copy(array, a.array[start:offsetEnd])
} else {
array = a.array[start:offsetEnd]
@ -357,7 +357,7 @@ func (a *SortedArray) Range(start int, end ...int) []interface{} {
// If it is omitted, then the sequence will have everything from offset up until the end of the array.
//
// Any possibility crossing the left border of array, it will fail.
func (a *SortedArray) SubSlice(offset int, length ...int) []interface{} {
func (a *SortedArray) SubSlice(offset int, length ...int) []any {
a.mu.RLock()
defer a.mu.RUnlock()
size := len(a.array)
@ -386,7 +386,7 @@ func (a *SortedArray) SubSlice(offset int, length ...int) []interface{} {
size = len(a.array) - offset
}
if a.mu.IsSafe() {
s := make([]interface{}, size)
s := make([]any, size)
copy(s, a.array[offset:])
return s
} else {
@ -415,12 +415,12 @@ func (a *SortedArray) Len() int {
// Slice returns the underlying data of array.
// Note that, if it's in concurrent-safe usage, it returns a copy of underlying data,
// or else a pointer to the underlying data.
func (a *SortedArray) Slice() []interface{} {
var array []interface{}
func (a *SortedArray) Slice() []any {
var array []any
if a.mu.IsSafe() {
a.mu.RLock()
defer a.mu.RUnlock()
array = make([]interface{}, len(a.array))
array = make([]any, len(a.array))
copy(array, a.array)
} else {
array = a.array
@ -428,19 +428,19 @@ func (a *SortedArray) Slice() []interface{} {
return array
}
// Interfaces returns current array as []interface{}.
func (a *SortedArray) Interfaces() []interface{} {
// Interfaces returns current array as []any.
func (a *SortedArray) Interfaces() []any {
return a.Slice()
}
// Contains checks whether a value exists in the array.
func (a *SortedArray) Contains(value interface{}) bool {
func (a *SortedArray) Contains(value any) bool {
return a.Search(value) != -1
}
// Search searches array by `value`, returns the index of `value`,
// or returns -1 if not exists.
func (a *SortedArray) Search(value interface{}) (index int) {
func (a *SortedArray) Search(value any) (index int) {
if i, r := a.binSearch(value, true); r == 0 {
return i
}
@ -452,7 +452,7 @@ func (a *SortedArray) Search(value interface{}) (index int) {
// If `result` equals to 0, it means the value at `index` is equals to `value`.
// If `result` lesser than 0, it means the value at `index` is lesser than `value`.
// If `result` greater than 0, it means the value at `index` is greater than `value`.
func (a *SortedArray) binSearch(value interface{}, lock bool) (index int, result int) {
func (a *SortedArray) binSearch(value any, lock bool) (index int, result int) {
if lock {
a.mu.RLock()
defer a.mu.RUnlock()
@ -498,13 +498,9 @@ func (a *SortedArray) Unique() *SortedArray {
if len(a.array) == 0 {
return a
}
i := 0
for {
if i == len(a.array)-1 {
break
}
for i := 0; i < len(a.array)-1; {
if a.getComparator()(a.array[i], a.array[i+1]) == 0 {
a.array = append(a.array[:i+1], a.array[i+1+1:]...)
a.array = append(a.array[:i+1], a.array[i+2:]...)
} else {
i++
}
@ -515,7 +511,7 @@ func (a *SortedArray) Unique() *SortedArray {
// Clone returns a new array, which is a copy of current array.
func (a *SortedArray) Clone() (newArray *SortedArray) {
a.mu.RLock()
array := make([]interface{}, len(a.array))
array := make([]any, len(a.array))
copy(array, a.array)
a.mu.RUnlock()
return NewSortedArrayFrom(array, a.comparator, a.mu.IsSafe())
@ -525,14 +521,14 @@ func (a *SortedArray) Clone() (newArray *SortedArray) {
func (a *SortedArray) Clear() *SortedArray {
a.mu.Lock()
if len(a.array) > 0 {
a.array = make([]interface{}, 0)
a.array = make([]any, 0)
}
a.mu.Unlock()
return a
}
// LockFunc locks writing by callback function `f`.
func (a *SortedArray) LockFunc(f func(array []interface{})) *SortedArray {
func (a *SortedArray) LockFunc(f func(array []any)) *SortedArray {
a.mu.Lock()
defer a.mu.Unlock()
@ -546,7 +542,7 @@ func (a *SortedArray) LockFunc(f func(array []interface{})) *SortedArray {
}
// RLockFunc locks reading by callback function `f`.
func (a *SortedArray) RLockFunc(f func(array []interface{})) *SortedArray {
func (a *SortedArray) RLockFunc(f func(array []any)) *SortedArray {
a.mu.RLock()
defer a.mu.RUnlock()
f(a.array)
@ -557,14 +553,14 @@ func (a *SortedArray) RLockFunc(f func(array []interface{})) *SortedArray {
// The parameter `array` can be any garray or slice type.
// The difference between Merge and Append is Append supports only specified slice type,
// but Merge supports more parameter types.
func (a *SortedArray) Merge(array interface{}) *SortedArray {
func (a *SortedArray) Merge(array any) *SortedArray {
return a.Add(gconv.Interfaces(array)...)
}
// Chunk splits an array into multiple arrays,
// the size of each array is determined by `size`.
// The last chunk may contain less than size elements.
func (a *SortedArray) Chunk(size int) [][]interface{} {
func (a *SortedArray) Chunk(size int) [][]any {
if size < 1 {
return nil
}
@ -572,7 +568,7 @@ func (a *SortedArray) Chunk(size int) [][]interface{} {
defer a.mu.RUnlock()
length := len(a.array)
chunks := int(math.Ceil(float64(length) / float64(size)))
var n [][]interface{}
var n [][]any
for i, end := 0, 0; chunks > 0; chunks-- {
end = (i + 1) * size
if end > length {
@ -585,7 +581,7 @@ func (a *SortedArray) Chunk(size int) [][]interface{} {
}
// Rand randomly returns one item from array(no deleting).
func (a *SortedArray) Rand() (value interface{}, found bool) {
func (a *SortedArray) Rand() (value any, found bool) {
a.mu.RLock()
defer a.mu.RUnlock()
if len(a.array) == 0 {
@ -595,13 +591,13 @@ func (a *SortedArray) Rand() (value interface{}, found bool) {
}
// Rands randomly returns `size` items from array(no deleting).
func (a *SortedArray) Rands(size int) []interface{} {
func (a *SortedArray) Rands(size int) []any {
a.mu.RLock()
defer a.mu.RUnlock()
if size <= 0 || len(a.array) == 0 {
return nil
}
array := make([]interface{}, size)
array := make([]any, size)
for i := 0; i < size; i++ {
array[i] = a.array[grand.Intn(len(a.array))]
}
@ -626,8 +622,8 @@ func (a *SortedArray) Join(glue string) string {
}
// CountValues counts the number of occurrences of all values in the array.
func (a *SortedArray) CountValues() map[interface{}]int {
m := make(map[interface{}]int)
func (a *SortedArray) CountValues() map[any]int {
m := make(map[any]int)
a.mu.RLock()
defer a.mu.RUnlock()
for _, v := range a.array {
@ -637,13 +633,13 @@ func (a *SortedArray) CountValues() map[interface{}]int {
}
// Iterator is alias of IteratorAsc.
func (a *SortedArray) Iterator(f func(k int, v interface{}) bool) {
func (a *SortedArray) Iterator(f func(k int, v any) bool) {
a.IteratorAsc(f)
}
// IteratorAsc iterates the array readonly in ascending order with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (a *SortedArray) IteratorAsc(f func(k int, v interface{}) bool) {
func (a *SortedArray) IteratorAsc(f func(k int, v any) bool) {
a.mu.RLock()
defer a.mu.RUnlock()
for k, v := range a.array {
@ -655,7 +651,7 @@ func (a *SortedArray) IteratorAsc(f func(k int, v interface{}) bool) {
// IteratorDesc iterates the array readonly in descending order with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (a *SortedArray) IteratorDesc(f func(k int, v interface{}) bool) {
func (a *SortedArray) IteratorDesc(f func(k int, v any) bool) {
a.mu.RLock()
defer a.mu.RUnlock()
for i := len(a.array) - 1; i >= 0; i-- {
@ -702,7 +698,7 @@ func (a SortedArray) MarshalJSON() ([]byte, error) {
// Note that the comparator is set as string comparator in default.
func (a *SortedArray) UnmarshalJSON(b []byte) error {
if a.comparator == nil {
a.array = make([]interface{}, 0)
a.array = make([]any, 0)
a.comparator = gutil.ComparatorString
}
a.mu.Lock()
@ -720,7 +716,7 @@ func (a *SortedArray) UnmarshalJSON(b []byte) error {
// UnmarshalValue is an interface implement which sets any type of value for array.
// Note that the comparator is set as string comparator in default.
func (a *SortedArray) UnmarshalValue(value interface{}) (err error) {
func (a *SortedArray) UnmarshalValue(value any) (err error) {
if a.comparator == nil {
a.comparator = gutil.ComparatorString
}
@ -764,7 +760,7 @@ func (a *SortedArray) FilterNil() *SortedArray {
// Filter iterates array and filters elements using custom callback function.
// It removes the element from array if callback function `filter` returns true,
// it or else does nothing and continues iterating.
func (a *SortedArray) Filter(filter func(index int, value interface{}) bool) *SortedArray {
func (a *SortedArray) Filter(filter func(index int, value any) bool) *SortedArray {
a.mu.Lock()
defer a.mu.Unlock()
for i := 0; i < len(a.array); {
@ -800,7 +796,7 @@ func (a *SortedArray) FilterEmpty() *SortedArray {
}
// Walk applies a user supplied function `f` to every item of array.
func (a *SortedArray) Walk(f func(value interface{}) interface{}) *SortedArray {
func (a *SortedArray) Walk(f func(value any) any) *SortedArray {
a.mu.Lock()
defer a.mu.Unlock()
// Keep the array always sorted.
@ -820,7 +816,7 @@ func (a *SortedArray) IsEmpty() bool {
// getComparator returns the comparator if it's previously set,
// or else it panics.
func (a *SortedArray) getComparator() func(a, b interface{}) int {
func (a *SortedArray) getComparator() func(a, b any) int {
if a.comparator == nil {
panic("comparator is missing for sorted array")
}
@ -828,13 +824,13 @@ func (a *SortedArray) getComparator() func(a, b interface{}) int {
}
// DeepCopy implements interface for deep copy of current type.
func (a *SortedArray) DeepCopy() interface{} {
func (a *SortedArray) DeepCopy() any {
if a == nil {
return nil
}
a.mu.RLock()
defer a.mu.RUnlock()
newSlice := make([]interface{}, len(a.array))
newSlice := make([]any, len(a.array))
for i, v := range a.array {
newSlice[i] = deepcopy.Copy(v)
}

View File

@ -420,11 +420,11 @@ func (a *SortedIntArray) Slice() []int {
return array
}
// Interfaces returns current array as []interface{}.
func (a *SortedIntArray) Interfaces() []interface{} {
// Interfaces returns current array as []any.
func (a *SortedIntArray) Interfaces() []any {
a.mu.RLock()
defer a.mu.RUnlock()
array := make([]interface{}, len(a.array))
array := make([]any, len(a.array))
for k, v := range a.array {
array[k] = v
}
@ -496,13 +496,9 @@ func (a *SortedIntArray) Unique() *SortedIntArray {
if len(a.array) == 0 {
return a
}
i := 0
for {
if i == len(a.array)-1 {
break
}
for i := 0; i < len(a.array)-1; {
if a.getComparator()(a.array[i], a.array[i+1]) == 0 {
a.array = append(a.array[:i+1], a.array[i+1+1:]...)
a.array = append(a.array[:i+1], a.array[i+2:]...)
} else {
i++
}
@ -549,7 +545,7 @@ func (a *SortedIntArray) RLockFunc(f func(array []int)) *SortedIntArray {
// The parameter `array` can be any garray or slice type.
// The difference between Merge and Append is Append supports only specified slice type,
// but Merge supports more parameter types.
func (a *SortedIntArray) Merge(array interface{}) *SortedIntArray {
func (a *SortedIntArray) Merge(array any) *SortedIntArray {
return a.Add(gconv.Ints(array)...)
}
@ -691,7 +687,7 @@ func (a *SortedIntArray) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for array.
func (a *SortedIntArray) UnmarshalValue(value interface{}) (err error) {
func (a *SortedIntArray) UnmarshalValue(value any) (err error) {
if a.comparator == nil {
a.comparator = defaultComparatorInt
}
@ -775,7 +771,7 @@ func (a *SortedIntArray) getComparator() func(a, b int) int {
}
// DeepCopy implements interface for deep copy of current type.
func (a *SortedIntArray) DeepCopy() interface{} {
func (a *SortedIntArray) DeepCopy() any {
if a == nil {
return nil
}

View File

@ -406,11 +406,11 @@ func (a *SortedStrArray) Slice() []string {
return array
}
// Interfaces returns current array as []interface{}.
func (a *SortedStrArray) Interfaces() []interface{} {
// Interfaces returns current array as []any.
func (a *SortedStrArray) Interfaces() []any {
a.mu.RLock()
defer a.mu.RUnlock()
array := make([]interface{}, len(a.array))
array := make([]any, len(a.array))
for k, v := range a.array {
array[k] = v
}
@ -498,13 +498,9 @@ func (a *SortedStrArray) Unique() *SortedStrArray {
if len(a.array) == 0 {
return a
}
i := 0
for {
if i == len(a.array)-1 {
break
}
for i := 0; i < len(a.array)-1; {
if a.getComparator()(a.array[i], a.array[i+1]) == 0 {
a.array = append(a.array[:i+1], a.array[i+1+1:]...)
a.array = append(a.array[:i+1], a.array[i+2:]...)
} else {
i++
}
@ -551,7 +547,7 @@ func (a *SortedStrArray) RLockFunc(f func(array []string)) *SortedStrArray {
// The parameter `array` can be any garray or slice type.
// The difference between Merge and Append is Append supports only specified slice type,
// but Merge supports more parameter types.
func (a *SortedStrArray) Merge(array interface{}) *SortedStrArray {
func (a *SortedStrArray) Merge(array any) *SortedStrArray {
return a.Add(gconv.Strings(array)...)
}
@ -704,7 +700,7 @@ func (a *SortedStrArray) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for array.
func (a *SortedStrArray) UnmarshalValue(value interface{}) (err error) {
func (a *SortedStrArray) UnmarshalValue(value any) (err error) {
if a.comparator == nil {
a.comparator = defaultComparatorStr
}
@ -788,7 +784,7 @@ func (a *SortedStrArray) getComparator() func(a, b string) int {
}
// DeepCopy implements interface for deep copy of current type.
func (a *SortedStrArray) DeepCopy() interface{} {
func (a *SortedStrArray) DeepCopy() any {
if a == nil {
return nil
}

View File

@ -14,12 +14,12 @@ import (
type anySortedArrayItem struct {
priority int64
value interface{}
value any
}
var (
anyArray = garray.NewArray()
anySortedArray = garray.NewSortedArray(func(a, b interface{}) int {
anySortedArray = garray.NewSortedArray(func(a, b any) int {
return int(a.(anySortedArrayItem).priority - b.(anySortedArrayItem).priority)
})
)

View File

@ -81,13 +81,13 @@ func ExampleArray_Iterator() {
// Iterator is alias of IteratorAsc, which iterates the array readonly in ascending order
// with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
array.Iterator(func(k int, v interface{}) bool {
array.Iterator(func(k int, v any) bool {
fmt.Println(k, v)
return true
})
// IteratorDesc iterates the array readonly in descending order with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
array.IteratorDesc(func(k int, v interface{}) bool {
array.IteratorDesc(func(k int, v any) bool {
fmt.Println(k, v)
return true
})
@ -163,7 +163,7 @@ func ExampleArray_Chunk() {
}
func ExampleArray_PopLeft() {
array := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9})
array := garray.NewFrom([]any{1, 2, 3, 4, 5, 6, 7, 8, 9})
// Any Pop* functions pick, delete and return the item from array.
@ -180,7 +180,7 @@ func ExampleArray_PopLeft() {
}
func ExampleArray_PopLefts() {
array := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9})
array := garray.NewFrom([]any{1, 2, 3, 4, 5, 6, 7, 8, 9})
// Any Pop* functions pick, delete and return the item from array.
@ -197,7 +197,7 @@ func ExampleArray_PopLefts() {
}
func ExampleArray_PopRight() {
array := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9})
array := garray.NewFrom([]any{1, 2, 3, 4, 5, 6, 7, 8, 9})
// Any Pop* functions pick, delete and return the item from array.
@ -214,7 +214,7 @@ func ExampleArray_PopRight() {
}
func ExampleArray_PopRights() {
array := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9})
array := garray.NewFrom([]any{1, 2, 3, 4, 5, 6, 7, 8, 9})
// Any Pop* functions pick, delete and return the item from array.
@ -265,10 +265,10 @@ func ExampleArray_Merge() {
func ExampleArray_Filter() {
array1 := garray.NewFrom(g.Slice{0, 1, 2, nil, "", g.Slice{}, "john"})
array2 := garray.NewFrom(g.Slice{0, 1, 2, nil, "", g.Slice{}, "john"})
fmt.Printf("%#v\n", array1.Filter(func(index int, value interface{}) bool {
fmt.Printf("%#v\n", array1.Filter(func(index int, value any) bool {
return empty.IsNil(value)
}).Slice())
fmt.Printf("%#v\n", array2.Filter(func(index int, value interface{}) bool {
fmt.Printf("%#v\n", array2.Filter(func(index int, value any) bool {
return empty.IsEmpty(value)
}).Slice())

View File

@ -131,7 +131,7 @@ func Test_SortedStrArray2(t *testing.T) {
func Test_SortedArray1(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := []string{"0", "1", "10", "2", "3", "4", "5", "6", "7", "8", "9"}
array := garray.NewSortedArray(func(v1, v2 interface{}) int {
array := garray.NewSortedArray(func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
})
for i := 10; i > -1; i-- {
@ -144,7 +144,7 @@ func Test_SortedArray1(t *testing.T) {
func Test_SortedArray2(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := []string{"0", "1", "10", "2", "3", "4", "5", "6", "7", "8", "9"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array := garray.NewSortedArray(func1)
@ -161,7 +161,7 @@ func Test_SortedArray2(t *testing.T) {
func TestNewFromCopy(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"100", "200", "300", "400", "500", "600"}
a1 := []any{"100", "200", "300", "400", "500", "600"}
array1 := garray.NewFromCopy(a1)
t.AssertIN(array1.PopRands(2), a1)
t.Assert(len(array1.PopRands(1)), 1)

View File

@ -22,10 +22,10 @@ import (
func Test_Array_Basic(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := []interface{}{0, 1, 2, 3}
expect := []any{0, 1, 2, 3}
array := garray.NewArrayFrom(expect)
array2 := garray.NewArrayFrom(expect)
array3 := garray.NewArrayFrom([]interface{}{})
array3 := garray.NewArrayFrom([]any{})
array4 := garray.NewArrayRange(1, 5, 1)
t.Assert(array.Slice(), expect)
@ -86,10 +86,10 @@ func Test_Array_Basic(t *testing.T) {
t.Assert(array.Len(), 4)
array.InsertBefore(0, 100)
array.InsertAfter(0, 200)
t.Assert(array.Slice(), []interface{}{100, 200, 2, 2, 3, 4})
t.Assert(array.Slice(), []any{100, 200, 2, 2, 3, 4})
array.InsertBefore(5, 300)
array.InsertAfter(6, 400)
t.Assert(array.Slice(), []interface{}{100, 200, 2, 2, 3, 300, 4, 400})
t.Assert(array.Slice(), []any{100, 200, 2, 2, 3, 300, 4, 400})
t.Assert(array.Clear().Len(), 0)
err = array.InsertBefore(99, 9900)
t.AssertNE(err, nil)
@ -102,17 +102,17 @@ func Test_Array_Basic(t *testing.T) {
func TestArray_Sort(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect1 := []interface{}{0, 1, 2, 3}
expect2 := []interface{}{3, 2, 1, 0}
expect1 := []any{0, 1, 2, 3}
expect2 := []any{3, 2, 1, 0}
array := garray.NewArray()
for i := 3; i >= 0; i-- {
array.Append(i)
}
array.SortFunc(func(v1, v2 interface{}) bool {
array.SortFunc(func(v1, v2 any) bool {
return v1.(int) < v2.(int)
})
t.Assert(array.Slice(), expect1)
array.SortFunc(func(v1, v2 interface{}) bool {
array.SortFunc(func(v1, v2 any) bool {
return v1.(int) > v2.(int)
})
t.Assert(array.Slice(), expect2)
@ -121,20 +121,20 @@ func TestArray_Sort(t *testing.T) {
func TestArray_Unique(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := []interface{}{1, 2, 3, 4, 5, 3, 2, 2, 3, 5, 5}
expect := []any{1, 2, 3, 4, 5, 3, 2, 2, 3, 5, 5}
array := garray.NewArrayFrom(expect)
t.Assert(array.Unique().Slice(), []interface{}{1, 2, 3, 4, 5})
t.Assert(array.Unique().Slice(), []any{1, 2, 3, 4, 5})
})
gtest.C(t, func(t *gtest.T) {
expect := []interface{}{}
expect := []any{}
array := garray.NewArrayFrom(expect)
t.Assert(array.Unique().Slice(), []interface{}{})
t.Assert(array.Unique().Slice(), []any{})
})
}
func TestArray_PushAndPop(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := []interface{}{0, 1, 2, 3}
expect := []any{0, 1, 2, 3}
array := garray.NewArrayFrom(expect)
t.Assert(array.Slice(), expect)
@ -147,24 +147,24 @@ func TestArray_PushAndPop(t *testing.T) {
t.Assert(ok, true)
v, ok = array.PopRand()
t.AssertIN(v, []interface{}{1, 2})
t.AssertIN(v, []any{1, 2})
t.Assert(ok, true)
v, ok = array.PopRand()
t.AssertIN(v, []interface{}{1, 2})
t.AssertIN(v, []any{1, 2})
t.Assert(ok, true)
t.Assert(array.Len(), 0)
array.PushLeft(1).PushRight(2)
t.Assert(array.Slice(), []interface{}{1, 2})
t.Assert(array.Slice(), []any{1, 2})
})
}
func TestArray_PopRands(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{100, 200, 300, 400, 500, 600}
a1 := []any{100, 200, 300, 400, 500, 600}
array := garray.NewFromCopy(a1)
t.AssertIN(array.PopRands(2), []interface{}{100, 200, 300, 400, 500, 600})
t.AssertIN(array.PopRands(2), []any{100, 200, 300, 400, 500, 600})
})
}
@ -247,56 +247,56 @@ func TestArray_PopLeftsAndPopRights(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
value1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
value2 := []interface{}{0, 1, 2, 3, 4, 5, 6}
value1 := []any{0, 1, 2, 3, 4, 5, 6}
value2 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(value1)
array2 := garray.NewArrayFrom(value2)
t.Assert(array1.PopLefts(2), []interface{}{0, 1})
t.Assert(array1.Slice(), []interface{}{2, 3, 4, 5, 6})
t.Assert(array1.PopRights(2), []interface{}{5, 6})
t.Assert(array1.Slice(), []interface{}{2, 3, 4})
t.Assert(array1.PopRights(20), []interface{}{2, 3, 4})
t.Assert(array1.Slice(), []interface{}{})
t.Assert(array2.PopLefts(20), []interface{}{0, 1, 2, 3, 4, 5, 6})
t.Assert(array2.Slice(), []interface{}{})
t.Assert(array1.PopLefts(2), []any{0, 1})
t.Assert(array1.Slice(), []any{2, 3, 4, 5, 6})
t.Assert(array1.PopRights(2), []any{5, 6})
t.Assert(array1.Slice(), []any{2, 3, 4})
t.Assert(array1.PopRights(20), []any{2, 3, 4})
t.Assert(array1.Slice(), []any{})
t.Assert(array2.PopLefts(20), []any{0, 1, 2, 3, 4, 5, 6})
t.Assert(array2.Slice(), []any{})
})
}
func TestArray_Range(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
value1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
value1 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(value1)
array2 := garray.NewArrayFrom(value1, true)
t.Assert(array1.Range(0, 1), []interface{}{0})
t.Assert(array1.Range(1, 2), []interface{}{1})
t.Assert(array1.Range(0, 2), []interface{}{0, 1})
t.Assert(array1.Range(0, 1), []any{0})
t.Assert(array1.Range(1, 2), []any{1})
t.Assert(array1.Range(0, 2), []any{0, 1})
t.Assert(array1.Range(-1, 10), value1)
t.Assert(array1.Range(10, 2), nil)
t.Assert(array2.Range(1, 3), []interface{}{1, 2})
t.Assert(array2.Range(1, 3), []any{1, 2})
})
}
func TestArray_Merge(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
if gconv.Int(v1) < gconv.Int(v2) {
return 0
}
return 1
}
i1 := []interface{}{0, 1, 2, 3}
i2 := []interface{}{4, 5, 6, 7}
i1 := []any{0, 1, 2, 3}
i2 := []any{4, 5, 6, 7}
array1 := garray.NewArrayFrom(i1)
array2 := garray.NewArrayFrom(i2)
t.Assert(array1.Merge(array2).Slice(), []interface{}{0, 1, 2, 3, 4, 5, 6, 7})
t.Assert(array1.Merge(array2).Slice(), []any{0, 1, 2, 3, 4, 5, 6, 7})
// s1 := []string{"a", "b", "c", "d"}
s2 := []string{"e", "f"}
i3 := garray.NewIntArrayFrom([]int{1, 2, 3})
i4 := garray.NewArrayFrom([]interface{}{3})
i4 := garray.NewArrayFrom([]any{3})
s3 := garray.NewStrArrayFrom([]string{"g", "h"})
s4 := garray.NewSortedArrayFrom([]interface{}{4, 5}, func1)
s4 := garray.NewSortedArrayFrom([]any{4, 5}, func1)
s5 := garray.NewSortedStrArrayFrom(s2)
s6 := garray.NewSortedIntArrayFrom([]int{1, 2, 3})
a1 := garray.NewArrayFrom(i1)
@ -313,92 +313,92 @@ func TestArray_Merge(t *testing.T) {
func TestArray_Fill(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0}
a2 := []interface{}{0}
a1 := []any{0}
a2 := []any{0}
array1 := garray.NewArrayFrom(a1)
array2 := garray.NewArrayFrom(a2, true)
t.Assert(array1.Fill(1, 2, 100), nil)
t.Assert(array1.Slice(), []interface{}{0, 100, 100})
t.Assert(array1.Slice(), []any{0, 100, 100})
t.Assert(array2.Fill(0, 2, 100), nil)
t.Assert(array2.Slice(), []interface{}{100, 100})
t.Assert(array2.Slice(), []any{100, 100})
t.AssertNE(array2.Fill(-1, 2, 100), nil)
t.Assert(array2.Slice(), []interface{}{100, 100})
t.Assert(array2.Slice(), []any{100, 100})
})
}
func TestArray_Chunk(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5}
a1 := []any{1, 2, 3, 4, 5}
array1 := garray.NewArrayFrom(a1)
chunks := array1.Chunk(2)
t.Assert(len(chunks), 3)
t.Assert(chunks[0], []interface{}{1, 2})
t.Assert(chunks[1], []interface{}{3, 4})
t.Assert(chunks[2], []interface{}{5})
t.Assert(chunks[0], []any{1, 2})
t.Assert(chunks[1], []any{3, 4})
t.Assert(chunks[2], []any{5})
t.Assert(array1.Chunk(0), nil)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5}
a1 := []any{1, 2, 3, 4, 5}
array1 := garray.NewArrayFrom(a1)
chunks := array1.Chunk(3)
t.Assert(len(chunks), 2)
t.Assert(chunks[0], []interface{}{1, 2, 3})
t.Assert(chunks[1], []interface{}{4, 5})
t.Assert(chunks[0], []any{1, 2, 3})
t.Assert(chunks[1], []any{4, 5})
t.Assert(array1.Chunk(0), nil)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5, 6}
a1 := []any{1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
chunks := array1.Chunk(2)
t.Assert(len(chunks), 3)
t.Assert(chunks[0], []interface{}{1, 2})
t.Assert(chunks[1], []interface{}{3, 4})
t.Assert(chunks[2], []interface{}{5, 6})
t.Assert(chunks[0], []any{1, 2})
t.Assert(chunks[1], []any{3, 4})
t.Assert(chunks[2], []any{5, 6})
t.Assert(array1.Chunk(0), nil)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5, 6}
a1 := []any{1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
chunks := array1.Chunk(3)
t.Assert(len(chunks), 2)
t.Assert(chunks[0], []interface{}{1, 2, 3})
t.Assert(chunks[1], []interface{}{4, 5, 6})
t.Assert(chunks[0], []any{1, 2, 3})
t.Assert(chunks[1], []any{4, 5, 6})
t.Assert(array1.Chunk(0), nil)
})
}
func TestArray_Pad(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0}
a1 := []any{0}
array1 := garray.NewArrayFrom(a1)
t.Assert(array1.Pad(3, 1).Slice(), []interface{}{0, 1, 1})
t.Assert(array1.Pad(-4, 1).Slice(), []interface{}{1, 0, 1, 1})
t.Assert(array1.Pad(3, 1).Slice(), []interface{}{1, 0, 1, 1})
t.Assert(array1.Pad(3, 1).Slice(), []any{0, 1, 1})
t.Assert(array1.Pad(-4, 1).Slice(), []any{1, 0, 1, 1})
t.Assert(array1.Pad(3, 1).Slice(), []any{1, 0, 1, 1})
})
}
func TestArray_SubSlice(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
array2 := garray.NewArrayFrom(a1, true)
t.Assert(array1.SubSlice(0, 2), []interface{}{0, 1})
t.Assert(array1.SubSlice(2, 2), []interface{}{2, 3})
t.Assert(array1.SubSlice(5, 8), []interface{}{5, 6})
t.Assert(array1.SubSlice(0, 2), []any{0, 1})
t.Assert(array1.SubSlice(2, 2), []any{2, 3})
t.Assert(array1.SubSlice(5, 8), []any{5, 6})
t.Assert(array1.SubSlice(9, 1), nil)
t.Assert(array1.SubSlice(-2, 2), []interface{}{5, 6})
t.Assert(array1.SubSlice(-2, 2), []any{5, 6})
t.Assert(array1.SubSlice(-9, 2), nil)
t.Assert(array1.SubSlice(1, -2), nil)
t.Assert(array2.SubSlice(0, 2), []interface{}{0, 1})
t.Assert(array2.SubSlice(0, 2), []any{0, 1})
})
}
func TestArray_Rand(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
t.Assert(len(array1.Rands(2)), 2)
t.Assert(len(array1.Rands(10)), 10)
@ -406,7 +406,7 @@ func TestArray_Rand(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "c", "d"}
a1 := garray.NewArrayFrom(s1)
i1, ok := a1.Rand()
t.Assert(ok, true)
@ -415,7 +415,7 @@ func TestArray_Rand(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{}
a1 := []any{}
array1 := garray.NewArrayFrom(a1)
rand, found := array1.Rand()
t.AssertNil(rand)
@ -423,7 +423,7 @@ func TestArray_Rand(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{}
a1 := []any{}
array1 := garray.NewArrayFrom(a1)
rand := array1.Rands(1)
t.AssertNil(rand)
@ -432,7 +432,7 @@ func TestArray_Rand(t *testing.T) {
func TestArray_Shuffle(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
t.Assert(array1.Shuffle().Len(), 7)
})
@ -440,27 +440,27 @@ func TestArray_Shuffle(t *testing.T) {
func TestArray_Reverse(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
t.Assert(array1.Reverse().Slice(), []interface{}{6, 5, 4, 3, 2, 1, 0})
t.Assert(array1.Reverse().Slice(), []any{6, 5, 4, 3, 2, 1, 0})
})
}
func TestArray_Join(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
t.Assert(array1.Join("."), `0.1.2.3.4.5.6`)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, `"a"`, `\a`}
a1 := []any{0, 1, `"a"`, `\a`}
array1 := garray.NewArrayFrom(a1)
t.Assert(array1.Join("."), `0.1."a".\a`)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{}
a1 := []any{}
array1 := garray.NewArrayFrom(a1)
t.Assert(len(array1.Join(".")), 0)
})
@ -468,7 +468,7 @@ func TestArray_Join(t *testing.T) {
func TestArray_String(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
array1 := garray.NewArrayFrom(a1)
t.Assert(array1.String(), `[0,1,2,3,4,5,6]`)
array1 = nil
@ -478,9 +478,9 @@ func TestArray_String(t *testing.T) {
func TestArray_Replace(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a2 := []interface{}{"a", "b", "c"}
a3 := []interface{}{"m", "n", "p", "z", "x", "y", "d", "u"}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
a2 := []any{"a", "b", "c"}
a3 := []any{"m", "n", "p", "z", "x", "y", "d", "u"}
array1 := garray.NewArrayFrom(a1)
array2 := array1.Replace(a2)
t.Assert(array2.Len(), 7)
@ -497,8 +497,8 @@ func TestArray_Replace(t *testing.T) {
func TestArray_SetArray(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3, 4, 5, 6}
a2 := []interface{}{"a", "b", "c"}
a1 := []any{0, 1, 2, 3, 4, 5, 6}
a2 := []any{"a", "b", "c"}
array1 := garray.NewArrayFrom(a1)
array1 = array1.SetArray(a2)
@ -510,9 +510,9 @@ func TestArray_SetArray(t *testing.T) {
func TestArray_Sum(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3}
a2 := []interface{}{"a", "b", "c"}
a3 := []interface{}{"a", "1", "2"}
a1 := []any{0, 1, 2, 3}
a2 := []any{"a", "b", "c"}
a3 := []any{"a", "1", "2"}
array1 := garray.NewArrayFrom(a1)
array2 := garray.NewArrayFrom(a2)
@ -527,7 +527,7 @@ func TestArray_Sum(t *testing.T) {
func TestArray_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, 2, 3}
a1 := []any{0, 1, 2, 3}
array1 := garray.NewArrayFrom(a1)
array2 := array1.Clone()
@ -540,7 +540,7 @@ func TestArray_Clone(t *testing.T) {
func TestArray_CountValues(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "b", "c", "d", "e", "d"}
a1 := []any{"a", "b", "c", "d", "e", "d"}
array1 := garray.NewArrayFrom(a1)
array2 := array1.CountValues()
t.Assert(len(array2), 5)
@ -551,13 +551,13 @@ func TestArray_CountValues(t *testing.T) {
func TestArray_LockFunc(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "c", "d"}
a1 := garray.NewArrayFrom(s1, true)
ch1 := make(chan int64, 3)
ch2 := make(chan int64, 3)
// go1
go a1.LockFunc(func(n1 []interface{}) { // 读写锁
go a1.LockFunc(func(n1 []any) { // 读写锁
time.Sleep(2 * time.Second) // 暂停2秒
n1[2] = "g"
ch2 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000)
@ -583,13 +583,13 @@ func TestArray_LockFunc(t *testing.T) {
func TestArray_RLockFunc(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "c", "d"}
a1 := garray.NewArrayFrom(s1, true)
ch1 := make(chan int64, 3)
ch2 := make(chan int64, 1)
// go1
go a1.RLockFunc(func(n1 []interface{}) { // 读锁
go a1.RLockFunc(func(n1 []any) { // 读锁
time.Sleep(2 * time.Second) // 暂停1秒
n1[2] = "g"
ch2 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000)
@ -616,7 +616,7 @@ func TestArray_RLockFunc(t *testing.T) {
func TestArray_Json(t *testing.T) {
// pointer
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "d", "c"}
s1 := []any{"a", "b", "d", "c"}
a1 := garray.NewArrayFrom(s1)
b1, err1 := json.Marshal(a1)
b2, err2 := json.Marshal(s1)
@ -635,7 +635,7 @@ func TestArray_Json(t *testing.T) {
})
// value.
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "d", "c"}
s1 := []any{"a", "b", "d", "c"}
a1 := *garray.NewArrayFrom(s1)
b1, err1 := json.Marshal(a1)
b2, err2 := json.Marshal(s1)
@ -696,26 +696,26 @@ func TestArray_Iterator(t *testing.T) {
slice := g.Slice{"a", "b", "d", "c"}
array := garray.NewArrayFrom(slice)
gtest.C(t, func(t *gtest.T) {
array.Iterator(func(k int, v interface{}) bool {
array.Iterator(func(k int, v any) bool {
t.Assert(v, slice[k])
return true
})
})
gtest.C(t, func(t *gtest.T) {
array.IteratorAsc(func(k int, v interface{}) bool {
array.IteratorAsc(func(k int, v any) bool {
t.Assert(v, slice[k])
return true
})
})
gtest.C(t, func(t *gtest.T) {
array.IteratorDesc(func(k int, v interface{}) bool {
array.IteratorDesc(func(k int, v any) bool {
t.Assert(v, slice[k])
return true
})
})
gtest.C(t, func(t *gtest.T) {
index := 0
array.Iterator(func(k int, v interface{}) bool {
array.Iterator(func(k int, v any) bool {
index++
return false
})
@ -723,7 +723,7 @@ func TestArray_Iterator(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
index := 0
array.IteratorAsc(func(k int, v interface{}) bool {
array.IteratorAsc(func(k int, v any) bool {
index++
return false
})
@ -731,7 +731,7 @@ func TestArray_Iterator(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
index := 0
array.IteratorDesc(func(k int, v interface{}) bool {
array.IteratorDesc(func(k int, v any) bool {
index++
return false
})
@ -805,27 +805,27 @@ func TestArray_Filter(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
values := g.Slice{0, 1, 2, 3, 4, "", g.Slice{}}
array := garray.NewArrayFromCopy(values)
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsNil(value)
}).Slice(), values)
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewArrayFromCopy(g.Slice{nil, 1, 2, 3, 4, nil})
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsNil(value)
}), g.Slice{1, 2, 3, 4})
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewArrayFrom(g.Slice{0, 1, 2, 3, 4, "", g.Slice{}})
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsEmpty(value)
}), g.Slice{1, 2, 3, 4})
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewArrayFrom(g.Slice{1, 2, 3, 4})
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsEmpty(value)
}), g.Slice{1, 2, 3, 4})
})
@ -845,7 +845,7 @@ func TestArray_FilterEmpty(t *testing.T) {
func TestArray_Walk(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
array := garray.NewArrayFrom(g.Slice{"1", "2"})
t.Assert(array.Walk(func(value interface{}) interface{} {
t.Assert(array.Walk(func(value any) any {
return "key-" + gconv.String(value)
}), g.Slice{"key-1", "key-2"})
})

View File

@ -195,7 +195,7 @@ func TestIntArray_Range(t *testing.T) {
func TestIntArray_Merge(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
if gconv.Int(v1) < gconv.Int(v2) {
return 0
}
@ -204,7 +204,7 @@ func TestIntArray_Merge(t *testing.T) {
n1 := []int{0, 1, 2, 3}
n2 := []int{4, 5, 6, 7}
i1 := []interface{}{"1", "2"}
i1 := []any{"1", "2"}
s1 := []string{"a", "b", "c"}
s2 := []string{"e", "f"}
a1 := garray.NewIntArrayFrom(n1)
@ -216,7 +216,7 @@ func TestIntArray_Merge(t *testing.T) {
a6 := garray.NewSortedIntArrayFrom([]int{1, 2, 3})
a7 := garray.NewSortedStrArrayFrom(s1)
a8 := garray.NewSortedArrayFrom([]interface{}{4, 5}, func1)
a8 := garray.NewSortedArrayFrom([]any{4, 5}, func1)
t.Assert(a1.Merge(a2).Slice(), []int{0, 1, 2, 3, 4, 5, 6, 7})
t.Assert(a1.Merge(a3).Len(), 10)

View File

@ -235,14 +235,14 @@ func TestStrArray_PopLeftsAndPopRights(t *testing.T) {
value2 := []string{"0", "1", "2", "3", "4", "5", "6"}
array1 := garray.NewStrArrayFrom(value1)
array2 := garray.NewStrArrayFrom(value2)
t.Assert(array1.PopLefts(2), []interface{}{"0", "1"})
t.Assert(array1.Slice(), []interface{}{"2", "3", "4", "5", "6"})
t.Assert(array1.PopRights(2), []interface{}{"5", "6"})
t.Assert(array1.Slice(), []interface{}{"2", "3", "4"})
t.Assert(array1.PopRights(20), []interface{}{"2", "3", "4"})
t.Assert(array1.Slice(), []interface{}{})
t.Assert(array2.PopLefts(20), []interface{}{"0", "1", "2", "3", "4", "5", "6"})
t.Assert(array2.Slice(), []interface{}{})
t.Assert(array1.PopLefts(2), []any{"0", "1"})
t.Assert(array1.Slice(), []any{"2", "3", "4", "5", "6"})
t.Assert(array1.PopRights(2), []any{"5", "6"})
t.Assert(array1.Slice(), []any{"2", "3", "4"})
t.Assert(array1.PopRights(20), []any{"2", "3", "4"})
t.Assert(array1.Slice(), []any{})
t.Assert(array2.PopLefts(20), []any{"0", "1", "2", "3", "4", "5", "6"})
t.Assert(array2.Slice(), []any{})
})
}
@ -251,12 +251,12 @@ func TestString_Range(t *testing.T) {
value1 := []string{"0", "1", "2", "3", "4", "5", "6"}
array1 := garray.NewStrArrayFrom(value1)
array2 := garray.NewStrArrayFrom(value1, true)
t.Assert(array1.Range(0, 1), []interface{}{"0"})
t.Assert(array1.Range(1, 2), []interface{}{"1"})
t.Assert(array1.Range(0, 2), []interface{}{"0", "1"})
t.Assert(array1.Range(0, 1), []any{"0"})
t.Assert(array1.Range(1, 2), []any{"1"})
t.Assert(array1.Range(0, 2), []any{"0", "1"})
t.Assert(array1.Range(-1, 10), value1)
t.Assert(array1.Range(10, 1), nil)
t.Assert(array2.Range(0, 1), []interface{}{"0"})
t.Assert(array2.Range(0, 1), []any{"0"})
})
}
@ -268,7 +268,7 @@ func TestStrArray_Merge(t *testing.T) {
array2 := garray.NewStrArrayFrom(a21)
t.Assert(array1.Merge(array2).Slice(), []string{"0", "1", "2", "3", "4", "5", "6", "7"})
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
if gconv.Int(v1) < gconv.Int(v2) {
return 0
}
@ -278,9 +278,9 @@ func TestStrArray_Merge(t *testing.T) {
s1 := []string{"a", "b", "c", "d"}
s2 := []string{"e", "f"}
i1 := garray.NewIntArrayFrom([]int{1, 2, 3})
i2 := garray.NewArrayFrom([]interface{}{3})
i2 := garray.NewArrayFrom([]any{3})
s3 := garray.NewStrArrayFrom([]string{"g", "h"})
s4 := garray.NewSortedArrayFrom([]interface{}{4, 5}, func1)
s4 := garray.NewSortedArrayFrom([]any{4, 5}, func1)
s5 := garray.NewSortedStrArrayFrom(s2)
s6 := garray.NewSortedIntArrayFrom([]int{1, 2, 3})
a1 := garray.NewStrArrayFrom(s1)

View File

@ -24,91 +24,91 @@ import (
func TestSortedArray_NewSortedArrayFrom(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "f", "c"}
a2 := []interface{}{"h", "j", "i", "k"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "f", "c"}
a2 := []any{"h", "j", "i", "k"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
func2 := func(v1, v2 interface{}) int {
func2 := func(v1, v2 any) int {
return -1
}
array1 := garray.NewSortedArrayFrom(a1, func1)
array2 := garray.NewSortedArrayFrom(a2, func2)
t.Assert(array1.Len(), 3)
t.Assert(array1, []interface{}{"a", "c", "f"})
t.Assert(array1, []any{"a", "c", "f"})
t.Assert(array2.Len(), 4)
t.Assert(array2, []interface{}{"k", "i", "j", "h"})
t.Assert(array2, []any{"k", "i", "j", "h"})
})
}
func TestNewSortedArrayFromCopy(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "f", "c"}
a1 := []any{"a", "f", "c"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
func2 := func(v1, v2 interface{}) int {
func2 := func(v1, v2 any) int {
return -1
}
array1 := garray.NewSortedArrayFromCopy(a1, func1)
array2 := garray.NewSortedArrayFromCopy(a1, func2)
t.Assert(array1.Len(), 3)
t.Assert(array1, []interface{}{"a", "c", "f"})
t.Assert(array1, []any{"a", "c", "f"})
t.Assert(array1.Len(), 3)
t.Assert(array2, []interface{}{"c", "f", "a"})
t.Assert(array2, []any{"c", "f", "a"})
})
}
func TestNewSortedArrayRange(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return gconv.Int(v1) - gconv.Int(v2)
}
array1 := garray.NewSortedArrayRange(1, 5, 1, func1)
t.Assert(array1.Len(), 5)
t.Assert(array1, []interface{}{1, 2, 3, 4, 5})
t.Assert(array1, []any{1, 2, 3, 4, 5})
})
}
func TestSortedArray_SetArray(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "f", "c"}
a2 := []interface{}{"e", "h", "g", "k"}
a1 := []any{"a", "f", "c"}
a2 := []any{"e", "h", "g", "k"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
array1.SetArray(a2)
t.Assert(array1.Len(), 4)
t.Assert(array1, []interface{}{"e", "g", "h", "k"})
t.Assert(array1, []any{"e", "g", "h", "k"})
})
}
func TestSortedArray_Sort(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "f", "c"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "f", "c"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
array1.Sort()
t.Assert(array1.Len(), 3)
t.Assert(array1, []interface{}{"a", "c", "f"})
t.Assert(array1, []any{"a", "c", "f"})
})
}
func TestSortedArray_Get(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "f", "c"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "f", "c"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -129,8 +129,8 @@ func TestSortedArray_Get(t *testing.T) {
func TestSortedArray_At(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "f", "c"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "f", "c"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -141,8 +141,8 @@ func TestSortedArray_At(t *testing.T) {
func TestSortedArray_Remove(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c", "b"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -178,14 +178,14 @@ func TestSortedArray_Remove(t *testing.T) {
func TestSortedArray_PopLeft(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
array1 := garray.NewSortedArrayFrom(
[]interface{}{"a", "d", "c", "b"},
[]any{"a", "d", "c", "b"},
gutil.ComparatorString,
)
i1, ok := array1.PopLeft()
t.Assert(ok, true)
t.Assert(gconv.String(i1), "a")
t.Assert(array1.Len(), 3)
t.Assert(array1, []interface{}{"b", "c", "d"})
t.Assert(array1, []any{"b", "c", "d"})
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFrom(g.Slice{1, 2, 3}, gutil.ComparatorInt)
@ -207,14 +207,14 @@ func TestSortedArray_PopLeft(t *testing.T) {
func TestSortedArray_PopRight(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
array1 := garray.NewSortedArrayFrom(
[]interface{}{"a", "d", "c", "b"},
[]any{"a", "d", "c", "b"},
gutil.ComparatorString,
)
i1, ok := array1.PopRight()
t.Assert(ok, true)
t.Assert(gconv.String(i1), "d")
t.Assert(array1.Len(), 3)
t.Assert(array1, []interface{}{"a", "b", "c"})
t.Assert(array1, []any{"a", "b", "c"})
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFrom(g.Slice{1, 2, 3}, gutil.ComparatorInt)
@ -237,14 +237,14 @@ func TestSortedArray_PopRight(t *testing.T) {
func TestSortedArray_PopRand(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c", "b"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
i1, ok := array1.PopRand()
t.Assert(ok, true)
t.AssertIN(i1, []interface{}{"a", "d", "c", "b"})
t.AssertIN(i1, []any{"a", "d", "c", "b"})
t.Assert(array1.Len(), 3)
})
@ -252,19 +252,19 @@ func TestSortedArray_PopRand(t *testing.T) {
func TestSortedArray_PopRands(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c", "b"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
i1 := array1.PopRands(2)
t.Assert(len(i1), 2)
t.AssertIN(i1, []interface{}{"a", "d", "c", "b"})
t.AssertIN(i1, []any{"a", "d", "c", "b"})
t.Assert(array1.Len(), 2)
i2 := array1.PopRands(3)
t.Assert(len(i1), 2)
t.AssertIN(i2, []interface{}{"a", "d", "c", "b"})
t.AssertIN(i2, []any{"a", "d", "c", "b"})
t.Assert(array1.Len(), 0)
})
@ -292,33 +292,33 @@ func TestSortedArray_Empty(t *testing.T) {
func TestSortedArray_PopLefts(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
i1 := array1.PopLefts(2)
t.Assert(len(i1), 2)
t.AssertIN(i1, []interface{}{"a", "d", "c", "b", "e", "f"})
t.AssertIN(i1, []any{"a", "d", "c", "b", "e", "f"})
t.Assert(array1.Len(), 4)
i2 := array1.PopLefts(5)
t.Assert(len(i2), 4)
t.AssertIN(i1, []interface{}{"a", "d", "c", "b", "e", "f"})
t.AssertIN(i1, []any{"a", "d", "c", "b", "e", "f"})
t.Assert(array1.Len(), 0)
})
}
func TestSortedArray_PopRights(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
i1 := array1.PopRights(2)
t.Assert(len(i1), 2)
t.Assert(i1, []interface{}{"e", "f"})
t.Assert(i1, []any{"e", "f"})
t.Assert(array1.Len(), 4)
i2 := array1.PopRights(10)
@ -329,36 +329,36 @@ func TestSortedArray_PopRights(t *testing.T) {
func TestSortedArray_Range(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
array2 := garray.NewSortedArrayFrom(a1, func1, true)
i1 := array1.Range(2, 5)
t.Assert(i1, []interface{}{"c", "d", "e"})
t.Assert(i1, []any{"c", "d", "e"})
t.Assert(array1.Len(), 6)
i2 := array1.Range(7, 5)
t.Assert(len(i2), 0)
i2 = array1.Range(-1, 2)
t.Assert(i2, []interface{}{"a", "b"})
t.Assert(i2, []any{"a", "b"})
i2 = array1.Range(4, 10)
t.Assert(len(i2), 2)
t.Assert(i2, []interface{}{"e", "f"})
t.Assert(i2, []any{"e", "f"})
t.Assert(array2.Range(1, 3), []interface{}{"b", "c"})
t.Assert(array2.Range(1, 3), []any{"b", "c"})
})
}
func TestSortedArray_Sum(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e", "f"}
a2 := []interface{}{"1", "2", "3", "b", "e", "f"}
a3 := []interface{}{"4", "5", "6"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c", "b", "e", "f"}
a2 := []any{"1", "2", "3", "b", "e", "f"}
a3 := []any{"4", "5", "6"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -373,9 +373,9 @@ func TestSortedArray_Sum(t *testing.T) {
func TestSortedArray_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e", "f"}
a1 := []any{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -389,9 +389,9 @@ func TestSortedArray_Clone(t *testing.T) {
func TestSortedArray_Clear(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e", "f"}
a1 := []any{"a", "d", "c", "b", "e", "f"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -404,66 +404,66 @@ func TestSortedArray_Clear(t *testing.T) {
func TestSortedArray_Chunk(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e"}
a1 := []any{"a", "d", "c", "b", "e"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
i1 := array1.Chunk(2)
t.Assert(len(i1), 3)
t.Assert(i1[0], []interface{}{"a", "b"})
t.Assert(i1[2], []interface{}{"e"})
t.Assert(i1[0], []any{"a", "b"})
t.Assert(i1[2], []any{"e"})
i1 = array1.Chunk(0)
t.Assert(len(i1), 0)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5}
a1 := []any{1, 2, 3, 4, 5}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorInt)
chunks := array1.Chunk(3)
t.Assert(len(chunks), 2)
t.Assert(chunks[0], []interface{}{1, 2, 3})
t.Assert(chunks[1], []interface{}{4, 5})
t.Assert(chunks[0], []any{1, 2, 3})
t.Assert(chunks[1], []any{4, 5})
t.Assert(array1.Chunk(0), nil)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5, 6}
a1 := []any{1, 2, 3, 4, 5, 6}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorInt)
chunks := array1.Chunk(2)
t.Assert(len(chunks), 3)
t.Assert(chunks[0], []interface{}{1, 2})
t.Assert(chunks[1], []interface{}{3, 4})
t.Assert(chunks[2], []interface{}{5, 6})
t.Assert(chunks[0], []any{1, 2})
t.Assert(chunks[1], []any{3, 4})
t.Assert(chunks[2], []any{5, 6})
t.Assert(array1.Chunk(0), nil)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5, 6}
a1 := []any{1, 2, 3, 4, 5, 6}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorInt)
chunks := array1.Chunk(3)
t.Assert(len(chunks), 2)
t.Assert(chunks[0], []interface{}{1, 2, 3})
t.Assert(chunks[1], []interface{}{4, 5, 6})
t.Assert(chunks[0], []any{1, 2, 3})
t.Assert(chunks[1], []any{4, 5, 6})
t.Assert(array1.Chunk(0), nil)
})
}
func TestSortedArray_SubSlice(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "b", "e"}
a1 := []any{"a", "d", "c", "b", "e"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
array2 := garray.NewSortedArrayFrom(a1, func1, true)
i1 := array1.SubSlice(2, 3)
t.Assert(len(i1), 3)
t.Assert(i1, []interface{}{"c", "d", "e"})
t.Assert(i1, []any{"c", "d", "e"})
i1 = array1.SubSlice(2, 6)
t.Assert(len(i1), 3)
t.Assert(i1, []interface{}{"c", "d", "e"})
t.Assert(i1, []any{"c", "d", "e"})
i1 = array1.SubSlice(7, 2)
t.Assert(len(i1), 0)
@ -473,25 +473,25 @@ func TestSortedArray_SubSlice(t *testing.T) {
s1 = array1.SubSlice(-9, 2)
t.Assert(s1, nil)
t.Assert(array2.SubSlice(1, 3), []interface{}{"b", "c", "d"})
t.Assert(array2.SubSlice(1, 3), []any{"b", "c", "d"})
})
}
func TestSortedArray_Rand(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c"}
a1 := []any{"a", "d", "c"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
i1, ok := array1.Rand()
t.Assert(ok, true)
t.AssertIN(i1, []interface{}{"a", "d", "c"})
t.AssertIN(i1, []any{"a", "d", "c"})
t.Assert(array1.Len(), 3)
array2 := garray.NewSortedArrayFrom([]interface{}{}, func1)
array2 := garray.NewSortedArrayFrom([]any{}, func1)
v, ok := array2.Rand()
t.Assert(ok, false)
t.Assert(v, nil)
@ -500,21 +500,21 @@ func TestSortedArray_Rand(t *testing.T) {
func TestSortedArray_Rands(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c"}
a1 := []any{"a", "d", "c"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
i1 := array1.Rands(2)
t.AssertIN(i1, []interface{}{"a", "d", "c"})
t.AssertIN(i1, []any{"a", "d", "c"})
t.Assert(len(i1), 2)
t.Assert(array1.Len(), 3)
i1 = array1.Rands(4)
t.Assert(len(i1), 4)
array2 := garray.NewSortedArrayFrom([]interface{}{}, func1)
array2 := garray.NewSortedArrayFrom([]any{}, func1)
v := array2.Rands(1)
t.Assert(v, nil)
})
@ -522,8 +522,8 @@ func TestSortedArray_Rands(t *testing.T) {
func TestSortedArray_Join(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c"}
func1 := func(v1, v2 interface{}) int {
a1 := []any{"a", "d", "c"}
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -532,13 +532,13 @@ func TestSortedArray_Join(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, `"a"`, `\a`}
a1 := []any{0, 1, `"a"`, `\a`}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorString)
t.Assert(array1.Join("."), `"a".0.1.\a`)
})
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{}
a1 := []any{}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorString)
t.Assert(array1.Join("."), "")
})
@ -546,7 +546,7 @@ func TestSortedArray_Join(t *testing.T) {
func TestSortedArray_String(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{0, 1, "a", "b"}
a1 := []any{0, 1, "a", "b"}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorString)
t.Assert(array1.String(), `[0,1,"a","b"]`)
@ -557,9 +557,9 @@ func TestSortedArray_String(t *testing.T) {
func TestSortedArray_CountValues(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{"a", "d", "c", "c"}
a1 := []any{"a", "d", "c", "c"}
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
array1 := garray.NewSortedArrayFrom(a1, func1)
@ -573,41 +573,41 @@ func TestSortedArray_CountValues(t *testing.T) {
func TestSortedArray_SetUnique(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5, 3, 2, 2, 3, 5, 5}
a1 := []any{1, 2, 3, 4, 5, 3, 2, 2, 3, 5, 5}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorInt)
array1.SetUnique(true)
t.Assert(array1.Len(), 5)
t.Assert(array1, []interface{}{1, 2, 3, 4, 5})
t.Assert(array1, []any{1, 2, 3, 4, 5})
})
}
func TestSortedArray_Unique(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
a1 := []interface{}{1, 2, 3, 4, 5, 3, 2, 2, 3, 5, 5}
a1 := []any{1, 2, 3, 4, 5, 3, 2, 2, 3, 5, 5}
array1 := garray.NewSortedArrayFrom(a1, gutil.ComparatorInt)
array1.Unique()
t.Assert(array1.Len(), 5)
t.Assert(array1, []interface{}{1, 2, 3, 4, 5})
t.Assert(array1, []any{1, 2, 3, 4, 5})
array2 := garray.NewSortedArrayFrom([]interface{}{}, gutil.ComparatorInt)
array2 := garray.NewSortedArrayFrom([]any{}, gutil.ComparatorInt)
array2.Unique()
t.Assert(array2.Len(), 0)
t.Assert(array2, []interface{}{})
t.Assert(array2, []any{})
})
}
func TestSortedArray_LockFunc(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
s1 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "c", "d"}
a1 := garray.NewSortedArrayFrom(s1, func1, true)
ch1 := make(chan int64, 3)
ch2 := make(chan int64, 3)
// go1
go a1.LockFunc(func(n1 []interface{}) { // 读写锁
go a1.LockFunc(func(n1 []any) { // 读写锁
time.Sleep(2 * time.Second) // 暂停2秒
n1[2] = "g"
ch2 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000)
@ -633,16 +633,16 @@ func TestSortedArray_LockFunc(t *testing.T) {
func TestSortedArray_RLockFunc(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
return strings.Compare(gconv.String(v1), gconv.String(v2))
}
s1 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "c", "d"}
a1 := garray.NewSortedArrayFrom(s1, func1, true)
ch1 := make(chan int64, 3)
ch2 := make(chan int64, 3)
// go1
go a1.RLockFunc(func(n1 []interface{}) { // 读写锁
go a1.RLockFunc(func(n1 []any) { // 读写锁
time.Sleep(2 * time.Second) // 暂停2秒
n1[2] = "g"
ch2 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000)
@ -668,19 +668,19 @@ func TestSortedArray_RLockFunc(t *testing.T) {
func TestSortedArray_Merge(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
if gconv.Int(v1) < gconv.Int(v2) {
return 0
}
return 1
}
s1 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "c", "d"}
s2 := []string{"e", "f"}
i1 := garray.NewIntArrayFrom([]int{1, 2, 3})
i2 := garray.NewArrayFrom([]interface{}{3})
i2 := garray.NewArrayFrom([]any{3})
s3 := garray.NewStrArrayFrom([]string{"g", "h"})
s4 := garray.NewSortedArrayFrom([]interface{}{4, 5}, func1)
s4 := garray.NewSortedArrayFrom([]any{4, 5}, func1)
s5 := garray.NewSortedStrArrayFrom(s2)
s6 := garray.NewSortedIntArrayFrom([]int{1, 2, 3})
@ -699,8 +699,8 @@ func TestSortedArray_Merge(t *testing.T) {
func TestSortedArray_Json(t *testing.T) {
// array pointer
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "d", "c"}
s2 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "d", "c"}
s2 := []any{"a", "b", "c", "d"}
a1 := garray.NewSortedArrayFrom(s1, gutil.ComparatorString)
b1, err1 := json.Marshal(a1)
b2, err2 := json.Marshal(s1)
@ -720,8 +720,8 @@ func TestSortedArray_Json(t *testing.T) {
})
// array value
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "d", "c"}
s2 := []interface{}{"a", "b", "c", "d"}
s1 := []any{"a", "b", "d", "c"}
s2 := []any{"a", "b", "c", "d"}
a1 := *garray.NewSortedArrayFrom(s1, gutil.ComparatorString)
b1, err1 := json.Marshal(a1)
b2, err2 := json.Marshal(s1)
@ -817,26 +817,26 @@ func TestSortedArray_Iterator(t *testing.T) {
slice := g.Slice{"a", "b", "d", "c"}
array := garray.NewSortedArrayFrom(slice, gutil.ComparatorString)
gtest.C(t, func(t *gtest.T) {
array.Iterator(func(k int, v interface{}) bool {
array.Iterator(func(k int, v any) bool {
t.Assert(v, slice[k])
return true
})
})
gtest.C(t, func(t *gtest.T) {
array.IteratorAsc(func(k int, v interface{}) bool {
array.IteratorAsc(func(k int, v any) bool {
t.Assert(v, slice[k])
return true
})
})
gtest.C(t, func(t *gtest.T) {
array.IteratorDesc(func(k int, v interface{}) bool {
array.IteratorDesc(func(k int, v any) bool {
t.Assert(v, slice[k])
return true
})
})
gtest.C(t, func(t *gtest.T) {
index := 0
array.Iterator(func(k int, v interface{}) bool {
array.Iterator(func(k int, v any) bool {
index++
return false
})
@ -844,7 +844,7 @@ func TestSortedArray_Iterator(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
index := 0
array.IteratorAsc(func(k int, v interface{}) bool {
array.IteratorAsc(func(k int, v any) bool {
index++
return false
})
@ -852,7 +852,7 @@ func TestSortedArray_Iterator(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
index := 0
array.IteratorDesc(func(k int, v interface{}) bool {
array.IteratorDesc(func(k int, v any) bool {
index++
return false
})
@ -913,25 +913,25 @@ func TestSortedArray_Filter(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
values := g.Slice{0, 1, 2, 3, 4, "", g.Slice{}}
array := garray.NewSortedArrayFromCopy(values, gutil.ComparatorInt)
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsNil(value)
}).Slice(), g.Slice{0, "", g.Slice{}, 1, 2, 3, 4})
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFromCopy(g.Slice{nil, 1, 2, 3, 4, nil}, gutil.ComparatorInt)
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsNil(value)
}), g.Slice{1, 2, 3, 4})
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFrom(g.Slice{0, 1, 2, 3, 4, "", g.Slice{}}, gutil.ComparatorInt)
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsEmpty(value)
}), g.Slice{1, 2, 3, 4})
})
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFrom(g.Slice{1, 2, 3, 4}, gutil.ComparatorInt)
t.Assert(array.Filter(func(index int, value interface{}) bool {
t.Assert(array.Filter(func(index int, value any) bool {
return empty.IsEmpty(value)
}), g.Slice{1, 2, 3, 4})
})
@ -963,7 +963,7 @@ func TestSortedArray_FilterEmpty(t *testing.T) {
func TestSortedArray_Walk(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFrom(g.Slice{"1", "2"}, gutil.ComparatorString)
t.Assert(array.Walk(func(value interface{}) interface{} {
t.Assert(array.Walk(func(value any) any {
return "key-" + gconv.String(value)
}), g.Slice{"key-1", "key-2"})
})
@ -971,14 +971,14 @@ func TestSortedArray_Walk(t *testing.T) {
func TestSortedArray_IsEmpty(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFrom([]interface{}{}, gutil.ComparatorString)
array := garray.NewSortedArrayFrom([]any{}, gutil.ComparatorString)
t.Assert(array.IsEmpty(), true)
})
}
func TestSortedArray_DeepCopy(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
array := garray.NewSortedArrayFrom([]interface{}{1, 2, 3, 4, 5}, gutil.ComparatorString)
array := garray.NewSortedArrayFrom([]any{1, 2, 3, 4, 5}, gutil.ComparatorString)
copyArray := array.DeepCopy().(*garray.SortedArray)
array.Add(6)
copyArray.Add(7)

View File

@ -573,7 +573,7 @@ func TestSortedIntArray_RLockFunc(t *testing.T) {
func TestSortedIntArray_Merge(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
if gconv.Int(v1) < gconv.Int(v2) {
return 0
}
@ -582,9 +582,9 @@ func TestSortedIntArray_Merge(t *testing.T) {
i0 := []int{1, 2, 3, 4}
s2 := []string{"e", "f"}
i1 := garray.NewIntArrayFrom([]int{1, 2, 3})
i2 := garray.NewArrayFrom([]interface{}{3})
i2 := garray.NewArrayFrom([]any{3})
s3 := garray.NewStrArrayFrom([]string{"g", "h"})
s4 := garray.NewSortedArrayFrom([]interface{}{4, 5}, func1)
s4 := garray.NewSortedArrayFrom([]any{4, 5}, func1)
s5 := garray.NewSortedStrArrayFrom(s2)
s6 := garray.NewSortedIntArrayFrom([]int{1, 2, 3})
a1 := garray.NewSortedIntArrayFrom(i0)

View File

@ -581,7 +581,7 @@ func TestSortedStrArray_RLockFunc(t *testing.T) {
func TestSortedStrArray_Merge(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
func1 := func(v1, v2 interface{}) int {
func1 := func(v1, v2 any) int {
if gconv.Int(v1) < gconv.Int(v2) {
return 0
}
@ -591,9 +591,9 @@ func TestSortedStrArray_Merge(t *testing.T) {
s1 := []string{"a", "b", "c", "d"}
s2 := []string{"e", "f"}
i1 := garray.NewIntArrayFrom([]int{1, 2, 3})
i2 := garray.NewArrayFrom([]interface{}{3})
i2 := garray.NewArrayFrom([]any{3})
s3 := garray.NewStrArrayFrom([]string{"g", "h"})
s4 := garray.NewSortedArrayFrom([]interface{}{4, 5}, func1)
s4 := garray.NewSortedArrayFrom([]any{4, 5}, func1)
s5 := garray.NewSortedStrArrayFrom(s2)
s6 := garray.NewSortedIntArrayFrom([]int{1, 2, 3})
a1 := garray.NewSortedStrArrayFrom(s1)

View File

@ -41,7 +41,7 @@ func New(safe ...bool) *List {
// NewFrom creates and returns a list from a copy of given slice `array`.
// The parameter `safe` is used to specify whether using list in concurrent-safety,
// which is false in default.
func NewFrom(array []interface{}, safe ...bool) *List {
func NewFrom(array []any, safe ...bool) *List {
l := list.New()
for _, v := range array {
l.PushBack(v)
@ -53,7 +53,7 @@ func NewFrom(array []interface{}, safe ...bool) *List {
}
// PushFront inserts a new element `e` with value `v` at the front of list `l` and returns `e`.
func (l *List) PushFront(v interface{}) (e *Element) {
func (l *List) PushFront(v any) (e *Element) {
l.mu.Lock()
if l.list == nil {
l.list = list.New()
@ -64,7 +64,7 @@ func (l *List) PushFront(v interface{}) (e *Element) {
}
// PushBack inserts a new element `e` with value `v` at the back of list `l` and returns `e`.
func (l *List) PushBack(v interface{}) (e *Element) {
func (l *List) PushBack(v any) (e *Element) {
l.mu.Lock()
if l.list == nil {
l.list = list.New()
@ -75,7 +75,7 @@ func (l *List) PushBack(v interface{}) (e *Element) {
}
// PushFronts inserts multiple new elements with values `values` at the front of list `l`.
func (l *List) PushFronts(values []interface{}) {
func (l *List) PushFronts(values []any) {
l.mu.Lock()
if l.list == nil {
l.list = list.New()
@ -87,7 +87,7 @@ func (l *List) PushFronts(values []interface{}) {
}
// PushBacks inserts multiple new elements with values `values` at the back of list `l`.
func (l *List) PushBacks(values []interface{}) {
func (l *List) PushBacks(values []any) {
l.mu.Lock()
if l.list == nil {
l.list = list.New()
@ -99,7 +99,7 @@ func (l *List) PushBacks(values []interface{}) {
}
// PopBack removes the element from back of `l` and returns the value of the element.
func (l *List) PopBack() (value interface{}) {
func (l *List) PopBack() (value any) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
@ -113,7 +113,7 @@ func (l *List) PopBack() (value interface{}) {
}
// PopFront removes the element from front of `l` and returns the value of the element.
func (l *List) PopFront() (value interface{}) {
func (l *List) PopFront() (value any) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
@ -128,7 +128,7 @@ func (l *List) PopFront() (value interface{}) {
// PopBacks removes `max` elements from back of `l`
// and returns values of the removed elements as slice.
func (l *List) PopBacks(max int) (values []interface{}) {
func (l *List) PopBacks(max int) (values []any) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
@ -140,7 +140,7 @@ func (l *List) PopBacks(max int) (values []interface{}) {
if max > 0 && max < length {
length = max
}
values = make([]interface{}, length)
values = make([]any, length)
for i := 0; i < length; i++ {
values[i] = l.list.Remove(l.list.Back())
}
@ -150,7 +150,7 @@ func (l *List) PopBacks(max int) (values []interface{}) {
// PopFronts removes `max` elements from front of `l`
// and returns values of the removed elements as slice.
func (l *List) PopFronts(max int) (values []interface{}) {
func (l *List) PopFronts(max int) (values []any) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
@ -162,7 +162,7 @@ func (l *List) PopFronts(max int) (values []interface{}) {
if max > 0 && max < length {
length = max
}
values = make([]interface{}, length)
values = make([]any, length)
for i := 0; i < length; i++ {
values[i] = l.list.Remove(l.list.Front())
}
@ -172,18 +172,18 @@ func (l *List) PopFronts(max int) (values []interface{}) {
// PopBackAll removes all elements from back of `l`
// and returns values of the removed elements as slice.
func (l *List) PopBackAll() []interface{} {
func (l *List) PopBackAll() []any {
return l.PopBacks(-1)
}
// PopFrontAll removes all elements from front of `l`
// and returns values of the removed elements as slice.
func (l *List) PopFrontAll() []interface{} {
func (l *List) PopFrontAll() []any {
return l.PopFronts(-1)
}
// FrontAll copies and returns values of all elements from front of `l` as slice.
func (l *List) FrontAll() (values []interface{}) {
func (l *List) FrontAll() (values []any) {
l.mu.RLock()
defer l.mu.RUnlock()
if l.list == nil {
@ -191,7 +191,7 @@ func (l *List) FrontAll() (values []interface{}) {
}
length := l.list.Len()
if length > 0 {
values = make([]interface{}, length)
values = make([]any, length)
for i, e := 0, l.list.Front(); i < length; i, e = i+1, e.Next() {
values[i] = e.Value
}
@ -200,7 +200,7 @@ func (l *List) FrontAll() (values []interface{}) {
}
// BackAll copies and returns values of all elements from back of `l` as slice.
func (l *List) BackAll() (values []interface{}) {
func (l *List) BackAll() (values []any) {
l.mu.RLock()
defer l.mu.RUnlock()
if l.list == nil {
@ -208,7 +208,7 @@ func (l *List) BackAll() (values []interface{}) {
}
length := l.list.Len()
if length > 0 {
values = make([]interface{}, length)
values = make([]any, length)
for i, e := 0, l.list.Back(); i < length; i, e = i+1, e.Prev() {
values[i] = e.Value
}
@ -217,7 +217,7 @@ func (l *List) BackAll() (values []interface{}) {
}
// FrontValue returns value of the first element of `l` or nil if the list is empty.
func (l *List) FrontValue() (value interface{}) {
func (l *List) FrontValue() (value any) {
l.mu.RLock()
defer l.mu.RUnlock()
if l.list == nil {
@ -230,7 +230,7 @@ func (l *List) FrontValue() (value interface{}) {
}
// BackValue returns value of the last element of `l` or nil if the list is empty.
func (l *List) BackValue() (value interface{}) {
func (l *List) BackValue() (value any) {
l.mu.RLock()
defer l.mu.RUnlock()
if l.list == nil {
@ -362,7 +362,7 @@ func (l *List) PushFrontList(other *List) {
// InsertAfter inserts a new element `e` with value `v` immediately after `p` and returns `e`.
// If `p` is not an element of `l`, the list is not modified.
// The `p` must not be nil.
func (l *List) InsertAfter(p *Element, v interface{}) (e *Element) {
func (l *List) InsertAfter(p *Element, v any) (e *Element) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
@ -375,7 +375,7 @@ func (l *List) InsertAfter(p *Element, v interface{}) (e *Element) {
// InsertBefore inserts a new element `e` with value `v` immediately before `p` and returns `e`.
// If `p` is not an element of `l`, the list is not modified.
// The `p` must not be nil.
func (l *List) InsertBefore(p *Element, v interface{}) (e *Element) {
func (l *List) InsertBefore(p *Element, v any) (e *Element) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
@ -388,7 +388,7 @@ func (l *List) InsertBefore(p *Element, v interface{}) (e *Element) {
// Remove removes `e` from `l` if `e` is an element of list `l`.
// It returns the element value e.Value.
// The element must not be nil.
func (l *List) Remove(e *Element) (value interface{}) {
func (l *List) Remove(e *Element) (value any) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
@ -522,7 +522,7 @@ func (l *List) UnmarshalJSON(b []byte) error {
if l.list == nil {
l.list = list.New()
}
var array []interface{}
var array []any
if err := json.UnmarshalUseNumber(b, &array); err != nil {
return err
}
@ -531,13 +531,13 @@ func (l *List) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for list.
func (l *List) UnmarshalValue(value interface{}) (err error) {
func (l *List) UnmarshalValue(value any) (err error) {
l.mu.Lock()
defer l.mu.Unlock()
if l.list == nil {
l.list = list.New()
}
var array []interface{}
var array []any
switch value.(type) {
case string, []byte:
err = json.UnmarshalUseNumber(gconv.Bytes(value), &array)
@ -549,7 +549,7 @@ func (l *List) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (l *List) DeepCopy() interface{} {
func (l *List) DeepCopy() any {
if l == nil {
return nil
}
@ -562,7 +562,7 @@ func (l *List) DeepCopy() interface{} {
}
var (
length = l.list.Len()
values = make([]interface{}, length)
values = make([]any, length)
)
if length > 0 {
for i, e := 0, l.list.Front(); i < length; i, e = i+1, e.Next() {

View File

@ -198,7 +198,7 @@ func TestList(t *testing.T) {
})
}
func checkList(t *gtest.T, l *List, es []interface{}) {
func checkList(t *gtest.T, l *List, es []any) {
if !checkListLen(t, l, len(es)) {
return
}
@ -244,36 +244,36 @@ func TestExtending(t *testing.T) {
l3 := New()
l3.PushBackList(l1)
checkList(t, l3, []interface{}{1, 2, 3})
checkList(t, l3, []any{1, 2, 3})
l3.PushBackList(l2)
checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
checkList(t, l3, []any{1, 2, 3, 4, 5})
l3 = New()
l3.PushFrontList(l2)
checkList(t, l3, []interface{}{4, 5})
checkList(t, l3, []any{4, 5})
l3.PushFrontList(l1)
checkList(t, l3, []interface{}{1, 2, 3, 4, 5})
checkList(t, l3, []any{1, 2, 3, 4, 5})
checkList(t, l1, []interface{}{1, 2, 3})
checkList(t, l2, []interface{}{4, 5})
checkList(t, l1, []any{1, 2, 3})
checkList(t, l2, []any{4, 5})
l3 = New()
l3.PushBackList(l1)
checkList(t, l3, []interface{}{1, 2, 3})
checkList(t, l3, []any{1, 2, 3})
l3.PushBackList(l3)
checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
checkList(t, l3, []any{1, 2, 3, 1, 2, 3})
l3 = New()
l3.PushFrontList(l1)
checkList(t, l3, []interface{}{1, 2, 3})
checkList(t, l3, []any{1, 2, 3})
l3.PushFrontList(l3)
checkList(t, l3, []interface{}{1, 2, 3, 1, 2, 3})
checkList(t, l3, []any{1, 2, 3, 1, 2, 3})
l3 = New()
l1.PushBackList(l3)
checkList(t, l1, []interface{}{1, 2, 3})
checkList(t, l1, []any{1, 2, 3})
l1.PushFrontList(l3)
checkList(t, l1, []interface{}{1, 2, 3})
checkList(t, l1, []any{1, 2, 3})
})
}
@ -371,19 +371,19 @@ func TestZeroList(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var l1 = New()
l1.PushFront(1)
checkList(t, l1, []interface{}{1})
checkList(t, l1, []any{1})
var l2 = New()
l2.PushBack(1)
checkList(t, l2, []interface{}{1})
checkList(t, l2, []any{1})
var l3 = New()
l3.PushFrontList(l1)
checkList(t, l3, []interface{}{1})
checkList(t, l3, []any{1})
var l4 = New()
l4.PushBackList(l2)
checkList(t, l4, []interface{}{1})
checkList(t, l4, []any{1})
})
}
@ -395,7 +395,7 @@ func TestInsertBeforeUnknownMark(t *testing.T) {
l.PushBack(2)
l.PushBack(3)
l.InsertBefore(new(Element), 1)
checkList(t, l, []interface{}{1, 2, 3})
checkList(t, l, []any{1, 2, 3})
})
}
@ -407,7 +407,7 @@ func TestInsertAfterUnknownMark(t *testing.T) {
l.PushBack(2)
l.PushBack(3)
l.InsertAfter(new(Element), 1)
checkList(t, l, []interface{}{1, 2, 3})
checkList(t, l, []any{1, 2, 3})
})
}
@ -421,12 +421,12 @@ func TestMoveUnknownMark(t *testing.T) {
e2 := l2.PushBack(2)
l1.MoveAfter(e1, e2)
checkList(t, l1, []interface{}{1})
checkList(t, l2, []interface{}{2})
checkList(t, l1, []any{1})
checkList(t, l2, []any{2})
l1.MoveBefore(e1, e2)
checkList(t, l1, []interface{}{1})
checkList(t, l2, []interface{}{2})
checkList(t, l1, []any{1})
checkList(t, l2, []any{2})
})
}
@ -435,58 +435,58 @@ func TestList_RemoveAll(t *testing.T) {
l := New()
l.PushBack(1)
l.RemoveAll()
checkList(t, l, []interface{}{})
checkList(t, l, []any{})
l.PushBack(2)
checkList(t, l, []interface{}{2})
checkList(t, l, []any{2})
})
}
func TestList_PushFronts(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2}
a1 := []any{1, 2}
l.PushFronts(a1)
checkList(t, l, []interface{}{2, 1})
a1 = []interface{}{3, 4, 5}
checkList(t, l, []any{2, 1})
a1 = []any{3, 4, 5}
l.PushFronts(a1)
checkList(t, l, []interface{}{5, 4, 3, 2, 1})
checkList(t, l, []any{5, 4, 3, 2, 1})
})
}
func TestList_PushBacks(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2}
a1 := []any{1, 2}
l.PushBacks(a1)
checkList(t, l, []interface{}{1, 2})
a1 = []interface{}{3, 4, 5}
checkList(t, l, []any{1, 2})
a1 = []any{3, 4, 5}
l.PushBacks(a1)
checkList(t, l, []interface{}{1, 2, 3, 4, 5})
checkList(t, l, []any{1, 2, 3, 4, 5})
})
}
func TestList_PopBacks(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a2 := []interface{}{"a", "c", "b", "e"}
a1 := []any{1, 2, 3, 4}
a2 := []any{"a", "c", "b", "e"}
l.PushFronts(a1)
i1 := l.PopBacks(2)
t.Assert(i1, []interface{}{1, 2})
t.Assert(i1, []any{1, 2})
l.PushBacks(a2) // 4.3,a,c,b,e
i1 = l.PopBacks(3)
t.Assert(i1, []interface{}{"e", "b", "c"})
t.Assert(i1, []any{"e", "b", "c"})
})
}
func TestList_PopFronts(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
i1 := l.PopFronts(2)
t.Assert(i1, []interface{}{4, 3})
t.Assert(i1, []any{4, 3})
t.Assert(l.Len(), 2)
})
}
@ -494,10 +494,10 @@ func TestList_PopFronts(t *testing.T) {
func TestList_PopBackAll(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
i1 := l.PopBackAll()
t.Assert(i1, []interface{}{1, 2, 3, 4})
t.Assert(i1, []any{1, 2, 3, 4})
t.Assert(l.Len(), 0)
})
}
@ -505,10 +505,10 @@ func TestList_PopBackAll(t *testing.T) {
func TestList_PopFrontAll(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
i1 := l.PopFrontAll()
t.Assert(i1, []interface{}{4, 3, 2, 1})
t.Assert(i1, []any{4, 3, 2, 1})
t.Assert(l.Len(), 0)
})
}
@ -516,10 +516,10 @@ func TestList_PopFrontAll(t *testing.T) {
func TestList_FrontAll(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
i1 := l.FrontAll()
t.Assert(i1, []interface{}{4, 3, 2, 1})
t.Assert(i1, []any{4, 3, 2, 1})
t.Assert(l.Len(), 4)
})
}
@ -527,10 +527,10 @@ func TestList_FrontAll(t *testing.T) {
func TestList_BackAll(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
i1 := l.BackAll()
t.Assert(i1, []interface{}{1, 2, 3, 4})
t.Assert(i1, []any{1, 2, 3, 4})
t.Assert(l.Len(), 4)
})
}
@ -539,7 +539,7 @@ func TestList_FrontValue(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
l2 := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
i1 := l.FrontValue()
t.Assert(gconv.Int(i1), 4)
@ -554,7 +554,7 @@ func TestList_BackValue(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
l2 := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
i1 := l.BackValue()
t.Assert(gconv.Int(i1), 1)
@ -568,7 +568,7 @@ func TestList_BackValue(t *testing.T) {
func TestList_Back(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
e1 := l.Back()
t.Assert(e1.Value, 1)
@ -579,7 +579,7 @@ func TestList_Back(t *testing.T) {
func TestList_Size(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
t.Assert(l.Size(), 4)
l.PopFront()
@ -590,7 +590,7 @@ func TestList_Size(t *testing.T) {
func TestList_Removes(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
e1 := l.Back()
l.Removes([]*Element{e1})
@ -599,25 +599,25 @@ func TestList_Removes(t *testing.T) {
e2 := l.Back()
l.Removes([]*Element{e2})
t.Assert(l.Len(), 2)
checkList(t, l, []interface{}{4, 3})
checkList(t, l, []any{4, 3})
})
}
func TestList_Pop(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9})
l := NewFrom([]any{1, 2, 3, 4, 5, 6, 7, 8, 9})
t.Assert(l.PopBack(), 9)
t.Assert(l.PopBacks(2), []interface{}{8, 7})
t.Assert(l.PopBacks(2), []any{8, 7})
t.Assert(l.PopFront(), 1)
t.Assert(l.PopFronts(2), []interface{}{2, 3})
t.Assert(l.PopFronts(2), []any{2, 3})
})
}
func TestList_Clear(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
l.Clear()
t.Assert(l.Len(), 0)
@ -627,22 +627,22 @@ func TestList_Clear(t *testing.T) {
func TestList_IteratorAsc(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 5, 6, 3, 4}
a1 := []any{1, 2, 5, 6, 3, 4}
l.PushFronts(a1)
e1 := l.Back()
fun1 := func(e *Element) bool {
return gconv.Int(e1.Value) > 2
}
checkList(t, l, []interface{}{4, 3, 6, 5, 2, 1})
checkList(t, l, []any{4, 3, 6, 5, 2, 1})
l.IteratorAsc(fun1)
checkList(t, l, []interface{}{4, 3, 6, 5, 2, 1})
checkList(t, l, []any{4, 3, 6, 5, 2, 1})
})
}
func TestList_IteratorDesc(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{1, 2, 3, 4}
a1 := []any{1, 2, 3, 4}
l.PushFronts(a1)
e1 := l.Back()
fun1 := func(e *Element) bool {
@ -650,28 +650,28 @@ func TestList_IteratorDesc(t *testing.T) {
}
l.IteratorDesc(fun1)
t.Assert(l.Len(), 4)
checkList(t, l, []interface{}{4, 3, 2, 1})
checkList(t, l, []any{4, 3, 2, 1})
})
}
func TestList_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := New()
a1 := []interface{}{"a", "b", "c", "d", "e"}
a1 := []any{"a", "b", "c", "d", "e"}
l.PushFronts(a1)
e1 := l.Back()
fun1 := func(e *Element) bool {
return gconv.String(e1.Value) > "c"
}
checkList(t, l, []interface{}{"e", "d", "c", "b", "a"})
checkList(t, l, []any{"e", "d", "c", "b", "a"})
l.Iterator(fun1)
checkList(t, l, []interface{}{"e", "d", "c", "b", "a"})
checkList(t, l, []any{"e", "d", "c", "b", "a"})
})
}
func TestList_Join(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := NewFrom([]interface{}{1, 2, "a", `"b"`, `\c`})
l := NewFrom([]any{1, 2, "a", `"b"`, `\c`})
t.Assert(l.Join(","), `1,2,a,"b",\c`)
t.Assert(l.Join("."), `1.2.a."b".\c`)
})
@ -679,7 +679,7 @@ func TestList_Join(t *testing.T) {
func TestList_String(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := NewFrom([]interface{}{1, 2, "a", `"b"`, `\c`})
l := NewFrom([]any{1, 2, "a", `"b"`, `\c`})
t.Assert(l.String(), `[1,2,a,"b",\c]`)
})
}
@ -687,7 +687,7 @@ func TestList_String(t *testing.T) {
func TestList_Json(t *testing.T) {
// Marshal
gtest.C(t, func(t *gtest.T) {
a := []interface{}{"a", "b", "c"}
a := []any{"a", "b", "c"}
l := New()
l.PushBacks(a)
b1, err1 := json.Marshal(l)
@ -697,7 +697,7 @@ func TestList_Json(t *testing.T) {
})
// Unmarshal
gtest.C(t, func(t *gtest.T) {
a := []interface{}{"a", "b", "c"}
a := []any{"a", "b", "c"}
l := New()
b, err := json.Marshal(a)
t.AssertNil(err)
@ -708,7 +708,7 @@ func TestList_Json(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
var l List
a := []interface{}{"a", "b", "c"}
a := []any{"a", "b", "c"}
b, err := json.Marshal(a)
t.AssertNil(err)
@ -726,30 +726,30 @@ func TestList_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var tlist *TList
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"list": []byte(`[1,2,3]`),
}, &tlist)
t.AssertNil(err)
t.Assert(tlist.Name, "john")
t.Assert(tlist.List.FrontAll(), []interface{}{1, 2, 3})
t.Assert(tlist.List.FrontAll(), []any{1, 2, 3})
})
// Map
gtest.C(t, func(t *gtest.T) {
var tlist *TList
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"list": []interface{}{1, 2, 3},
"list": []any{1, 2, 3},
}, &tlist)
t.AssertNil(err)
t.Assert(tlist.Name, "john")
t.Assert(tlist.List.FrontAll(), []interface{}{1, 2, 3})
t.Assert(tlist.List.FrontAll(), []any{1, 2, 3})
})
}
func TestList_DeepCopy(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
l := NewFrom([]interface{}{1, 2, "a", `"b"`, `\c`})
l := NewFrom([]any{1, 2, "a", `"b"`, `\c`})
copyList := l.DeepCopy()
cl := copyList.(*List)
cl.PopBack()

View File

@ -24,7 +24,7 @@ func New(safe ...bool) *Map {
// there might be some concurrent-safe issues when changing the map outside.
// The parameter `safe` is used to specify whether using tree in concurrent-safety,
// which is false in default.
func NewFrom(data map[interface{}]interface{}, safe ...bool) *Map {
func NewFrom(data map[any]any, safe ...bool) *Map {
return NewAnyAnyMapFrom(data, safe...)
}
@ -40,6 +40,6 @@ func NewHashMap(safe ...bool) *Map {
// there might be some concurrent-safe issues when changing the map outside.
// The parameter `safe` is used to specify whether using tree in concurrent-safety,
// which is false in default.
func NewHashMapFrom(data map[interface{}]interface{}, safe ...bool) *Map {
func NewHashMapFrom(data map[any]any, safe ...bool) *Map {
return NewAnyAnyMapFrom(data, safe...)
}

View File

@ -17,10 +17,10 @@ import (
"github.com/gogf/gf/v2/util/gconv"
)
// AnyAnyMap wraps map type `map[interface{}]interface{}` and provides more map features.
// AnyAnyMap wraps map type `map[any]any` and provides more map features.
type AnyAnyMap struct {
mu rwmutex.RWMutex
data map[interface{}]interface{}
data map[any]any
}
// NewAnyAnyMap creates and returns an empty hash map.
@ -29,14 +29,14 @@ type AnyAnyMap struct {
func NewAnyAnyMap(safe ...bool) *AnyAnyMap {
return &AnyAnyMap{
mu: rwmutex.Create(safe...),
data: make(map[interface{}]interface{}),
data: make(map[any]any),
}
}
// NewAnyAnyMapFrom creates and returns a hash map from given map `data`.
// Note that, the param `data` map will be set as the underlying data map(no deep copy),
// there might be some concurrent-safe issues when changing the map outside.
func NewAnyAnyMapFrom(data map[interface{}]interface{}, safe ...bool) *AnyAnyMap {
func NewAnyAnyMapFrom(data map[any]any, safe ...bool) *AnyAnyMap {
return &AnyAnyMap{
mu: rwmutex.Create(safe...),
data: data,
@ -45,7 +45,7 @@ func NewAnyAnyMapFrom(data map[interface{}]interface{}, safe ...bool) *AnyAnyMap
// Iterator iterates the hash map readonly with custom callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (m *AnyAnyMap) Iterator(f func(k interface{}, v interface{}) bool) {
func (m *AnyAnyMap) Iterator(f func(k any, v any) bool) {
for k, v := range m.Map() {
if !f(k, v) {
break
@ -61,13 +61,13 @@ func (m *AnyAnyMap) Clone(safe ...bool) *AnyAnyMap {
// Map returns the underlying data map.
// Note that, if it's in concurrent-safe usage, it returns a copy of underlying data,
// or else a pointer to the underlying data.
func (m *AnyAnyMap) Map() map[interface{}]interface{} {
func (m *AnyAnyMap) Map() map[any]any {
m.mu.RLock()
defer m.mu.RUnlock()
if !m.mu.IsSafe() {
return m.data
}
data := make(map[interface{}]interface{}, len(m.data))
data := make(map[any]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
@ -75,21 +75,21 @@ func (m *AnyAnyMap) Map() map[interface{}]interface{} {
}
// MapCopy returns a shallow copy of the underlying data of the hash map.
func (m *AnyAnyMap) MapCopy() map[interface{}]interface{} {
func (m *AnyAnyMap) MapCopy() map[any]any {
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[interface{}]interface{}, len(m.data))
data := make(map[any]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *AnyAnyMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *AnyAnyMap) MapStrAny() map[string]any {
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[gconv.String(k)] = v
}
@ -120,17 +120,17 @@ func (m *AnyAnyMap) FilterNil() {
}
// Set sets key-value to the hash map.
func (m *AnyAnyMap) Set(key interface{}, value interface{}) {
func (m *AnyAnyMap) Set(key any, value any) {
m.mu.Lock()
if m.data == nil {
m.data = make(map[interface{}]interface{})
m.data = make(map[any]any)
}
m.data[key] = value
m.mu.Unlock()
}
// Sets batch sets key-values to the hash map.
func (m *AnyAnyMap) Sets(data map[interface{}]interface{}) {
func (m *AnyAnyMap) Sets(data map[any]any) {
m.mu.Lock()
if m.data == nil {
m.data = data
@ -144,7 +144,7 @@ func (m *AnyAnyMap) Sets(data map[interface{}]interface{}) {
// Search searches the map with given `key`.
// Second return parameter `found` is true if key was found, otherwise false.
func (m *AnyAnyMap) Search(key interface{}) (value interface{}, found bool) {
func (m *AnyAnyMap) Search(key any) (value any, found bool) {
m.mu.RLock()
if m.data != nil {
value, found = m.data[key]
@ -154,7 +154,7 @@ func (m *AnyAnyMap) Search(key interface{}) (value interface{}, found bool) {
}
// Get returns the value by given `key`.
func (m *AnyAnyMap) Get(key interface{}) (value interface{}) {
func (m *AnyAnyMap) Get(key any) (value any) {
m.mu.RLock()
if m.data != nil {
value = m.data[key]
@ -164,7 +164,7 @@ func (m *AnyAnyMap) Get(key interface{}) (value interface{}) {
}
// Pop retrieves and deletes an item from the map.
func (m *AnyAnyMap) Pop() (key, value interface{}) {
func (m *AnyAnyMap) Pop() (key, value any) {
m.mu.Lock()
defer m.mu.Unlock()
for key, value = range m.data {
@ -176,7 +176,7 @@ func (m *AnyAnyMap) Pop() (key, value interface{}) {
// Pops retrieves and deletes `size` items from the map.
// It returns all items if size == -1.
func (m *AnyAnyMap) Pops(size int) map[interface{}]interface{} {
func (m *AnyAnyMap) Pops(size int) map[any]any {
m.mu.Lock()
defer m.mu.Unlock()
if size > len(m.data) || size == -1 {
@ -187,7 +187,7 @@ func (m *AnyAnyMap) Pops(size int) map[interface{}]interface{} {
}
var (
index = 0
newMap = make(map[interface{}]interface{}, size)
newMap = make(map[any]any, size)
)
for k, v := range m.data {
delete(m.data, k)
@ -209,16 +209,16 @@ func (m *AnyAnyMap) Pops(size int) map[interface{}]interface{} {
// and its return value will be set to the map with `key`.
//
// It returns value with given `key`.
func (m *AnyAnyMap) doSetWithLockCheck(key interface{}, value interface{}) interface{} {
func (m *AnyAnyMap) doSetWithLockCheck(key any, value any) any {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[interface{}]interface{})
m.data = make(map[any]any)
}
if v, ok := m.data[key]; ok {
return v
}
if f, ok := value.(func() interface{}); ok {
if f, ok := value.(func() any); ok {
value = f()
}
if value != nil {
@ -229,7 +229,7 @@ func (m *AnyAnyMap) doSetWithLockCheck(key interface{}, value interface{}) inter
// GetOrSet returns the value by key,
// or sets value with given `value` if it does not exist and then returns this value.
func (m *AnyAnyMap) GetOrSet(key interface{}, value interface{}) interface{} {
func (m *AnyAnyMap) GetOrSet(key any, value any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, value)
} else {
@ -240,7 +240,7 @@ func (m *AnyAnyMap) GetOrSet(key interface{}, value interface{}) interface{} {
// GetOrSetFunc returns the value by key,
// or sets value with returned value of callback function `f` if it does not exist
// and then returns this value.
func (m *AnyAnyMap) GetOrSetFunc(key interface{}, f func() interface{}) interface{} {
func (m *AnyAnyMap) GetOrSetFunc(key any, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f())
} else {
@ -254,7 +254,7 @@ func (m *AnyAnyMap) GetOrSetFunc(key interface{}, f func() interface{}) interfac
//
// GetOrSetFuncLock differs with GetOrSetFunc function is that it executes function `f`
// with mutex.Lock of the hash map.
func (m *AnyAnyMap) GetOrSetFuncLock(key interface{}, f func() interface{}) interface{} {
func (m *AnyAnyMap) GetOrSetFuncLock(key any, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f)
} else {
@ -264,31 +264,31 @@ func (m *AnyAnyMap) GetOrSetFuncLock(key interface{}, f func() interface{}) inte
// GetVar returns a Var with the value by given `key`.
// The returned Var is un-concurrent safe.
func (m *AnyAnyMap) GetVar(key interface{}) *gvar.Var {
func (m *AnyAnyMap) GetVar(key any) *gvar.Var {
return gvar.New(m.Get(key))
}
// GetVarOrSet returns a Var with result from GetOrSet.
// The returned Var is un-concurrent safe.
func (m *AnyAnyMap) GetVarOrSet(key interface{}, value interface{}) *gvar.Var {
func (m *AnyAnyMap) GetVarOrSet(key any, value any) *gvar.Var {
return gvar.New(m.GetOrSet(key, value))
}
// GetVarOrSetFunc returns a Var with result from GetOrSetFunc.
// The returned Var is un-concurrent safe.
func (m *AnyAnyMap) GetVarOrSetFunc(key interface{}, f func() interface{}) *gvar.Var {
func (m *AnyAnyMap) GetVarOrSetFunc(key any, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFunc(key, f))
}
// GetVarOrSetFuncLock returns a Var with result from GetOrSetFuncLock.
// The returned Var is un-concurrent safe.
func (m *AnyAnyMap) GetVarOrSetFuncLock(key interface{}, f func() interface{}) *gvar.Var {
func (m *AnyAnyMap) GetVarOrSetFuncLock(key any, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFuncLock(key, f))
}
// SetIfNotExist sets `value` to the map if the `key` does not exist, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *AnyAnyMap) SetIfNotExist(key interface{}, value interface{}) bool {
func (m *AnyAnyMap) SetIfNotExist(key any, value any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, value)
return true
@ -298,7 +298,7 @@ func (m *AnyAnyMap) SetIfNotExist(key interface{}, value interface{}) bool {
// SetIfNotExistFunc sets value with return value of callback function `f`, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *AnyAnyMap) SetIfNotExistFunc(key interface{}, f func() interface{}) bool {
func (m *AnyAnyMap) SetIfNotExistFunc(key any, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f())
return true
@ -311,7 +311,7 @@ func (m *AnyAnyMap) SetIfNotExistFunc(key interface{}, f func() interface{}) boo
//
// SetIfNotExistFuncLock differs with SetIfNotExistFunc function is that
// it executes function `f` with mutex.Lock of the hash map.
func (m *AnyAnyMap) SetIfNotExistFuncLock(key interface{}, f func() interface{}) bool {
func (m *AnyAnyMap) SetIfNotExistFuncLock(key any, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f)
return true
@ -320,7 +320,7 @@ func (m *AnyAnyMap) SetIfNotExistFuncLock(key interface{}, f func() interface{})
}
// Remove deletes value from map by given `key`, and return this deleted value.
func (m *AnyAnyMap) Remove(key interface{}) (value interface{}) {
func (m *AnyAnyMap) Remove(key any) (value any) {
m.mu.Lock()
if m.data != nil {
var ok bool
@ -333,7 +333,7 @@ func (m *AnyAnyMap) Remove(key interface{}) (value interface{}) {
}
// Removes batch deletes values of the map by keys.
func (m *AnyAnyMap) Removes(keys []interface{}) {
func (m *AnyAnyMap) Removes(keys []any) {
m.mu.Lock()
if m.data != nil {
for _, key := range keys {
@ -344,11 +344,11 @@ func (m *AnyAnyMap) Removes(keys []interface{}) {
}
// Keys returns all keys of the map as a slice.
func (m *AnyAnyMap) Keys() []interface{} {
func (m *AnyAnyMap) Keys() []any {
m.mu.RLock()
defer m.mu.RUnlock()
var (
keys = make([]interface{}, len(m.data))
keys = make([]any, len(m.data))
index = 0
)
for key := range m.data {
@ -359,11 +359,11 @@ func (m *AnyAnyMap) Keys() []interface{} {
}
// Values returns all values of the map as a slice.
func (m *AnyAnyMap) Values() []interface{} {
func (m *AnyAnyMap) Values() []any {
m.mu.RLock()
defer m.mu.RUnlock()
var (
values = make([]interface{}, len(m.data))
values = make([]any, len(m.data))
index = 0
)
for _, value := range m.data {
@ -375,7 +375,7 @@ func (m *AnyAnyMap) Values() []interface{} {
// Contains checks whether a key exists.
// It returns true if the `key` exists, or else false.
func (m *AnyAnyMap) Contains(key interface{}) bool {
func (m *AnyAnyMap) Contains(key any) bool {
var ok bool
m.mu.RLock()
if m.data != nil {
@ -402,26 +402,26 @@ func (m *AnyAnyMap) IsEmpty() bool {
// Clear deletes all data of the map, it will remake a new underlying data map.
func (m *AnyAnyMap) Clear() {
m.mu.Lock()
m.data = make(map[interface{}]interface{})
m.data = make(map[any]any)
m.mu.Unlock()
}
// Replace the data of the map with given `data`.
func (m *AnyAnyMap) Replace(data map[interface{}]interface{}) {
func (m *AnyAnyMap) Replace(data map[any]any) {
m.mu.Lock()
m.data = data
m.mu.Unlock()
}
// LockFunc locks writing with given callback function `f` within RWMutex.Lock.
func (m *AnyAnyMap) LockFunc(f func(m map[interface{}]interface{})) {
func (m *AnyAnyMap) LockFunc(f func(m map[any]any)) {
m.mu.Lock()
defer m.mu.Unlock()
f(m.data)
}
// RLockFunc locks reading with given callback function `f` within RWMutex.RLock.
func (m *AnyAnyMap) RLockFunc(f func(m map[interface{}]interface{})) {
func (m *AnyAnyMap) RLockFunc(f func(m map[any]any)) {
m.mu.RLock()
defer m.mu.RUnlock()
f(m.data)
@ -431,7 +431,7 @@ func (m *AnyAnyMap) RLockFunc(f func(m map[interface{}]interface{})) {
func (m *AnyAnyMap) Flip() {
m.mu.Lock()
defer m.mu.Unlock()
n := make(map[interface{}]interface{}, len(m.data))
n := make(map[any]any, len(m.data))
for k, v := range m.data {
n[v] = k
}
@ -475,9 +475,9 @@ func (m *AnyAnyMap) UnmarshalJSON(b []byte) error {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[interface{}]interface{})
m.data = make(map[any]any)
}
var data map[string]interface{}
var data map[string]any
if err := json.UnmarshalUseNumber(b, &data); err != nil {
return err
}
@ -488,11 +488,11 @@ func (m *AnyAnyMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *AnyAnyMap) UnmarshalValue(value interface{}) (err error) {
func (m *AnyAnyMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[interface{}]interface{})
m.data = make(map[any]any)
}
for k, v := range gconv.Map(value) {
m.data[k] = v
@ -501,14 +501,14 @@ func (m *AnyAnyMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *AnyAnyMap) DeepCopy() interface{} {
func (m *AnyAnyMap) DeepCopy() any {
if m == nil {
return nil
}
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[interface{}]interface{}, len(m.data))
data := make(map[any]any, len(m.data))
for k, v := range m.data {
data[k] = deepcopy.Copy(v)
}
@ -540,7 +540,7 @@ func (m *AnyAnyMap) IsSubOf(other *AnyAnyMap) bool {
// The returned `addedKeys` are the keys that are in map `m` but not in map `other`.
// The returned `removedKeys` are the keys that are in map `other` but not in map `m`.
// The returned `updatedKeys` are the keys that are both in map `m` and `other` but their values and not equal (`!=`).
func (m *AnyAnyMap) Diff(other *AnyAnyMap) (addedKeys, removedKeys, updatedKeys []interface{}) {
func (m *AnyAnyMap) Diff(other *AnyAnyMap) (addedKeys, removedKeys, updatedKeys []any) {
m.mu.RLock()
defer m.mu.RUnlock()
other.mu.RLock()

View File

@ -18,10 +18,10 @@ import (
"github.com/gogf/gf/v2/util/gconv"
)
// IntAnyMap implements map[int]interface{} with RWMutex that has switch.
// IntAnyMap implements map[int]any with RWMutex that has switch.
type IntAnyMap struct {
mu rwmutex.RWMutex
data map[int]interface{}
data map[int]any
}
// NewIntAnyMap returns an empty IntAnyMap object.
@ -30,14 +30,14 @@ type IntAnyMap struct {
func NewIntAnyMap(safe ...bool) *IntAnyMap {
return &IntAnyMap{
mu: rwmutex.Create(safe...),
data: make(map[int]interface{}),
data: make(map[int]any),
}
}
// NewIntAnyMapFrom creates and returns a hash map from given map `data`.
// Note that, the param `data` map will be set as the underlying data map(no deep copy),
// there might be some concurrent-safe issues when changing the map outside.
func NewIntAnyMapFrom(data map[int]interface{}, safe ...bool) *IntAnyMap {
func NewIntAnyMapFrom(data map[int]any, safe ...bool) *IntAnyMap {
return &IntAnyMap{
mu: rwmutex.Create(safe...),
data: data,
@ -46,7 +46,7 @@ func NewIntAnyMapFrom(data map[int]interface{}, safe ...bool) *IntAnyMap {
// Iterator iterates the hash map readonly with custom callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (m *IntAnyMap) Iterator(f func(k int, v interface{}) bool) {
func (m *IntAnyMap) Iterator(f func(k int, v any) bool) {
for k, v := range m.Map() {
if !f(k, v) {
break
@ -62,23 +62,23 @@ func (m *IntAnyMap) Clone() *IntAnyMap {
// Map returns the underlying data map.
// Note that, if it's in concurrent-safe usage, it returns a copy of underlying data,
// or else a pointer to the underlying data.
func (m *IntAnyMap) Map() map[int]interface{} {
func (m *IntAnyMap) Map() map[int]any {
m.mu.RLock()
defer m.mu.RUnlock()
if !m.mu.IsSafe() {
return m.data
}
data := make(map[int]interface{}, len(m.data))
data := make(map[int]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *IntAnyMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *IntAnyMap) MapStrAny() map[string]any {
m.mu.RLock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[gconv.String(k)] = v
}
@ -87,10 +87,10 @@ func (m *IntAnyMap) MapStrAny() map[string]interface{} {
}
// MapCopy returns a copy of the underlying data of the hash map.
func (m *IntAnyMap) MapCopy() map[int]interface{} {
func (m *IntAnyMap) MapCopy() map[int]any {
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[int]interface{}, len(m.data))
data := make(map[int]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
@ -121,17 +121,17 @@ func (m *IntAnyMap) FilterNil() {
}
// Set sets key-value to the hash map.
func (m *IntAnyMap) Set(key int, val interface{}) {
func (m *IntAnyMap) Set(key int, val any) {
m.mu.Lock()
if m.data == nil {
m.data = make(map[int]interface{})
m.data = make(map[int]any)
}
m.data[key] = val
m.mu.Unlock()
}
// Sets batch sets key-values to the hash map.
func (m *IntAnyMap) Sets(data map[int]interface{}) {
func (m *IntAnyMap) Sets(data map[int]any) {
m.mu.Lock()
if m.data == nil {
m.data = data
@ -145,7 +145,7 @@ func (m *IntAnyMap) Sets(data map[int]interface{}) {
// Search searches the map with given `key`.
// Second return parameter `found` is true if key was found, otherwise false.
func (m *IntAnyMap) Search(key int) (value interface{}, found bool) {
func (m *IntAnyMap) Search(key int) (value any, found bool) {
m.mu.RLock()
if m.data != nil {
value, found = m.data[key]
@ -155,7 +155,7 @@ func (m *IntAnyMap) Search(key int) (value interface{}, found bool) {
}
// Get returns the value by given `key`.
func (m *IntAnyMap) Get(key int) (value interface{}) {
func (m *IntAnyMap) Get(key int) (value any) {
m.mu.RLock()
if m.data != nil {
value = m.data[key]
@ -165,7 +165,7 @@ func (m *IntAnyMap) Get(key int) (value interface{}) {
}
// Pop retrieves and deletes an item from the map.
func (m *IntAnyMap) Pop() (key int, value interface{}) {
func (m *IntAnyMap) Pop() (key int, value any) {
m.mu.Lock()
defer m.mu.Unlock()
for key, value = range m.data {
@ -177,7 +177,7 @@ func (m *IntAnyMap) Pop() (key int, value interface{}) {
// Pops retrieves and deletes `size` items from the map.
// It returns all items if size == -1.
func (m *IntAnyMap) Pops(size int) map[int]interface{} {
func (m *IntAnyMap) Pops(size int) map[int]any {
m.mu.Lock()
defer m.mu.Unlock()
if size > len(m.data) || size == -1 {
@ -188,7 +188,7 @@ func (m *IntAnyMap) Pops(size int) map[int]interface{} {
}
var (
index = 0
newMap = make(map[int]interface{}, size)
newMap = make(map[int]any, size)
)
for k, v := range m.data {
delete(m.data, k)
@ -210,16 +210,16 @@ func (m *IntAnyMap) Pops(size int) map[int]interface{} {
// and its return value will be set to the map with `key`.
//
// It returns value with given `key`.
func (m *IntAnyMap) doSetWithLockCheck(key int, value interface{}) interface{} {
func (m *IntAnyMap) doSetWithLockCheck(key int, value any) any {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[int]interface{})
m.data = make(map[int]any)
}
if v, ok := m.data[key]; ok {
return v
}
if f, ok := value.(func() interface{}); ok {
if f, ok := value.(func() any); ok {
value = f()
}
if value != nil {
@ -230,7 +230,7 @@ func (m *IntAnyMap) doSetWithLockCheck(key int, value interface{}) interface{} {
// GetOrSet returns the value by key,
// or sets value with given `value` if it does not exist and then returns this value.
func (m *IntAnyMap) GetOrSet(key int, value interface{}) interface{} {
func (m *IntAnyMap) GetOrSet(key int, value any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, value)
} else {
@ -240,7 +240,7 @@ func (m *IntAnyMap) GetOrSet(key int, value interface{}) interface{} {
// GetOrSetFunc returns the value by key,
// or sets value with returned value of callback function `f` if it does not exist and returns this value.
func (m *IntAnyMap) GetOrSetFunc(key int, f func() interface{}) interface{} {
func (m *IntAnyMap) GetOrSetFunc(key int, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f())
} else {
@ -253,7 +253,7 @@ func (m *IntAnyMap) GetOrSetFunc(key int, f func() interface{}) interface{} {
//
// GetOrSetFuncLock differs with GetOrSetFunc function is that it executes function `f`
// with mutex.Lock of the hash map.
func (m *IntAnyMap) GetOrSetFuncLock(key int, f func() interface{}) interface{} {
func (m *IntAnyMap) GetOrSetFuncLock(key int, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f)
} else {
@ -269,25 +269,25 @@ func (m *IntAnyMap) GetVar(key int) *gvar.Var {
// GetVarOrSet returns a Var with result from GetVarOrSet.
// The returned Var is un-concurrent safe.
func (m *IntAnyMap) GetVarOrSet(key int, value interface{}) *gvar.Var {
func (m *IntAnyMap) GetVarOrSet(key int, value any) *gvar.Var {
return gvar.New(m.GetOrSet(key, value))
}
// GetVarOrSetFunc returns a Var with result from GetOrSetFunc.
// The returned Var is un-concurrent safe.
func (m *IntAnyMap) GetVarOrSetFunc(key int, f func() interface{}) *gvar.Var {
func (m *IntAnyMap) GetVarOrSetFunc(key int, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFunc(key, f))
}
// GetVarOrSetFuncLock returns a Var with result from GetOrSetFuncLock.
// The returned Var is un-concurrent safe.
func (m *IntAnyMap) GetVarOrSetFuncLock(key int, f func() interface{}) *gvar.Var {
func (m *IntAnyMap) GetVarOrSetFuncLock(key int, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFuncLock(key, f))
}
// SetIfNotExist sets `value` to the map if the `key` does not exist, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *IntAnyMap) SetIfNotExist(key int, value interface{}) bool {
func (m *IntAnyMap) SetIfNotExist(key int, value any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, value)
return true
@ -297,7 +297,7 @@ func (m *IntAnyMap) SetIfNotExist(key int, value interface{}) bool {
// SetIfNotExistFunc sets value with return value of callback function `f`, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *IntAnyMap) SetIfNotExistFunc(key int, f func() interface{}) bool {
func (m *IntAnyMap) SetIfNotExistFunc(key int, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f())
return true
@ -310,7 +310,7 @@ func (m *IntAnyMap) SetIfNotExistFunc(key int, f func() interface{}) bool {
//
// SetIfNotExistFuncLock differs with SetIfNotExistFunc function is that
// it executes function `f` with mutex.Lock of the hash map.
func (m *IntAnyMap) SetIfNotExistFuncLock(key int, f func() interface{}) bool {
func (m *IntAnyMap) SetIfNotExistFuncLock(key int, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f)
return true
@ -330,7 +330,7 @@ func (m *IntAnyMap) Removes(keys []int) {
}
// Remove deletes value from map by given `key`, and return this deleted value.
func (m *IntAnyMap) Remove(key int) (value interface{}) {
func (m *IntAnyMap) Remove(key int) (value any) {
m.mu.Lock()
if m.data != nil {
var ok bool
@ -358,10 +358,10 @@ func (m *IntAnyMap) Keys() []int {
}
// Values returns all values of the map as a slice.
func (m *IntAnyMap) Values() []interface{} {
func (m *IntAnyMap) Values() []any {
m.mu.RLock()
var (
values = make([]interface{}, len(m.data))
values = make([]any, len(m.data))
index = 0
)
for _, value := range m.data {
@ -401,26 +401,26 @@ func (m *IntAnyMap) IsEmpty() bool {
// Clear deletes all data of the map, it will remake a new underlying data map.
func (m *IntAnyMap) Clear() {
m.mu.Lock()
m.data = make(map[int]interface{})
m.data = make(map[int]any)
m.mu.Unlock()
}
// Replace the data of the map with given `data`.
func (m *IntAnyMap) Replace(data map[int]interface{}) {
func (m *IntAnyMap) Replace(data map[int]any) {
m.mu.Lock()
m.data = data
m.mu.Unlock()
}
// LockFunc locks writing with given callback function `f` within RWMutex.Lock.
func (m *IntAnyMap) LockFunc(f func(m map[int]interface{})) {
func (m *IntAnyMap) LockFunc(f func(m map[int]any)) {
m.mu.Lock()
defer m.mu.Unlock()
f(m.data)
}
// RLockFunc locks reading with given callback function `f` within RWMutex.RLock.
func (m *IntAnyMap) RLockFunc(f func(m map[int]interface{})) {
func (m *IntAnyMap) RLockFunc(f func(m map[int]any)) {
m.mu.RLock()
defer m.mu.RUnlock()
f(m.data)
@ -430,7 +430,7 @@ func (m *IntAnyMap) RLockFunc(f func(m map[int]interface{})) {
func (m *IntAnyMap) Flip() {
m.mu.Lock()
defer m.mu.Unlock()
n := make(map[int]interface{}, len(m.data))
n := make(map[int]any, len(m.data))
for k, v := range m.data {
n[gconv.Int(v)] = k
}
@ -476,7 +476,7 @@ func (m *IntAnyMap) UnmarshalJSON(b []byte) error {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[int]interface{})
m.data = make(map[int]any)
}
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
@ -485,11 +485,11 @@ func (m *IntAnyMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *IntAnyMap) UnmarshalValue(value interface{}) (err error) {
func (m *IntAnyMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[int]interface{})
m.data = make(map[int]any)
}
switch value.(type) {
case string, []byte:
@ -503,13 +503,13 @@ func (m *IntAnyMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *IntAnyMap) DeepCopy() interface{} {
func (m *IntAnyMap) DeepCopy() any {
if m == nil {
return nil
}
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[int]interface{}, len(m.data))
data := make(map[int]any, len(m.data))
for k, v := range m.data {
data[k] = deepcopy.Copy(v)
}

View File

@ -70,10 +70,10 @@ func (m *IntIntMap) Map() map[int]int {
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *IntIntMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *IntIntMap) MapStrAny() map[string]any {
m.mu.RLock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[gconv.String(k)] = v
}
@ -453,7 +453,7 @@ func (m *IntIntMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *IntIntMap) UnmarshalValue(value interface{}) (err error) {
func (m *IntIntMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
@ -471,7 +471,7 @@ func (m *IntIntMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *IntIntMap) DeepCopy() interface{} {
func (m *IntIntMap) DeepCopy() any {
if m == nil {
return nil
}

View File

@ -70,10 +70,10 @@ func (m *IntStrMap) Map() map[int]string {
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *IntStrMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *IntStrMap) MapStrAny() map[string]any {
m.mu.RLock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[gconv.String(k)] = v
}
@ -453,7 +453,7 @@ func (m *IntStrMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *IntStrMap) UnmarshalValue(value interface{}) (err error) {
func (m *IntStrMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
@ -471,7 +471,7 @@ func (m *IntStrMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *IntStrMap) DeepCopy() interface{} {
func (m *IntStrMap) DeepCopy() any {
if m == nil {
return nil
}

View File

@ -18,10 +18,10 @@ import (
"github.com/gogf/gf/v2/util/gconv"
)
// StrAnyMap implements map[string]interface{} with RWMutex that has switch.
// StrAnyMap implements map[string]any with RWMutex that has switch.
type StrAnyMap struct {
mu rwmutex.RWMutex
data map[string]interface{}
data map[string]any
}
// NewStrAnyMap returns an empty StrAnyMap object.
@ -30,14 +30,14 @@ type StrAnyMap struct {
func NewStrAnyMap(safe ...bool) *StrAnyMap {
return &StrAnyMap{
mu: rwmutex.Create(safe...),
data: make(map[string]interface{}),
data: make(map[string]any),
}
}
// NewStrAnyMapFrom creates and returns a hash map from given map `data`.
// Note that, the param `data` map will be set as the underlying data map(no deep copy),
// there might be some concurrent-safe issues when changing the map outside.
func NewStrAnyMapFrom(data map[string]interface{}, safe ...bool) *StrAnyMap {
func NewStrAnyMapFrom(data map[string]any, safe ...bool) *StrAnyMap {
return &StrAnyMap{
mu: rwmutex.Create(safe...),
data: data,
@ -46,7 +46,7 @@ func NewStrAnyMapFrom(data map[string]interface{}, safe ...bool) *StrAnyMap {
// Iterator iterates the hash map readonly with custom callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (m *StrAnyMap) Iterator(f func(k string, v interface{}) bool) {
func (m *StrAnyMap) Iterator(f func(k string, v any) bool) {
for k, v := range m.Map() {
if !f(k, v) {
break
@ -62,29 +62,29 @@ func (m *StrAnyMap) Clone() *StrAnyMap {
// Map returns the underlying data map.
// Note that, if it's in concurrent-safe usage, it returns a copy of underlying data,
// or else a pointer to the underlying data.
func (m *StrAnyMap) Map() map[string]interface{} {
func (m *StrAnyMap) Map() map[string]any {
m.mu.RLock()
defer m.mu.RUnlock()
if !m.mu.IsSafe() {
return m.data
}
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *StrAnyMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *StrAnyMap) MapStrAny() map[string]any {
return m.Map()
}
// MapCopy returns a copy of the underlying data of the hash map.
func (m *StrAnyMap) MapCopy() map[string]interface{} {
func (m *StrAnyMap) MapCopy() map[string]any {
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
@ -115,17 +115,17 @@ func (m *StrAnyMap) FilterNil() {
}
// Set sets key-value to the hash map.
func (m *StrAnyMap) Set(key string, val interface{}) {
func (m *StrAnyMap) Set(key string, val any) {
m.mu.Lock()
if m.data == nil {
m.data = make(map[string]interface{})
m.data = make(map[string]any)
}
m.data[key] = val
m.mu.Unlock()
}
// Sets batch sets key-values to the hash map.
func (m *StrAnyMap) Sets(data map[string]interface{}) {
func (m *StrAnyMap) Sets(data map[string]any) {
m.mu.Lock()
if m.data == nil {
m.data = data
@ -139,7 +139,7 @@ func (m *StrAnyMap) Sets(data map[string]interface{}) {
// Search searches the map with given `key`.
// Second return parameter `found` is true if key was found, otherwise false.
func (m *StrAnyMap) Search(key string) (value interface{}, found bool) {
func (m *StrAnyMap) Search(key string) (value any, found bool) {
m.mu.RLock()
if m.data != nil {
value, found = m.data[key]
@ -149,7 +149,7 @@ func (m *StrAnyMap) Search(key string) (value interface{}, found bool) {
}
// Get returns the value by given `key`.
func (m *StrAnyMap) Get(key string) (value interface{}) {
func (m *StrAnyMap) Get(key string) (value any) {
m.mu.RLock()
if m.data != nil {
value = m.data[key]
@ -159,7 +159,7 @@ func (m *StrAnyMap) Get(key string) (value interface{}) {
}
// Pop retrieves and deletes an item from the map.
func (m *StrAnyMap) Pop() (key string, value interface{}) {
func (m *StrAnyMap) Pop() (key string, value any) {
m.mu.Lock()
defer m.mu.Unlock()
for key, value = range m.data {
@ -171,7 +171,7 @@ func (m *StrAnyMap) Pop() (key string, value interface{}) {
// Pops retrieves and deletes `size` items from the map.
// It returns all items if size == -1.
func (m *StrAnyMap) Pops(size int) map[string]interface{} {
func (m *StrAnyMap) Pops(size int) map[string]any {
m.mu.Lock()
defer m.mu.Unlock()
if size > len(m.data) || size == -1 {
@ -182,7 +182,7 @@ func (m *StrAnyMap) Pops(size int) map[string]interface{} {
}
var (
index = 0
newMap = make(map[string]interface{}, size)
newMap = make(map[string]any, size)
)
for k, v := range m.data {
delete(m.data, k)
@ -204,16 +204,16 @@ func (m *StrAnyMap) Pops(size int) map[string]interface{} {
// and its return value will be set to the map with `key`.
//
// It returns value with given `key`.
func (m *StrAnyMap) doSetWithLockCheck(key string, value interface{}) interface{} {
func (m *StrAnyMap) doSetWithLockCheck(key string, value any) any {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[string]interface{})
m.data = make(map[string]any)
}
if v, ok := m.data[key]; ok {
return v
}
if f, ok := value.(func() interface{}); ok {
if f, ok := value.(func() any); ok {
value = f()
}
if value != nil {
@ -224,7 +224,7 @@ func (m *StrAnyMap) doSetWithLockCheck(key string, value interface{}) interface{
// GetOrSet returns the value by key,
// or sets value with given `value` if it does not exist and then returns this value.
func (m *StrAnyMap) GetOrSet(key string, value interface{}) interface{} {
func (m *StrAnyMap) GetOrSet(key string, value any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, value)
} else {
@ -235,7 +235,7 @@ func (m *StrAnyMap) GetOrSet(key string, value interface{}) interface{} {
// GetOrSetFunc returns the value by key,
// or sets value with returned value of callback function `f` if it does not exist
// and then returns this value.
func (m *StrAnyMap) GetOrSetFunc(key string, f func() interface{}) interface{} {
func (m *StrAnyMap) GetOrSetFunc(key string, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f())
} else {
@ -249,7 +249,7 @@ func (m *StrAnyMap) GetOrSetFunc(key string, f func() interface{}) interface{} {
//
// GetOrSetFuncLock differs with GetOrSetFunc function is that it executes function `f`
// with mutex.Lock of the hash map.
func (m *StrAnyMap) GetOrSetFuncLock(key string, f func() interface{}) interface{} {
func (m *StrAnyMap) GetOrSetFuncLock(key string, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f)
} else {
@ -265,25 +265,25 @@ func (m *StrAnyMap) GetVar(key string) *gvar.Var {
// GetVarOrSet returns a Var with result from GetVarOrSet.
// The returned Var is un-concurrent safe.
func (m *StrAnyMap) GetVarOrSet(key string, value interface{}) *gvar.Var {
func (m *StrAnyMap) GetVarOrSet(key string, value any) *gvar.Var {
return gvar.New(m.GetOrSet(key, value))
}
// GetVarOrSetFunc returns a Var with result from GetOrSetFunc.
// The returned Var is un-concurrent safe.
func (m *StrAnyMap) GetVarOrSetFunc(key string, f func() interface{}) *gvar.Var {
func (m *StrAnyMap) GetVarOrSetFunc(key string, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFunc(key, f))
}
// GetVarOrSetFuncLock returns a Var with result from GetOrSetFuncLock.
// The returned Var is un-concurrent safe.
func (m *StrAnyMap) GetVarOrSetFuncLock(key string, f func() interface{}) *gvar.Var {
func (m *StrAnyMap) GetVarOrSetFuncLock(key string, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFuncLock(key, f))
}
// SetIfNotExist sets `value` to the map if the `key` does not exist, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *StrAnyMap) SetIfNotExist(key string, value interface{}) bool {
func (m *StrAnyMap) SetIfNotExist(key string, value any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, value)
return true
@ -293,7 +293,7 @@ func (m *StrAnyMap) SetIfNotExist(key string, value interface{}) bool {
// SetIfNotExistFunc sets value with return value of callback function `f`, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *StrAnyMap) SetIfNotExistFunc(key string, f func() interface{}) bool {
func (m *StrAnyMap) SetIfNotExistFunc(key string, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f())
return true
@ -306,7 +306,7 @@ func (m *StrAnyMap) SetIfNotExistFunc(key string, f func() interface{}) bool {
//
// SetIfNotExistFuncLock differs with SetIfNotExistFunc function is that
// it executes function `f` with mutex.Lock of the hash map.
func (m *StrAnyMap) SetIfNotExistFuncLock(key string, f func() interface{}) bool {
func (m *StrAnyMap) SetIfNotExistFuncLock(key string, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f)
return true
@ -326,7 +326,7 @@ func (m *StrAnyMap) Removes(keys []string) {
}
// Remove deletes value from map by given `key`, and return this deleted value.
func (m *StrAnyMap) Remove(key string) (value interface{}) {
func (m *StrAnyMap) Remove(key string) (value any) {
m.mu.Lock()
if m.data != nil {
var ok bool
@ -354,10 +354,10 @@ func (m *StrAnyMap) Keys() []string {
}
// Values returns all values of the map as a slice.
func (m *StrAnyMap) Values() []interface{} {
func (m *StrAnyMap) Values() []any {
m.mu.RLock()
var (
values = make([]interface{}, len(m.data))
values = make([]any, len(m.data))
index = 0
)
for _, value := range m.data {
@ -397,26 +397,26 @@ func (m *StrAnyMap) IsEmpty() bool {
// Clear deletes all data of the map, it will remake a new underlying data map.
func (m *StrAnyMap) Clear() {
m.mu.Lock()
m.data = make(map[string]interface{})
m.data = make(map[string]any)
m.mu.Unlock()
}
// Replace the data of the map with given `data`.
func (m *StrAnyMap) Replace(data map[string]interface{}) {
func (m *StrAnyMap) Replace(data map[string]any) {
m.mu.Lock()
m.data = data
m.mu.Unlock()
}
// LockFunc locks writing with given callback function `f` within RWMutex.Lock.
func (m *StrAnyMap) LockFunc(f func(m map[string]interface{})) {
func (m *StrAnyMap) LockFunc(f func(m map[string]any)) {
m.mu.Lock()
defer m.mu.Unlock()
f(m.data)
}
// RLockFunc locks reading with given callback function `f` within RWMutex.RLock.
func (m *StrAnyMap) RLockFunc(f func(m map[string]interface{})) {
func (m *StrAnyMap) RLockFunc(f func(m map[string]any)) {
m.mu.RLock()
defer m.mu.RUnlock()
f(m.data)
@ -426,7 +426,7 @@ func (m *StrAnyMap) RLockFunc(f func(m map[string]interface{})) {
func (m *StrAnyMap) Flip() {
m.mu.Lock()
defer m.mu.Unlock()
n := make(map[string]interface{}, len(m.data))
n := make(map[string]any, len(m.data))
for k, v := range m.data {
n[gconv.String(v)] = k
}
@ -472,7 +472,7 @@ func (m *StrAnyMap) UnmarshalJSON(b []byte) error {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[string]interface{})
m.data = make(map[string]any)
}
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
@ -481,7 +481,7 @@ func (m *StrAnyMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *StrAnyMap) UnmarshalValue(value interface{}) (err error) {
func (m *StrAnyMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
m.data = gconv.Map(value)
@ -489,13 +489,13 @@ func (m *StrAnyMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *StrAnyMap) DeepCopy() interface{} {
func (m *StrAnyMap) DeepCopy() any {
if m == nil {
return nil
}
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[k] = deepcopy.Copy(v)
}

View File

@ -71,11 +71,11 @@ func (m *StrIntMap) Map() map[string]int {
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *StrIntMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *StrIntMap) MapStrAny() map[string]any {
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
@ -457,7 +457,7 @@ func (m *StrIntMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *StrIntMap) UnmarshalValue(value interface{}) (err error) {
func (m *StrIntMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
@ -475,7 +475,7 @@ func (m *StrIntMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *StrIntMap) DeepCopy() interface{} {
func (m *StrIntMap) DeepCopy() any {
if m == nil {
return nil
}

View File

@ -71,10 +71,10 @@ func (m *StrStrMap) Map() map[string]string {
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *StrStrMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *StrStrMap) MapStrAny() map[string]any {
m.mu.RLock()
data := make(map[string]interface{}, len(m.data))
data := make(map[string]any, len(m.data))
for k, v := range m.data {
data[k] = v
}
@ -456,7 +456,7 @@ func (m *StrStrMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *StrStrMap) UnmarshalValue(value interface{}) (err error) {
func (m *StrStrMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
m.data = gconv.MapStrStr(value)
@ -464,7 +464,7 @@ func (m *StrStrMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *StrStrMap) DeepCopy() interface{} {
func (m *StrStrMap) DeepCopy() any {
if m == nil {
return nil
}

View File

@ -28,13 +28,13 @@ import (
// Reference: http://en.wikipedia.org/wiki/Associative_array
type ListMap struct {
mu rwmutex.RWMutex
data map[interface{}]*glist.Element
data map[any]*glist.Element
list *glist.List
}
type gListMapNode struct {
key interface{}
value interface{}
key any
value any
}
// NewListMap returns an empty link map.
@ -44,7 +44,7 @@ type gListMapNode struct {
func NewListMap(safe ...bool) *ListMap {
return &ListMap{
mu: rwmutex.Create(safe...),
data: make(map[interface{}]*glist.Element),
data: make(map[any]*glist.Element),
list: glist.New(),
}
}
@ -52,20 +52,20 @@ func NewListMap(safe ...bool) *ListMap {
// NewListMapFrom returns a link map from given map `data`.
// Note that, the param `data` map will be set as the underlying data map(no deep copy),
// there might be some concurrent-safe issues when changing the map outside.
func NewListMapFrom(data map[interface{}]interface{}, safe ...bool) *ListMap {
func NewListMapFrom(data map[any]any, safe ...bool) *ListMap {
m := NewListMap(safe...)
m.Sets(data)
return m
}
// Iterator is alias of IteratorAsc.
func (m *ListMap) Iterator(f func(key, value interface{}) bool) {
func (m *ListMap) Iterator(f func(key, value any) bool) {
m.IteratorAsc(f)
}
// IteratorAsc iterates the map readonly in ascending order with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (m *ListMap) IteratorAsc(f func(key interface{}, value interface{}) bool) {
func (m *ListMap) IteratorAsc(f func(key any, value any) bool) {
m.mu.RLock()
defer m.mu.RUnlock()
if m.list != nil {
@ -79,7 +79,7 @@ func (m *ListMap) IteratorAsc(f func(key interface{}, value interface{}) bool) {
// IteratorDesc iterates the map readonly in descending order with given callback function `f`.
// If `f` returns true, then it continues iterating; or false to stop.
func (m *ListMap) IteratorDesc(f func(key interface{}, value interface{}) bool) {
func (m *ListMap) IteratorDesc(f func(key any, value any) bool) {
m.mu.RLock()
defer m.mu.RUnlock()
if m.list != nil {
@ -99,15 +99,15 @@ func (m *ListMap) Clone(safe ...bool) *ListMap {
// Clear deletes all data of the map, it will remake a new underlying data map.
func (m *ListMap) Clear() {
m.mu.Lock()
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
m.mu.Unlock()
}
// Replace the data of the map with given `data`.
func (m *ListMap) Replace(data map[interface{}]interface{}) {
func (m *ListMap) Replace(data map[any]any) {
m.mu.Lock()
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
for key, value := range data {
if e, ok := m.data[key]; !ok {
@ -120,12 +120,12 @@ func (m *ListMap) Replace(data map[interface{}]interface{}) {
}
// Map returns a copy of the underlying data of the map.
func (m *ListMap) Map() map[interface{}]interface{} {
func (m *ListMap) Map() map[any]any {
m.mu.RLock()
var node *gListMapNode
var data map[interface{}]interface{}
var data map[any]any
if m.list != nil {
data = make(map[interface{}]interface{}, len(m.data))
data = make(map[any]any, len(m.data))
m.list.IteratorAsc(func(e *glist.Element) bool {
node = e.Value.(*gListMapNode)
data[node.key] = node.value
@ -136,13 +136,13 @@ func (m *ListMap) Map() map[interface{}]interface{} {
return data
}
// MapStrAny returns a copy of the underlying data of the map as map[string]interface{}.
func (m *ListMap) MapStrAny() map[string]interface{} {
// MapStrAny returns a copy of the underlying data of the map as map[string]any.
func (m *ListMap) MapStrAny() map[string]any {
m.mu.RLock()
var node *gListMapNode
var data map[string]interface{}
var data map[string]any
if m.list != nil {
data = make(map[string]interface{}, len(m.data))
data = make(map[string]any, len(m.data))
m.list.IteratorAsc(func(e *glist.Element) bool {
node = e.Value.(*gListMapNode)
data[gconv.String(node.key)] = node.value
@ -158,7 +158,7 @@ func (m *ListMap) FilterEmpty() {
m.mu.Lock()
if m.list != nil {
var (
keys = make([]interface{}, 0)
keys = make([]any, 0)
node *gListMapNode
)
m.list.IteratorAsc(func(e *glist.Element) bool {
@ -181,10 +181,10 @@ func (m *ListMap) FilterEmpty() {
}
// Set sets key-value to the map.
func (m *ListMap) Set(key interface{}, value interface{}) {
func (m *ListMap) Set(key any, value any) {
m.mu.Lock()
if m.data == nil {
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
}
if e, ok := m.data[key]; !ok {
@ -196,10 +196,10 @@ func (m *ListMap) Set(key interface{}, value interface{}) {
}
// Sets batch sets key-values to the map.
func (m *ListMap) Sets(data map[interface{}]interface{}) {
func (m *ListMap) Sets(data map[any]any) {
m.mu.Lock()
if m.data == nil {
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
}
for key, value := range data {
@ -214,7 +214,7 @@ func (m *ListMap) Sets(data map[interface{}]interface{}) {
// Search searches the map with given `key`.
// Second return parameter `found` is true if key was found, otherwise false.
func (m *ListMap) Search(key interface{}) (value interface{}, found bool) {
func (m *ListMap) Search(key any) (value any, found bool) {
m.mu.RLock()
if m.data != nil {
if e, ok := m.data[key]; ok {
@ -227,7 +227,7 @@ func (m *ListMap) Search(key interface{}) (value interface{}, found bool) {
}
// Get returns the value by given `key`.
func (m *ListMap) Get(key interface{}) (value interface{}) {
func (m *ListMap) Get(key any) (value any) {
m.mu.RLock()
if m.data != nil {
if e, ok := m.data[key]; ok {
@ -239,7 +239,7 @@ func (m *ListMap) Get(key interface{}) (value interface{}) {
}
// Pop retrieves and deletes an item from the map.
func (m *ListMap) Pop() (key, value interface{}) {
func (m *ListMap) Pop() (key, value any) {
m.mu.Lock()
defer m.mu.Unlock()
for k, e := range m.data {
@ -253,7 +253,7 @@ func (m *ListMap) Pop() (key, value interface{}) {
// Pops retrieves and deletes `size` items from the map.
// It returns all items if size == -1.
func (m *ListMap) Pops(size int) map[interface{}]interface{} {
func (m *ListMap) Pops(size int) map[any]any {
m.mu.Lock()
defer m.mu.Unlock()
if size > len(m.data) || size == -1 {
@ -263,7 +263,7 @@ func (m *ListMap) Pops(size int) map[interface{}]interface{} {
return nil
}
index := 0
newMap := make(map[interface{}]interface{}, size)
newMap := make(map[any]any, size)
for k, e := range m.data {
value := e.Value.(*gListMapNode).value
delete(m.data, k)
@ -286,17 +286,17 @@ func (m *ListMap) Pops(size int) map[interface{}]interface{} {
// and its return value will be set to the map with `key`.
//
// It returns value with given `key`.
func (m *ListMap) doSetWithLockCheck(key interface{}, value interface{}) interface{} {
func (m *ListMap) doSetWithLockCheck(key any, value any) any {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
}
if e, ok := m.data[key]; ok {
return e.Value.(*gListMapNode).value
}
if f, ok := value.(func() interface{}); ok {
if f, ok := value.(func() any); ok {
value = f()
}
if value != nil {
@ -307,7 +307,7 @@ func (m *ListMap) doSetWithLockCheck(key interface{}, value interface{}) interfa
// GetOrSet returns the value by key,
// or sets value with given `value` if it does not exist and then returns this value.
func (m *ListMap) GetOrSet(key interface{}, value interface{}) interface{} {
func (m *ListMap) GetOrSet(key any, value any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, value)
} else {
@ -318,7 +318,7 @@ func (m *ListMap) GetOrSet(key interface{}, value interface{}) interface{} {
// GetOrSetFunc returns the value by key,
// or sets value with returned value of callback function `f` if it does not exist
// and then returns this value.
func (m *ListMap) GetOrSetFunc(key interface{}, f func() interface{}) interface{} {
func (m *ListMap) GetOrSetFunc(key any, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f())
} else {
@ -332,7 +332,7 @@ func (m *ListMap) GetOrSetFunc(key interface{}, f func() interface{}) interface{
//
// GetOrSetFuncLock differs with GetOrSetFunc function is that it executes function `f`
// with mutex.Lock of the map.
func (m *ListMap) GetOrSetFuncLock(key interface{}, f func() interface{}) interface{} {
func (m *ListMap) GetOrSetFuncLock(key any, f func() any) any {
if v, ok := m.Search(key); !ok {
return m.doSetWithLockCheck(key, f)
} else {
@ -342,31 +342,31 @@ func (m *ListMap) GetOrSetFuncLock(key interface{}, f func() interface{}) interf
// GetVar returns a Var with the value by given `key`.
// The returned Var is un-concurrent safe.
func (m *ListMap) GetVar(key interface{}) *gvar.Var {
func (m *ListMap) GetVar(key any) *gvar.Var {
return gvar.New(m.Get(key))
}
// GetVarOrSet returns a Var with result from GetVarOrSet.
// The returned Var is un-concurrent safe.
func (m *ListMap) GetVarOrSet(key interface{}, value interface{}) *gvar.Var {
func (m *ListMap) GetVarOrSet(key any, value any) *gvar.Var {
return gvar.New(m.GetOrSet(key, value))
}
// GetVarOrSetFunc returns a Var with result from GetOrSetFunc.
// The returned Var is un-concurrent safe.
func (m *ListMap) GetVarOrSetFunc(key interface{}, f func() interface{}) *gvar.Var {
func (m *ListMap) GetVarOrSetFunc(key any, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFunc(key, f))
}
// GetVarOrSetFuncLock returns a Var with result from GetOrSetFuncLock.
// The returned Var is un-concurrent safe.
func (m *ListMap) GetVarOrSetFuncLock(key interface{}, f func() interface{}) *gvar.Var {
func (m *ListMap) GetVarOrSetFuncLock(key any, f func() any) *gvar.Var {
return gvar.New(m.GetOrSetFuncLock(key, f))
}
// SetIfNotExist sets `value` to the map if the `key` does not exist, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *ListMap) SetIfNotExist(key interface{}, value interface{}) bool {
func (m *ListMap) SetIfNotExist(key any, value any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, value)
return true
@ -376,7 +376,7 @@ func (m *ListMap) SetIfNotExist(key interface{}, value interface{}) bool {
// SetIfNotExistFunc sets value with return value of callback function `f`, and then returns true.
// It returns false if `key` exists, and `value` would be ignored.
func (m *ListMap) SetIfNotExistFunc(key interface{}, f func() interface{}) bool {
func (m *ListMap) SetIfNotExistFunc(key any, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f())
return true
@ -389,7 +389,7 @@ func (m *ListMap) SetIfNotExistFunc(key interface{}, f func() interface{}) bool
//
// SetIfNotExistFuncLock differs with SetIfNotExistFunc function is that
// it executes function `f` with mutex.Lock of the map.
func (m *ListMap) SetIfNotExistFuncLock(key interface{}, f func() interface{}) bool {
func (m *ListMap) SetIfNotExistFuncLock(key any, f func() any) bool {
if !m.Contains(key) {
m.doSetWithLockCheck(key, f)
return true
@ -398,7 +398,7 @@ func (m *ListMap) SetIfNotExistFuncLock(key interface{}, f func() interface{}) b
}
// Remove deletes value from map by given `key`, and return this deleted value.
func (m *ListMap) Remove(key interface{}) (value interface{}) {
func (m *ListMap) Remove(key any) (value any) {
m.mu.Lock()
if m.data != nil {
if e, ok := m.data[key]; ok {
@ -412,7 +412,7 @@ func (m *ListMap) Remove(key interface{}) (value interface{}) {
}
// Removes batch deletes values of the map by keys.
func (m *ListMap) Removes(keys []interface{}) {
func (m *ListMap) Removes(keys []any) {
m.mu.Lock()
if m.data != nil {
for _, key := range keys {
@ -426,10 +426,10 @@ func (m *ListMap) Removes(keys []interface{}) {
}
// Keys returns all keys of the map as a slice in ascending order.
func (m *ListMap) Keys() []interface{} {
func (m *ListMap) Keys() []any {
m.mu.RLock()
var (
keys = make([]interface{}, m.list.Len())
keys = make([]any, m.list.Len())
index = 0
)
if m.list != nil {
@ -444,10 +444,10 @@ func (m *ListMap) Keys() []interface{} {
}
// Values returns all values of the map as a slice.
func (m *ListMap) Values() []interface{} {
func (m *ListMap) Values() []any {
m.mu.RLock()
var (
values = make([]interface{}, m.list.Len())
values = make([]any, m.list.Len())
index = 0
)
if m.list != nil {
@ -463,7 +463,7 @@ func (m *ListMap) Values() []interface{} {
// Contains checks whether a key exists.
// It returns true if the `key` exists, or else false.
func (m *ListMap) Contains(key interface{}) (ok bool) {
func (m *ListMap) Contains(key any) (ok bool) {
m.mu.RLock()
if m.data != nil {
_, ok = m.data[key]
@ -501,7 +501,7 @@ func (m *ListMap) Merge(other *ListMap) {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
}
if other != m {
@ -536,7 +536,7 @@ func (m ListMap) MarshalJSON() (jsonBytes []byte, err error) {
}
buffer := bytes.NewBuffer(nil)
buffer.WriteByte('{')
m.Iterator(func(key, value interface{}) bool {
m.Iterator(func(key, value any) bool {
valueBytes, valueJSONErr := json.Marshal(value)
if valueJSONErr != nil {
err = valueJSONErr
@ -545,7 +545,7 @@ func (m ListMap) MarshalJSON() (jsonBytes []byte, err error) {
if buffer.Len() > 1 {
buffer.WriteByte(',')
}
buffer.WriteString(fmt.Sprintf(`"%v":%s`, key, valueBytes))
fmt.Fprintf(buffer, `"%v":%s`, key, valueBytes)
return true
})
buffer.WriteByte('}')
@ -557,10 +557,10 @@ func (m *ListMap) UnmarshalJSON(b []byte) error {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
}
var data map[string]interface{}
var data map[string]any
if err := json.UnmarshalUseNumber(b, &data); err != nil {
return err
}
@ -575,11 +575,11 @@ func (m *ListMap) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for map.
func (m *ListMap) UnmarshalValue(value interface{}) (err error) {
func (m *ListMap) UnmarshalValue(value any) (err error) {
m.mu.Lock()
defer m.mu.Unlock()
if m.data == nil {
m.data = make(map[interface{}]*glist.Element)
m.data = make(map[any]*glist.Element)
m.list = glist.New()
}
for k, v := range gconv.Map(value) {
@ -593,13 +593,13 @@ func (m *ListMap) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (m *ListMap) DeepCopy() interface{} {
func (m *ListMap) DeepCopy() any {
if m == nil {
return nil
}
m.mu.RLock()
defer m.mu.RUnlock()
data := make(map[interface{}]interface{}, len(m.data))
data := make(map[any]any, len(m.data))
if m.list != nil {
var node *gListMapNode
m.list.IteratorAsc(func(e *glist.Element) bool {

View File

@ -16,7 +16,7 @@ type TreeMap = gtree.RedBlackTree
// NewTreeMap instantiates a tree map with the custom comparator.
// The parameter `safe` is used to specify whether using tree in concurrent-safety,
// which is false in default.
func NewTreeMap(comparator func(v1, v2 interface{}) int, safe ...bool) *TreeMap {
func NewTreeMap(comparator func(v1, v2 any) int, safe ...bool) *TreeMap {
return gtree.NewRedBlackTree(comparator, safe...)
}
@ -25,6 +25,6 @@ func NewTreeMap(comparator func(v1, v2 interface{}) int, safe ...bool) *TreeMap
// there might be some concurrent-safe issues when changing the map outside.
// The parameter `safe` is used to specify whether using tree in concurrent-safety,
// which is false in default.
func NewTreeMapFrom(comparator func(v1, v2 interface{}) int, data map[interface{}]interface{}, safe ...bool) *TreeMap {
func NewTreeMapFrom(comparator func(v1, v2 any) int, data map[any]any, safe ...bool) *TreeMap {
return gtree.NewRedBlackTreeFrom(comparator, data, safe...)
}

View File

@ -14,7 +14,7 @@ import (
"github.com/gogf/gf/v2/util/gutil"
)
func getValue() interface{} {
func getValue() any {
return 3
}
@ -71,7 +71,7 @@ func Test_Map_Basic(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.New()
m.Set("key1", "val1")
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -91,14 +91,14 @@ func Test_Map_Basic(t *testing.T) {
t.AssertIN("val1", m.Values())
m.Flip()
t.Assert(m.Map(), map[interface{}]interface{}{"val3": "key3", "val1": "key1"})
t.Assert(m.Map(), map[any]any{"val3": "key3", "val1": "key1"})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gmap.NewFrom(map[interface{}]interface{}{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[interface{}]interface{}{1: 1, "key1": "val1"})
m2 := gmap.NewFrom(map[any]any{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[any]any{1: 1, "key1": "val1"})
})
}
@ -118,30 +118,30 @@ func Test_Map_Set_Fun(t *testing.T) {
func Test_Map_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.New()
m.Sets(map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]interface{}{"key1", 1})
t.Assert(m.Map(), map[interface{}]interface{}{"key2": "val2", "key3": "val3"})
m.Sets(map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]any{"key1", 1})
t.Assert(m.Map(), map[any]any{"key2": "val2", "key3": "val3"})
})
}
func Test_Map_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[interface{}]interface{}{1: 1, "key1": "val1"}
expect := map[any]any{1: 1, "key1": "val1"}
m := gmap.NewFrom(expect)
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
t.Assert(expect[k], v)
return true
})
// 断言返回值对遍历控制
i := 0
j := 0
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
i++
return true
})
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
j++
return false
})
@ -152,12 +152,12 @@ func Test_Map_Iterator(t *testing.T) {
func Test_Map_Lock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[interface{}]interface{}{1: 1, "key1": "val1"}
expect := map[any]any{1: 1, "key1": "val1"}
m := gmap.NewFrom(expect)
m.LockFunc(func(m map[interface{}]interface{}) {
m.LockFunc(func(m map[any]any) {
t.Assert(m, expect)
})
m.RLockFunc(func(m map[interface{}]interface{}) {
m.RLockFunc(func(m map[any]any) {
t.Assert(m, expect)
})
})
@ -166,7 +166,7 @@ func Test_Map_Lock(t *testing.T) {
func Test_Map_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
// clone 方法是深克隆
m := gmap.NewFrom(map[interface{}]interface{}{1: 1, "key1": "val1"})
m := gmap.NewFrom(map[any]any{1: 1, "key1": "val1"})
m_clone := m.Clone()
m.Remove(1)
// 修改原 map,clone 后的 map 不影响
@ -185,6 +185,6 @@ func Test_Map_Basic_Merge(t *testing.T) {
m1.Set("key1", "val1")
m2.Set("key2", "val2")
m1.Merge(m2)
t.Assert(m1.Map(), map[interface{}]interface{}{"key1": "val1", "key2": "val2"})
t.Assert(m1.Map(), map[any]any{"key1": "val1", "key2": "val2"})
})
}

View File

@ -22,7 +22,7 @@ func ExampleAnyAnyMap_Iterator() {
}
var totalKey, totalValue int
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
totalKey += k.(int)
totalValue += v.(int)
@ -149,7 +149,7 @@ func ExampleAnyAnyMap_Set() {
func ExampleAnyAnyMap_Sets() {
m := gmap.New()
addMap := make(map[interface{}]interface{})
addMap := make(map[any]any)
addMap["key1"] = "val1"
addMap["key2"] = "val2"
addMap["key3"] = "val3"
@ -252,10 +252,10 @@ func ExampleAnyAnyMap_GetOrSetFunc() {
m := gmap.New()
m.Set("key1", "val1")
fmt.Println(m.GetOrSetFunc("key1", func() interface{} {
fmt.Println(m.GetOrSetFunc("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFunc("key2", func() interface{} {
fmt.Println(m.GetOrSetFunc("key2", func() any {
return "NotExistValue"
}))
@ -268,10 +268,10 @@ func ExampleAnyAnyMap_GetOrSetFuncLock() {
m := gmap.New()
m.Set("key1", "val1")
fmt.Println(m.GetOrSetFuncLock("key1", func() interface{} {
fmt.Println(m.GetOrSetFuncLock("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFuncLock("key2", func() interface{} {
fmt.Println(m.GetOrSetFuncLock("key2", func() any {
return "NotExistValue"
}))
@ -308,10 +308,10 @@ func ExampleAnyAnyMap_GetVarOrSetFunc() {
m := gmap.New()
m.Set("key1", "val1")
fmt.Println(m.GetVarOrSetFunc("key1", func() interface{} {
fmt.Println(m.GetVarOrSetFunc("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFunc("key2", func() interface{} {
fmt.Println(m.GetVarOrSetFunc("key2", func() any {
return "NotExistValue"
}))
@ -324,10 +324,10 @@ func ExampleAnyAnyMap_GetVarOrSetFuncLock() {
m := gmap.New()
m.Set("key1", "val1")
fmt.Println(m.GetVarOrSetFuncLock("key1", func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFuncLock("key2", func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock("key2", func() any {
return "NotExistValue"
}))
@ -350,10 +350,10 @@ func ExampleAnyAnyMap_SetIfNotExist() {
func ExampleAnyAnyMap_SetIfNotExistFunc() {
var m gmap.Map
fmt.Println(m.SetIfNotExistFunc("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFunc("k1", func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFunc("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFunc("k1", func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -366,10 +366,10 @@ func ExampleAnyAnyMap_SetIfNotExistFunc() {
func ExampleAnyAnyMap_SetIfNotExistFuncLock() {
var m gmap.Map
fmt.Println(m.SetIfNotExistFuncLock("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock("k1", func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFuncLock("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock("k1", func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -403,7 +403,7 @@ func ExampleAnyAnyMap_Removes() {
"k4": "v4",
})
removeList := make([]interface{}, 2)
removeList := make([]any, 2)
removeList = append(removeList, "k1")
removeList = append(removeList, "k2")
@ -538,7 +538,7 @@ func ExampleAnyAnyMap_LockFunc() {
"k4": 4,
})
m.LockFunc(func(m map[interface{}]interface{}) {
m.LockFunc(func(m map[any]any) {
totalValue := 0
for _, v := range m {
totalValue += v.(int)
@ -559,7 +559,7 @@ func ExampleAnyAnyMap_RLockFunc() {
"k4": 4,
})
m.RLockFunc(func(m map[interface{}]interface{}) {
m.RLockFunc(func(m map[any]any) {
totalValue := 0
for _, v := range m {
totalValue += v.(int)

View File

@ -22,7 +22,7 @@ func ExampleIntAnyMap_Iterator() {
}
var totalKey, totalValue int
m.Iterator(func(k int, v interface{}) bool {
m.Iterator(func(k int, v any) bool {
totalKey += k
totalValue += v.(int)
@ -149,7 +149,7 @@ func ExampleIntAnyMap_Set() {
func ExampleIntAnyMap_Sets() {
m := gmap.NewIntAnyMap()
addMap := make(map[int]interface{})
addMap := make(map[int]any)
addMap[1] = "val1"
addMap[2] = "val2"
addMap[3] = "val3"
@ -252,10 +252,10 @@ func ExampleIntAnyMap_GetOrSetFunc() {
m := gmap.NewIntAnyMap()
m.Set(1, "val1")
fmt.Println(m.GetOrSetFunc(1, func() interface{} {
fmt.Println(m.GetOrSetFunc(1, func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFunc(2, func() interface{} {
fmt.Println(m.GetOrSetFunc(2, func() any {
return "NotExistValue"
}))
@ -268,10 +268,10 @@ func ExampleIntAnyMap_GetOrSetFuncLock() {
m := gmap.NewIntAnyMap()
m.Set(1, "val1")
fmt.Println(m.GetOrSetFuncLock(1, func() interface{} {
fmt.Println(m.GetOrSetFuncLock(1, func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFuncLock(2, func() interface{} {
fmt.Println(m.GetOrSetFuncLock(2, func() any {
return "NotExistValue"
}))
@ -308,10 +308,10 @@ func ExampleIntAnyMap_GetVarOrSetFunc() {
m := gmap.NewIntAnyMap()
m.Set(1, "val1")
fmt.Println(m.GetVarOrSetFunc(1, func() interface{} {
fmt.Println(m.GetVarOrSetFunc(1, func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFunc(2, func() interface{} {
fmt.Println(m.GetVarOrSetFunc(2, func() any {
return "NotExistValue"
}))
@ -324,10 +324,10 @@ func ExampleIntAnyMap_GetVarOrSetFuncLock() {
m := gmap.NewIntAnyMap()
m.Set(1, "val1")
fmt.Println(m.GetVarOrSetFuncLock(1, func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock(1, func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFuncLock(2, func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock(2, func() any {
return "NotExistValue"
}))
@ -350,10 +350,10 @@ func ExampleIntAnyMap_SetIfNotExist() {
func ExampleIntAnyMap_SetIfNotExistFunc() {
var m gmap.IntAnyMap
fmt.Println(m.SetIfNotExistFunc(1, func() interface{} {
fmt.Println(m.SetIfNotExistFunc(1, func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFunc(1, func() interface{} {
fmt.Println(m.SetIfNotExistFunc(1, func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -366,10 +366,10 @@ func ExampleIntAnyMap_SetIfNotExistFunc() {
func ExampleIntAnyMap_SetIfNotExistFuncLock() {
var m gmap.IntAnyMap
fmt.Println(m.SetIfNotExistFuncLock(1, func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock(1, func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFuncLock(1, func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock(1, func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -538,7 +538,7 @@ func ExampleIntAnyMap_LockFunc() {
4: 4,
})
m.LockFunc(func(m map[int]interface{}) {
m.LockFunc(func(m map[int]any) {
totalValue := 0
for _, v := range m {
totalValue += v.(int)
@ -559,7 +559,7 @@ func ExampleIntAnyMap_RLockFunc() {
4: 4,
})
m.RLockFunc(func(m map[int]interface{}) {
m.RLockFunc(func(m map[int]any) {
totalValue := 0
for _, v := range m {
totalValue += v.(int)
@ -651,7 +651,7 @@ func ExampleIntAnyMap_UnmarshalJSON() {
func ExampleIntAnyMap_UnmarshalValue() {
var m gmap.IntAnyMap
goWeb := map[int]interface{}{
goWeb := map[int]any{
1: "goframe",
2: "gin",
3: "echo",

View File

@ -22,7 +22,7 @@ func ExampleListMap_Iterator() {
}
var totalKey, totalValue int
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
totalKey += k.(int)
totalValue += v.(int)
@ -44,7 +44,7 @@ func ExampleListMap_IteratorAsc() {
}
var totalKey, totalValue int
m.IteratorAsc(func(k interface{}, v interface{}) bool {
m.IteratorAsc(func(k any, v any) bool {
totalKey += k.(int)
totalValue += v.(int)
@ -66,7 +66,7 @@ func ExampleListMap_IteratorDesc() {
}
var totalKey, totalValue int
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
totalKey += k.(int)
totalValue += v.(int)
@ -188,7 +188,7 @@ func ExampleListMap_Set() {
func ExampleListMap_Sets() {
m := gmap.NewListMap()
addMap := make(map[interface{}]interface{})
addMap := make(map[any]any)
addMap["key1"] = "val1"
addMap["key2"] = "val2"
addMap["key3"] = "val3"
@ -291,10 +291,10 @@ func ExampleListMap_GetOrSetFunc() {
m := gmap.NewListMap()
m.Set("key1", "val1")
fmt.Println(m.GetOrSetFunc("key1", func() interface{} {
fmt.Println(m.GetOrSetFunc("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFunc("key2", func() interface{} {
fmt.Println(m.GetOrSetFunc("key2", func() any {
return "NotExistValue"
}))
@ -307,10 +307,10 @@ func ExampleListMap_GetOrSetFuncLock() {
m := gmap.NewListMap()
m.Set("key1", "val1")
fmt.Println(m.GetOrSetFuncLock("key1", func() interface{} {
fmt.Println(m.GetOrSetFuncLock("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFuncLock("key2", func() interface{} {
fmt.Println(m.GetOrSetFuncLock("key2", func() any {
return "NotExistValue"
}))
@ -347,10 +347,10 @@ func ExampleListMap_GetVarOrSetFunc() {
m := gmap.NewListMap()
m.Set("key1", "val1")
fmt.Println(m.GetVarOrSetFunc("key1", func() interface{} {
fmt.Println(m.GetVarOrSetFunc("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFunc("key2", func() interface{} {
fmt.Println(m.GetVarOrSetFunc("key2", func() any {
return "NotExistValue"
}))
@ -363,10 +363,10 @@ func ExampleListMap_GetVarOrSetFuncLock() {
m := gmap.NewListMap()
m.Set("key1", "val1")
fmt.Println(m.GetVarOrSetFuncLock("key1", func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFuncLock("key2", func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock("key2", func() any {
return "NotExistValue"
}))
@ -389,10 +389,10 @@ func ExampleListMap_SetIfNotExist() {
func ExampleListMap_SetIfNotExistFunc() {
var m gmap.ListMap
fmt.Println(m.SetIfNotExistFunc("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFunc("k1", func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFunc("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFunc("k1", func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -405,10 +405,10 @@ func ExampleListMap_SetIfNotExistFunc() {
func ExampleListMap_SetIfNotExistFuncLock() {
var m gmap.ListMap
fmt.Println(m.SetIfNotExistFuncLock("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock("k1", func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFuncLock("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock("k1", func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -442,7 +442,7 @@ func ExampleListMap_Removes() {
"k4": "v4",
})
removeList := make([]interface{}, 2)
removeList := make([]any, 2)
removeList = append(removeList, "k1")
removeList = append(removeList, "k2")

View File

@ -22,7 +22,7 @@ func ExampleStrAnyMap_Iterator() {
}
var totalValue int
m.Iterator(func(k string, v interface{}) bool {
m.Iterator(func(k string, v any) bool {
totalValue += v.(int)
return totalValue < 50
@ -146,7 +146,7 @@ func ExampleStrAnyMap_Set() {
func ExampleStrAnyMap_Sets() {
m := gmap.NewStrAnyMap()
addMap := make(map[string]interface{})
addMap := make(map[string]any)
addMap["key1"] = "val1"
addMap["key2"] = "val2"
addMap["key3"] = "val3"
@ -249,10 +249,10 @@ func ExampleStrAnyMap_GetOrSetFunc() {
m := gmap.NewStrAnyMap()
m.Set("key1", "val1")
fmt.Println(m.GetOrSetFunc("key1", func() interface{} {
fmt.Println(m.GetOrSetFunc("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFunc("key2", func() interface{} {
fmt.Println(m.GetOrSetFunc("key2", func() any {
return "NotExistValue"
}))
@ -265,10 +265,10 @@ func ExampleStrAnyMap_GetOrSetFuncLock() {
m := gmap.NewStrAnyMap()
m.Set("key1", "val1")
fmt.Println(m.GetOrSetFuncLock("key1", func() interface{} {
fmt.Println(m.GetOrSetFuncLock("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetOrSetFuncLock("key2", func() interface{} {
fmt.Println(m.GetOrSetFuncLock("key2", func() any {
return "NotExistValue"
}))
@ -305,10 +305,10 @@ func ExampleStrAnyMap_GetVarOrSetFunc() {
m := gmap.NewStrAnyMap()
m.Set("key1", "val1")
fmt.Println(m.GetVarOrSetFunc("key1", func() interface{} {
fmt.Println(m.GetVarOrSetFunc("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFunc("key2", func() interface{} {
fmt.Println(m.GetVarOrSetFunc("key2", func() any {
return "NotExistValue"
}))
@ -321,10 +321,10 @@ func ExampleStrAnyMap_GetVarOrSetFuncLock() {
m := gmap.NewStrAnyMap()
m.Set("key1", "val1")
fmt.Println(m.GetVarOrSetFuncLock("key1", func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock("key1", func() any {
return "NotExistValue"
}))
fmt.Println(m.GetVarOrSetFuncLock("key2", func() interface{} {
fmt.Println(m.GetVarOrSetFuncLock("key2", func() any {
return "NotExistValue"
}))
@ -347,10 +347,10 @@ func ExampleStrAnyMap_SetIfNotExist() {
func ExampleStrAnyMap_SetIfNotExistFunc() {
var m gmap.StrAnyMap
fmt.Println(m.SetIfNotExistFunc("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFunc("k1", func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFunc("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFunc("k1", func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -363,10 +363,10 @@ func ExampleStrAnyMap_SetIfNotExistFunc() {
func ExampleStrAnyMap_SetIfNotExistFuncLock() {
var m gmap.StrAnyMap
fmt.Println(m.SetIfNotExistFuncLock("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock("k1", func() any {
return "v1"
}))
fmt.Println(m.SetIfNotExistFuncLock("k1", func() interface{} {
fmt.Println(m.SetIfNotExistFuncLock("k1", func() any {
return "v2"
}))
fmt.Println(m.Map())
@ -535,7 +535,7 @@ func ExampleStrAnyMap_LockFunc() {
"k4": 4,
})
m.LockFunc(func(m map[string]interface{}) {
m.LockFunc(func(m map[string]any) {
totalValue := 0
for _, v := range m {
totalValue += v.(int)
@ -556,7 +556,7 @@ func ExampleStrAnyMap_RLockFunc() {
"k4": 4,
})
m.RLockFunc(func(m map[string]interface{}) {
m.RLockFunc(func(m map[string]any) {
totalValue := 0
for _, v := range m {
totalValue += v.(int)
@ -648,7 +648,7 @@ func ExampleStrAnyMap_UnmarshalJSON() {
func ExampleStrAnyMap_UnmarshalValue() {
var m gmap.StrAnyMap
goWeb := map[string]interface{}{
goWeb := map[string]any{
"goframe": "https://goframe.org",
"gin": "https://gin-gonic.com/",
"echo": "https://echo.labstack.com/",

View File

@ -22,7 +22,7 @@ func ExampleNew() {
// Print size.
fmt.Println(m.Size())
addMap := make(map[interface{}]interface{})
addMap := make(map[any]any)
addMap["key2"] = "val2"
addMap["key3"] = "val3"
addMap[1] = 1
@ -46,7 +46,7 @@ func ExampleNew() {
fmt.Println(m.Keys())
// Batch remove keys.
m.Removes([]interface{}{"key1", 1})
m.Removes([]any{"key1", 1})
fmt.Println(m.Keys())
// Contains checks whether a key exists.

View File

@ -40,7 +40,7 @@ func Test_AnyAnyMap_Var(t *testing.T) {
t.AssertIN(3, m.Values())
t.AssertIN(1, m.Values())
m.Flip()
t.Assert(m.Map(), map[interface{}]int{1: 1, 3: 3})
t.Assert(m.Map(), map[any]int{1: 1, 3: 3})
m.Clear()
t.Assert(m.Size(), 0)
@ -70,14 +70,14 @@ func Test_AnyAnyMap_Basic(t *testing.T) {
t.AssertIN(3, m.Values())
t.AssertIN(1, m.Values())
m.Flip()
t.Assert(m.Map(), map[interface{}]int{1: 1, 3: 3})
t.Assert(m.Map(), map[any]int{1: 1, 3: 3})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gmap.NewAnyAnyMapFrom(map[interface{}]interface{}{1: 1, 2: "2"})
t.Assert(m2.Map(), map[interface{}]interface{}{1: 1, 2: "2"})
m2 := gmap.NewAnyAnyMapFrom(map[any]any{1: 1, 2: "2"})
t.Assert(m2.Map(), map[any]any{1: 1, 2: "2"})
})
}
@ -103,23 +103,23 @@ func Test_AnyAnyMap_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewAnyAnyMap()
m.Sets(map[interface{}]interface{}{1: 1, 2: "2", 3: 3})
t.Assert(m.Map(), map[interface{}]interface{}{1: 1, 2: "2", 3: 3})
m.Removes([]interface{}{1, 2})
t.Assert(m.Map(), map[interface{}]interface{}{3: 3})
m.Sets(map[any]any{1: 1, 2: "2", 3: 3})
t.Assert(m.Map(), map[any]any{1: 1, 2: "2", 3: 3})
m.Removes([]any{1, 2})
t.Assert(m.Map(), map[any]any{3: 3})
})
}
func Test_AnyAnyMap_Iterator_Deadlock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewAnyAnyMapFrom(map[interface{}]interface{}{1: 1, 2: "2", "3": "3", "4": 4}, true)
m.Iterator(func(k interface{}, _ interface{}) bool {
m := gmap.NewAnyAnyMapFrom(map[any]any{1: 1, 2: "2", "3": "3", "4": 4}, true)
m.Iterator(func(k any, _ any) bool {
if gconv.Int(k)%2 == 0 {
m.Remove(k)
}
return true
})
t.Assert(m.Map(), map[interface{}]interface{}{
t.Assert(m.Map(), map[any]any{
1: 1,
"3": "3",
})
@ -128,20 +128,20 @@ func Test_AnyAnyMap_Iterator_Deadlock(t *testing.T) {
func Test_AnyAnyMap_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[interface{}]interface{}{1: 1, 2: "2"}
expect := map[any]any{1: 1, 2: "2"}
m := gmap.NewAnyAnyMapFrom(expect)
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
t.Assert(expect[k], v)
return true
})
// 断言返回值对遍历控制
i := 0
j := 0
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
i++
return true
})
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
j++
return false
})
@ -152,12 +152,12 @@ func Test_AnyAnyMap_Iterator(t *testing.T) {
func Test_AnyAnyMap_Lock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[interface{}]interface{}{1: 1, 2: "2"}
expect := map[any]any{1: 1, 2: "2"}
m := gmap.NewAnyAnyMapFrom(expect)
m.LockFunc(func(m map[interface{}]interface{}) {
m.LockFunc(func(m map[any]any) {
t.Assert(m, expect)
})
m.RLockFunc(func(m map[interface{}]interface{}) {
m.RLockFunc(func(m map[any]any) {
t.Assert(m, expect)
})
})
@ -166,7 +166,7 @@ func Test_AnyAnyMap_Lock(t *testing.T) {
func Test_AnyAnyMap_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
// clone 方法是深克隆
m := gmap.NewAnyAnyMapFrom(map[interface{}]interface{}{1: 1, 2: "2"})
m := gmap.NewAnyAnyMapFrom(map[any]any{1: 1, 2: "2"})
m_clone := m.Clone()
m.Remove(1)
@ -186,7 +186,7 @@ func Test_AnyAnyMap_Merge(t *testing.T) {
m1.Set(1, 1)
m2.Set(2, "2")
m1.Merge(m2)
t.Assert(m1.Map(), map[interface{}]interface{}{1: 1, 2: "2"})
t.Assert(m1.Map(), map[any]any{1: 1, 2: "2"})
m3 := gmap.NewAnyAnyMapFrom(nil)
m3.Merge(m2)
t.Assert(m3.Map(), m2.Map())
@ -366,7 +366,7 @@ func TestAnyAnyMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"k1":"v1","k2":"v2"}`),
}, &v)
@ -379,7 +379,7 @@ func TestAnyAnyMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.Map{
"k1": "v1",
@ -438,8 +438,8 @@ func Test_AnyAnyMap_Diff(t *testing.T) {
4: "v4",
})
addedKeys, removedKeys, updatedKeys := m1.Diff(m2)
t.Assert(addedKeys, []interface{}{4})
t.Assert(removedKeys, []interface{}{"1"})
t.Assert(updatedKeys, []interface{}{3})
t.Assert(addedKeys, []any{4})
t.Assert(removedKeys, []any{"1"})
t.Assert(updatedKeys, []any{3})
})
}

View File

@ -17,7 +17,7 @@ import (
"github.com/gogf/gf/v2/util/gconv"
)
func getAny() interface{} {
func getAny() any {
return 123
}
@ -43,7 +43,7 @@ func Test_IntAnyMap_Var(t *testing.T) {
t.AssertIN(3, m.Values())
t.AssertIN(1, m.Values())
m.Flip()
t.Assert(m.Map(), map[interface{}]int{1: 1, 3: 3})
t.Assert(m.Map(), map[any]int{1: 1, 3: 3})
m.Clear()
t.Assert(m.Size(), 0)
@ -73,20 +73,20 @@ func Test_IntAnyMap_Basic(t *testing.T) {
t.AssertIN(3, m.Values())
t.AssertIN(1, m.Values())
m.Flip()
t.Assert(m.Map(), map[interface{}]int{1: 1, 3: 3})
t.Assert(m.Map(), map[any]int{1: 1, 3: 3})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gmap.NewIntAnyMapFrom(map[int]interface{}{1: 1, 2: "2"})
t.Assert(m2.Map(), map[int]interface{}{1: 1, 2: "2"})
m2 := gmap.NewIntAnyMapFrom(map[int]any{1: 1, 2: "2"})
t.Assert(m2.Map(), map[int]any{1: 1, 2: "2"})
})
gtest.C(t, func(t *gtest.T) {
m := gmap.NewIntAnyMap(true)
m.Set(1, 1)
t.Assert(m.Map(), map[int]interface{}{1: 1})
t.Assert(m.Map(), map[int]any{1: 1})
})
}
@ -111,23 +111,23 @@ func Test_IntAnyMap_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewIntAnyMap()
m.Sets(map[int]interface{}{1: 1, 2: "2", 3: 3})
t.Assert(m.Map(), map[int]interface{}{1: 1, 2: "2", 3: 3})
m.Sets(map[int]any{1: 1, 2: "2", 3: 3})
t.Assert(m.Map(), map[int]any{1: 1, 2: "2", 3: 3})
m.Removes([]int{1, 2})
t.Assert(m.Map(), map[int]interface{}{3: 3})
t.Assert(m.Map(), map[int]any{3: 3})
})
}
func Test_IntAnyMap_Iterator_Deadlock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewIntAnyMapFrom(map[int]interface{}{1: 1, 2: 2, 3: "3", 4: 4}, true)
m.Iterator(func(k int, _ interface{}) bool {
m := gmap.NewIntAnyMapFrom(map[int]any{1: 1, 2: 2, 3: "3", 4: 4}, true)
m.Iterator(func(k int, _ any) bool {
if k%2 == 0 {
m.Remove(k)
}
return true
})
t.Assert(m.Map(), map[int]interface{}{
t.Assert(m.Map(), map[int]any{
1: 1,
3: "3",
})
@ -136,20 +136,20 @@ func Test_IntAnyMap_Iterator_Deadlock(t *testing.T) {
func Test_IntAnyMap_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[int]interface{}{1: 1, 2: "2"}
expect := map[int]any{1: 1, 2: "2"}
m := gmap.NewIntAnyMapFrom(expect)
m.Iterator(func(k int, v interface{}) bool {
m.Iterator(func(k int, v any) bool {
t.Assert(expect[k], v)
return true
})
// 断言返回值对遍历控制
i := 0
j := 0
m.Iterator(func(k int, v interface{}) bool {
m.Iterator(func(k int, v any) bool {
i++
return true
})
m.Iterator(func(k int, v interface{}) bool {
m.Iterator(func(k int, v any) bool {
j++
return false
})
@ -161,12 +161,12 @@ func Test_IntAnyMap_Iterator(t *testing.T) {
func Test_IntAnyMap_Lock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[int]interface{}{1: 1, 2: "2"}
expect := map[int]any{1: 1, 2: "2"}
m := gmap.NewIntAnyMapFrom(expect)
m.LockFunc(func(m map[int]interface{}) {
m.LockFunc(func(m map[int]any) {
t.Assert(m, expect)
})
m.RLockFunc(func(m map[int]interface{}) {
m.RLockFunc(func(m map[int]any) {
t.Assert(m, expect)
})
})
@ -175,7 +175,7 @@ func Test_IntAnyMap_Lock(t *testing.T) {
func Test_IntAnyMap_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
// clone 方法是深克隆
m := gmap.NewIntAnyMapFrom(map[int]interface{}{1: 1, 2: "2"})
m := gmap.NewIntAnyMapFrom(map[int]any{1: 1, 2: "2"})
m_clone := m.Clone()
m.Remove(1)
@ -195,7 +195,7 @@ func Test_IntAnyMap_Merge(t *testing.T) {
m1.Set(1, 1)
m2.Set(2, "2")
m1.Merge(m2)
t.Assert(m1.Map(), map[int]interface{}{1: 1, 2: "2"})
t.Assert(m1.Map(), map[int]any{1: 1, 2: "2"})
m3 := gmap.NewIntAnyMapFrom(nil)
m3.Merge(m2)
t.Assert(m3.Map(), m2.Map())
@ -350,7 +350,7 @@ func TestIntAnyMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"1":"v1","2":"v2"}`),
}, &v)
@ -363,7 +363,7 @@ func TestIntAnyMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.MapIntAny{
1: "v1",

View File

@ -358,7 +358,7 @@ func TestIntIntMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"1":1,"2":2}`),
}, &v)
@ -371,7 +371,7 @@ func TestIntIntMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.MapIntAny{
1: 1,

View File

@ -149,7 +149,7 @@ func Test_IntStrMap_Batch(t *testing.T) {
m.Sets(map[int]string{1: "a", 2: "b", 3: "c"})
t.Assert(m.Map(), map[int]string{1: "a", 2: "b", 3: "c"})
m.Removes([]int{1, 2})
t.Assert(m.Map(), map[int]interface{}{3: "c"})
t.Assert(m.Map(), map[int]any{3: "c"})
})
}
@ -384,7 +384,7 @@ func TestIntStrMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"1":"v1","2":"v2"}`),
}, &v)
@ -397,7 +397,7 @@ func TestIntStrMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.MapIntAny{
1: "v1",

View File

@ -41,7 +41,7 @@ func Test_StrAnyMap_Var(t *testing.T) {
t.AssertIN(1, m.Values())
m.Flip()
t.Assert(m.Map(), map[string]interface{}{"1": "a", "3": "c"})
t.Assert(m.Map(), map[string]any{"1": "a", "3": "c"})
m.Clear()
t.Assert(m.Size(), 0)
@ -72,14 +72,14 @@ func Test_StrAnyMap_Basic(t *testing.T) {
t.AssertIN(1, m.Values())
m.Flip()
t.Assert(m.Map(), map[string]interface{}{"1": "a", "3": "c"})
t.Assert(m.Map(), map[string]any{"1": "a", "3": "c"})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gmap.NewStrAnyMapFrom(map[string]interface{}{"a": 1, "b": "2"})
t.Assert(m2.Map(), map[string]interface{}{"a": 1, "b": "2"})
m2 := gmap.NewStrAnyMapFrom(map[string]any{"a": 1, "b": "2"})
t.Assert(m2.Map(), map[string]any{"a": 1, "b": "2"})
})
}
@ -103,24 +103,24 @@ func Test_StrAnyMap_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewStrAnyMap()
m.Sets(map[string]interface{}{"a": 1, "b": "2", "c": 3})
t.Assert(m.Map(), map[string]interface{}{"a": 1, "b": "2", "c": 3})
m.Sets(map[string]any{"a": 1, "b": "2", "c": 3})
t.Assert(m.Map(), map[string]any{"a": 1, "b": "2", "c": 3})
m.Removes([]string{"a", "b"})
t.Assert(m.Map(), map[string]interface{}{"c": 3})
t.Assert(m.Map(), map[string]any{"c": 3})
})
}
func Test_StrAnyMap_Iterator_Deadlock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewStrAnyMapFrom(map[string]interface{}{"1": "1", "2": "2", "3": "3", "4": "4"}, true)
m.Iterator(func(k string, _ interface{}) bool {
m := gmap.NewStrAnyMapFrom(map[string]any{"1": "1", "2": "2", "3": "3", "4": "4"}, true)
m.Iterator(func(k string, _ any) bool {
kInt, _ := strconv.Atoi(k)
if kInt%2 == 0 {
m.Remove(k)
}
return true
})
t.Assert(m.Map(), map[string]interface{}{
t.Assert(m.Map(), map[string]any{
"1": "1",
"3": "3",
})
@ -129,20 +129,20 @@ func Test_StrAnyMap_Iterator_Deadlock(t *testing.T) {
func Test_StrAnyMap_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[string]interface{}{"a": true, "b": false}
expect := map[string]any{"a": true, "b": false}
m := gmap.NewStrAnyMapFrom(expect)
m.Iterator(func(k string, v interface{}) bool {
m.Iterator(func(k string, v any) bool {
t.Assert(expect[k], v)
return true
})
// 断言返回值对遍历控制
i := 0
j := 0
m.Iterator(func(k string, v interface{}) bool {
m.Iterator(func(k string, v any) bool {
i++
return true
})
m.Iterator(func(k string, v interface{}) bool {
m.Iterator(func(k string, v any) bool {
j++
return false
})
@ -153,13 +153,13 @@ func Test_StrAnyMap_Iterator(t *testing.T) {
func Test_StrAnyMap_Lock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[string]interface{}{"a": true, "b": false}
expect := map[string]any{"a": true, "b": false}
m := gmap.NewStrAnyMapFrom(expect)
m.LockFunc(func(m map[string]interface{}) {
m.LockFunc(func(m map[string]any) {
t.Assert(m, expect)
})
m.RLockFunc(func(m map[string]interface{}) {
m.RLockFunc(func(m map[string]any) {
t.Assert(m, expect)
})
})
@ -168,7 +168,7 @@ func Test_StrAnyMap_Lock(t *testing.T) {
func Test_StrAnyMap_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
// clone 方法是深克隆
m := gmap.NewStrAnyMapFrom(map[string]interface{}{"a": 1, "b": "2"})
m := gmap.NewStrAnyMapFrom(map[string]any{"a": 1, "b": "2"})
m_clone := m.Clone()
m.Remove("a")
@ -188,7 +188,7 @@ func Test_StrAnyMap_Merge(t *testing.T) {
m1.Set("a", 1)
m2.Set("b", "2")
m1.Merge(m2)
t.Assert(m1.Map(), map[string]interface{}{"a": 1, "b": "2"})
t.Assert(m1.Map(), map[string]any{"a": 1, "b": "2"})
m3 := gmap.NewStrAnyMapFrom(nil)
m3.Merge(m2)
@ -358,7 +358,7 @@ func TestStrAnyMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"k1":"v1","k2":"v2"}`),
}, &v)
@ -371,7 +371,7 @@ func TestStrAnyMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.Map{
"k1": "v1",

View File

@ -363,7 +363,7 @@ func TestStrIntMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"k1":1,"k2":2}`),
}, &v)
@ -376,7 +376,7 @@ func TestStrIntMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.Map{
"k1": 1,

View File

@ -362,7 +362,7 @@ func TestStrStrMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"k1":"v1","k2":"v2"}`),
}, &v)
@ -375,7 +375,7 @@ func TestStrStrMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.Map{
"k1": "v1",

View File

@ -21,7 +21,7 @@ func Test_ListMap_Var(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var m gmap.ListMap
m.Set("key1", "val1")
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -41,7 +41,7 @@ func Test_ListMap_Var(t *testing.T) {
m.Flip()
t.Assert(m.Map(), map[interface{}]interface{}{"val3": "key3", "val1": "key1"})
t.Assert(m.Map(), map[any]any{"val3": "key3", "val1": "key1"})
m.Clear()
t.Assert(m.Size(), 0)
@ -53,7 +53,7 @@ func Test_ListMap_Basic(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewListMap()
m.Set("key1", "val1")
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -73,14 +73,14 @@ func Test_ListMap_Basic(t *testing.T) {
m.Flip()
t.Assert(m.Map(), map[interface{}]interface{}{"val3": "key3", "val1": "key1"})
t.Assert(m.Map(), map[any]any{"val3": "key3", "val1": "key1"})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gmap.NewListMapFrom(map[interface{}]interface{}{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[interface{}]interface{}{1: 1, "key1": "val1"})
m2 := gmap.NewListMapFrom(map[any]any{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[any]any{1: 1, "key1": "val1"})
})
}
@ -100,30 +100,30 @@ func Test_ListMap_Set_Fun(t *testing.T) {
func Test_ListMap_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewListMap()
m.Sets(map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]interface{}{"key1", 1})
t.Assert(m.Map(), map[interface{}]interface{}{"key2": "val2", "key3": "val3"})
m.Sets(map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]any{"key1", 1})
t.Assert(m.Map(), map[any]any{"key2": "val2", "key3": "val3"})
})
}
func Test_ListMap_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[interface{}]interface{}{1: 1, "key1": "val1"}
expect := map[any]any{1: 1, "key1": "val1"}
m := gmap.NewListMapFrom(expect)
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
t.Assert(expect[k], v)
return true
})
// 断言返回值对遍历控制
i := 0
j := 0
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
i++
return true
})
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
j++
return false
})
@ -135,7 +135,7 @@ func Test_ListMap_Iterator(t *testing.T) {
func Test_ListMap_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
// clone 方法是深克隆
m := gmap.NewListMapFrom(map[interface{}]interface{}{1: 1, "key1": "val1"})
m := gmap.NewListMapFrom(map[any]any{1: 1, "key1": "val1"})
m_clone := m.Clone()
m.Remove(1)
// 修改原 map,clone 后的 map 不影响
@ -154,7 +154,7 @@ func Test_ListMap_Basic_Merge(t *testing.T) {
m1.Set("key1", "val1")
m2.Set("key2", "val2")
m1.Merge(m2)
t.Assert(m1.Map(), map[interface{}]interface{}{"key1": "val1", "key2": "val2"})
t.Assert(m1.Map(), map[any]any{"key1": "val1", "key2": "val2"})
m3 := gmap.NewListMapFrom(nil)
m3.Merge(m2)
t.Assert(m3.Map(), m2.Map())
@ -321,7 +321,7 @@ func TestListMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"1":"v1","2":"v2"}`),
}, &v)
@ -334,7 +334,7 @@ func TestListMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.MapIntAny{
1: "v1",

View File

@ -22,7 +22,7 @@ func Test_TreeMap_Var(t *testing.T) {
var m gmap.TreeMap
m.SetComparator(gutil.ComparatorString)
m.Set("key1", "val1")
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -42,7 +42,7 @@ func Test_TreeMap_Var(t *testing.T) {
t.AssertIN("val1", m.Values())
m.Flip()
t.Assert(m.Map(), map[interface{}]interface{}{"val3": "key3", "val1": "key1"})
t.Assert(m.Map(), map[any]any{"val3": "key3", "val1": "key1"})
m.Clear()
t.Assert(m.Size(), 0)
@ -54,7 +54,7 @@ func Test_TreeMap_Basic(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewTreeMap(gutil.ComparatorString)
m.Set("key1", "val1")
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -74,14 +74,14 @@ func Test_TreeMap_Basic(t *testing.T) {
t.AssertIN("val1", m.Values())
m.Flip()
t.Assert(m.Map(), map[interface{}]interface{}{"val3": "key3", "val1": "key1"})
t.Assert(m.Map(), map[any]any{"val3": "key3", "val1": "key1"})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gmap.NewTreeMapFrom(gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[interface{}]interface{}{1: 1, "key1": "val1"})
m2 := gmap.NewTreeMapFrom(gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[any]any{1: 1, "key1": "val1"})
})
}
@ -101,29 +101,29 @@ func Test_TreeMap_Set_Fun(t *testing.T) {
func Test_TreeMap_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gmap.NewTreeMap(gutil.ComparatorString)
m.Sets(map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]interface{}{"key1", 1})
t.Assert(m.Map(), map[interface{}]interface{}{"key2": "val2", "key3": "val3"})
m.Sets(map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]any{"key1", 1})
t.Assert(m.Map(), map[any]any{"key2": "val2", "key3": "val3"})
})
}
func Test_TreeMap_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
expect := map[interface{}]interface{}{1: 1, "key1": "val1"}
expect := map[any]any{1: 1, "key1": "val1"}
m := gmap.NewTreeMapFrom(gutil.ComparatorString, expect)
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
t.Assert(expect[k], v)
return true
})
// 断言返回值对遍历控制
i := 0
j := 0
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
i++
return true
})
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
j++
return false
})
@ -132,17 +132,17 @@ func Test_TreeMap_Iterator(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
expect := map[interface{}]interface{}{1: 1, "key1": "val1"}
expect := map[any]any{1: 1, "key1": "val1"}
m := gmap.NewTreeMapFrom(gutil.ComparatorString, expect)
for i := 0; i < 10; i++ {
m.IteratorAsc(func(k interface{}, v interface{}) bool {
m.IteratorAsc(func(k any, v any) bool {
t.Assert(expect[k], v)
return true
})
}
j := 0
for i := 0; i < 10; i++ {
m.IteratorAsc(func(k interface{}, v interface{}) bool {
m.IteratorAsc(func(k any, v any) bool {
j++
return false
})
@ -154,7 +154,7 @@ func Test_TreeMap_Iterator(t *testing.T) {
func Test_TreeMap_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
// clone 方法是深克隆
m := gmap.NewTreeMapFrom(gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
m := gmap.NewTreeMapFrom(gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
m_clone := m.Clone()
m.Remove(1)
// 修改原 map,clone 后的 map 不影响
@ -218,7 +218,7 @@ func TestTreeMap_UnmarshalValue(t *testing.T) {
// JSON
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": []byte(`{"k1":"v1","k2":"v2"}`),
}, &v)
@ -231,7 +231,7 @@ func TestTreeMap_UnmarshalValue(t *testing.T) {
// Map
gtest.C(t, func(t *gtest.T) {
var v *V
err := gconv.Struct(map[string]interface{}{
err := gconv.Struct(map[string]any{
"name": "john",
"map": g.Map{
"k1": "v1",

View File

@ -21,28 +21,28 @@ import (
// Pool is an Object-Reusable Pool.
type Pool struct {
list *glist.List // Available/idle items list.
closed *gtype.Bool // Whether the pool is closed.
TTL time.Duration // Time To Live for pool items.
NewFunc func() (interface{}, error) // Callback function to create pool item.
list *glist.List // Available/idle items list.
closed *gtype.Bool // Whether the pool is closed.
TTL time.Duration // Time To Live for pool items.
NewFunc func() (any, error) // Callback function to create pool item.
// ExpireFunc is the function for expired items destruction.
// This function needs to be defined when the pool items
// need to perform additional destruction operations.
// Eg: net.Conn, os.File, etc.
ExpireFunc func(interface{})
ExpireFunc func(any)
}
// Pool item.
type poolItem struct {
value interface{} // Item value.
expireAt int64 // Expire timestamp in milliseconds.
value any // Item value.
expireAt int64 // Expire timestamp in milliseconds.
}
// NewFunc Creation function for object.
type NewFunc func() (interface{}, error)
type NewFunc func() (any, error)
// ExpireFunc Destruction function for object.
type ExpireFunc func(interface{})
type ExpireFunc func(any)
// New creates and returns a new object pool.
// To ensure execution efficiency, the expiration time cannot be modified once it is set.
@ -66,7 +66,7 @@ func New(ttl time.Duration, newFunc NewFunc, expireFunc ...ExpireFunc) *Pool {
}
// Put puts an item to pool.
func (p *Pool) Put(value interface{}) error {
func (p *Pool) Put(value any) error {
if p.closed.Val() {
return gerror.NewCode(gcode.CodeInvalidOperation, "pool is closed")
}
@ -85,7 +85,7 @@ func (p *Pool) Put(value interface{}) error {
}
// MustPut puts an item to pool, it panics if any error occurs.
func (p *Pool) MustPut(value interface{}) {
func (p *Pool) MustPut(value any) {
if err := p.Put(value); err != nil {
panic(err)
}
@ -108,7 +108,7 @@ func (p *Pool) Clear() {
// Get picks and returns an item from pool. If the pool is empty and NewFunc is defined,
// it creates and returns one from NewFunc.
func (p *Pool) Get() (interface{}, error) {
func (p *Pool) Get() (any, error) {
for !p.closed.Val() {
if r := p.list.PopFront(); r != nil {
f := r.(*poolItem)
@ -166,10 +166,7 @@ func (p *Pool) checkExpireItems(ctx context.Context) {
// by comparing with this timestamp. It is not accurate comparison for
// every item expired, but high performance.
var timestampMilli = gtime.TimestampMilli()
for {
if latestExpire > timestampMilli {
break
}
for latestExpire <= timestampMilli {
if r := p.list.PopFront(); r != nil {
item := r.(*poolItem)
latestExpire = item.expireAt

View File

@ -20,11 +20,11 @@ func ExampleNew() {
}
dbConnPool := gpool.New(time.Hour,
func() (interface{}, error) {
func() (any, error) {
dbConn := new(DBConn)
return dbConn, nil
},
func(i interface{}) {
func(i any) {
// sample : close db conn
// i.(DBConn).Conn.Close()
})
@ -42,12 +42,12 @@ func ExamplePool_Put() {
}
dbConnPool := gpool.New(time.Hour,
func() (interface{}, error) {
func() (any, error) {
dbConn := new(DBConn)
dbConn.Limit = 10
return dbConn, nil
},
func(i interface{}) {
func(i any) {
// sample : close db conn
// i.(DBConn).Conn.Close()
})
@ -76,12 +76,12 @@ func ExamplePool_Clear() {
}
dbConnPool := gpool.New(time.Hour,
func() (interface{}, error) {
func() (any, error) {
dbConn := new(DBConn)
dbConn.Limit = 10
return dbConn, nil
},
func(i interface{}) {
func(i any) {
i.(*DBConn).Limit = 0
// sample : close db conn
// i.(DBConn).Conn.Close()
@ -106,12 +106,12 @@ func ExamplePool_Get() {
}
dbConnPool := gpool.New(time.Hour,
func() (interface{}, error) {
func() (any, error) {
dbConn := new(DBConn)
dbConn.Limit = 10
return dbConn, nil
},
func(i interface{}) {
func(i any) {
// sample : close db conn
// i.(DBConn).Conn.Close()
})
@ -132,12 +132,12 @@ func ExamplePool_Size() {
}
dbConnPool := gpool.New(time.Hour,
func() (interface{}, error) {
func() (any, error) {
dbConn := new(DBConn)
dbConn.Limit = 10
return dbConn, nil
},
func(i interface{}) {
func(i any) {
// sample : close db conn
// i.(DBConn).Conn.Close()
})
@ -159,12 +159,12 @@ func ExamplePool_Close() {
Limit int
}
var (
newFunc = func() (interface{}, error) {
newFunc = func() (any, error) {
dbConn := new(DBConn)
dbConn.Limit = 10
return dbConn, nil
}
closeFunc = func(i interface{}) {
closeFunc = func(i any) {
fmt.Println("Close The Pool")
// sample : close db conn
// i.(DBConn).Conn.Close()

View File

@ -17,13 +17,13 @@ import (
"github.com/gogf/gf/v2/test/gtest"
)
var nf gpool.NewFunc = func() (i interface{}, e error) {
var nf gpool.NewFunc = func() (i any, e error) {
return "hello", nil
}
var assertIndex = gtype.NewInt(0)
var ef gpool.ExpireFunc = func(i interface{}) {
var ef gpool.ExpireFunc = func(i any) {
assertIndex.Add(1)
gtest.Assert(i, assertIndex)
}
@ -100,7 +100,7 @@ func Test_Gpool(t *testing.T) {
})
gtest.C(t, func(t *gtest.T) {
p := gpool.New(time.Millisecond*200, nil, func(i interface{}) {})
p := gpool.New(time.Millisecond*200, nil, func(i any) {})
p.Put(1)
time.Sleep(time.Millisecond * 100)
p.Put(2)
@ -109,7 +109,7 @@ func Test_Gpool(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
s := make([]int, 0)
p := gpool.New(time.Millisecond*200, nil, func(i interface{}) {
p := gpool.New(time.Millisecond*200, nil, func(i any) {
s = append(s, i.(int))
})
for i := 0; i < 5; i++ {

View File

@ -26,11 +26,11 @@ import (
// Queue is a concurrent-safe queue built on doubly linked list and channel.
type Queue struct {
limit int // Limit for queue size.
list *glist.List // Underlying list structure for data maintaining.
closed *gtype.Bool // Whether queue is closed.
events chan struct{} // Events for data writing.
C chan interface{} // Underlying channel for data reading.
limit int // Limit for queue size.
list *glist.List // Underlying list structure for data maintaining.
closed *gtype.Bool // Whether queue is closed.
events chan struct{} // Events for data writing.
C chan any // Underlying channel for data reading.
}
const (
@ -47,11 +47,11 @@ func New(limit ...int) *Queue {
}
if len(limit) > 0 && limit[0] > 0 {
q.limit = limit[0]
q.C = make(chan interface{}, limit[0])
q.C = make(chan any, limit[0])
} else {
q.list = glist.New(true)
q.events = make(chan struct{}, math.MaxInt32)
q.C = make(chan interface{}, defaultQueueSize)
q.C = make(chan any, defaultQueueSize)
go q.asyncLoopFromListToChannel()
}
return q
@ -59,7 +59,7 @@ func New(limit ...int) *Queue {
// Push pushes the data `v` into the queue.
// Note that it would panic if Push is called after the queue is closed.
func (q *Queue) Push(v interface{}) {
func (q *Queue) Push(v any) {
if q.limit > 0 {
q.C <- v
} else {
@ -72,7 +72,7 @@ func (q *Queue) Push(v interface{}) {
// Pop pops an item from the queue in FIFO way.
// Note that it would return nil immediately if Pop is called after the queue is closed.
func (q *Queue) Pop() interface{} {
func (q *Queue) Pop() any {
return <-q.C
}

View File

@ -22,7 +22,7 @@ var qstatic = gqueue.New(length)
var qdynamic = gqueue.New()
var cany = make(chan interface{}, length)
var cany = make(chan any, length)
func Benchmark_Gqueue_StaticPushAndPop(b *testing.B) {
b.N = bn

View File

@ -29,7 +29,7 @@ type Ring struct {
// internalRingItem stores the ring element value.
type internalRingItem struct {
Value interface{}
Value any
}
// New creates and returns a Ring structure of `cap` elements.
@ -48,8 +48,8 @@ func New(cap int, safe ...bool) *Ring {
}
// Val returns the item's value of current position.
func (r *Ring) Val() interface{} {
var value interface{}
func (r *Ring) Val() any {
var value any
r.mu.RLock()
if r.ring.Value != nil {
value = r.ring.Value.(internalRingItem).Value
@ -97,7 +97,7 @@ func (r *Ring) checkAndUpdateLenAndCap() {
}
// Set sets value to the item of current position.
func (r *Ring) Set(value interface{}) *Ring {
func (r *Ring) Set(value any) *Ring {
r.mu.Lock()
if r.ring.Value == nil {
r.len.Add(1)
@ -108,7 +108,7 @@ func (r *Ring) Set(value interface{}) *Ring {
}
// Put sets `value` to current item of ring and moves position to next item.
func (r *Ring) Put(value interface{}) *Ring {
func (r *Ring) Put(value any) *Ring {
r.mu.Lock()
if r.ring.Value == nil {
r.len.Add(1)
@ -187,7 +187,7 @@ func (r *Ring) Unlink(n int) *Ring {
// RLockIteratorNext iterates and locks reading forward
// with given callback function `f` within RWMutex.RLock.
// If `f` returns true, then it continues iterating; or false to stop.
func (r *Ring) RLockIteratorNext(f func(value interface{}) bool) {
func (r *Ring) RLockIteratorNext(f func(value any) bool) {
r.mu.RLock()
defer r.mu.RUnlock()
if r.ring.Value != nil && !f(r.ring.Value.(internalRingItem).Value) {
@ -203,7 +203,7 @@ func (r *Ring) RLockIteratorNext(f func(value interface{}) bool) {
// RLockIteratorPrev iterates and locks writing backward
// with given callback function `f` within RWMutex.RLock.
// If `f` returns true, then it continues iterating; or false to stop.
func (r *Ring) RLockIteratorPrev(f func(value interface{}) bool) {
func (r *Ring) RLockIteratorPrev(f func(value any) bool) {
r.mu.RLock()
defer r.mu.RUnlock()
if r.ring.Value != nil && !f(r.ring.Value.(internalRingItem).Value) {
@ -217,8 +217,8 @@ func (r *Ring) RLockIteratorPrev(f func(value interface{}) bool) {
}
// SliceNext returns a copy of all item values as slice forward from current position.
func (r *Ring) SliceNext() []interface{} {
s := make([]interface{}, 0)
func (r *Ring) SliceNext() []any {
s := make([]any, 0)
r.mu.RLock()
if r.ring.Value != nil {
s = append(s, r.ring.Value.(internalRingItem).Value)
@ -234,8 +234,8 @@ func (r *Ring) SliceNext() []interface{} {
}
// SlicePrev returns a copy of all item values as slice backward from current position.
func (r *Ring) SlicePrev() []interface{} {
s := make([]interface{}, 0)
func (r *Ring) SlicePrev() []any {
s := make([]any, 0)
r.mu.RLock()
if r.ring.Value != nil {
s = append(s, r.ring.Value.(internalRingItem).Value)

View File

@ -222,7 +222,7 @@ func ExampleRing_RLockIteratorNext() {
r.Set(i).Next()
}
r.RLockIteratorNext(func(value interface{}) bool {
r.RLockIteratorNext(func(value any) bool {
if value.(int) < 5 {
fmt.Println("IteratorNext Success, Value:", value)
return true
@ -248,7 +248,7 @@ func ExampleRing_RLockIteratorPrev() {
// move r to pos 9
r.Prev()
r.RLockIteratorPrev(func(value interface{}) bool {
r.RLockIteratorPrev(func(value any) bool {
if value.(int) >= 5 {
fmt.Println("IteratorPrev Success, Value:", value)
return true

View File

@ -193,7 +193,7 @@ func TestRing_RLockIteratorNext(t *testing.T) {
}
iterVal := 0
r.RLockIteratorNext(func(value interface{}) bool {
r.RLockIteratorNext(func(value any) bool {
if value.(int) == 0 {
iterVal = value.(int)
return false
@ -213,7 +213,7 @@ func TestRing_RLockIteratorPrev(t *testing.T) {
}
iterVal := 0
r.RLockIteratorPrev(func(value interface{}) bool {
r.RLockIteratorPrev(func(value any) bool {
if value.(int) == 0 {
iterVal = value.(int)
return false

View File

@ -16,10 +16,10 @@ import (
"github.com/gogf/gf/v2/util/gconv"
)
// Set is consisted of interface{} items.
// Set is consisted of any items.
type Set struct {
mu rwmutex.RWMutex
data map[interface{}]struct{}
data map[any]struct{}
}
// New create and returns a new set, which contains un-repeated items.
@ -33,15 +33,15 @@ func New(safe ...bool) *Set {
// Also see New.
func NewSet(safe ...bool) *Set {
return &Set{
data: make(map[interface{}]struct{}),
data: make(map[any]struct{}),
mu: rwmutex.Create(safe...),
}
}
// NewFrom returns a new set from `items`.
// Parameter `items` can be either a variable of any type, or a slice.
func NewFrom(items interface{}, safe ...bool) *Set {
m := make(map[interface{}]struct{})
func NewFrom(items any, safe ...bool) *Set {
m := make(map[any]struct{})
for _, v := range gconv.Interfaces(items) {
m[v] = struct{}{}
}
@ -53,7 +53,7 @@ func NewFrom(items interface{}, safe ...bool) *Set {
// Iterator iterates the set readonly with given callback function `f`,
// if `f` returns true then continue iterating; or false to stop.
func (set *Set) Iterator(f func(v interface{}) bool) {
func (set *Set) Iterator(f func(v any) bool) {
for _, k := range set.Slice() {
if !f(k) {
break
@ -62,10 +62,10 @@ func (set *Set) Iterator(f func(v interface{}) bool) {
}
// Add adds one or multiple items to the set.
func (set *Set) Add(items ...interface{}) {
func (set *Set) Add(items ...any) {
set.mu.Lock()
if set.data == nil {
set.data = make(map[interface{}]struct{})
set.data = make(map[any]struct{})
}
for _, v := range items {
set.data[v] = struct{}{}
@ -78,7 +78,7 @@ func (set *Set) Add(items ...interface{}) {
// or else it does nothing and returns false.
//
// Note that, if `item` is nil, it does nothing and returns false.
func (set *Set) AddIfNotExist(item interface{}) bool {
func (set *Set) AddIfNotExist(item any) bool {
if item == nil {
return false
}
@ -86,7 +86,7 @@ func (set *Set) AddIfNotExist(item interface{}) bool {
set.mu.Lock()
defer set.mu.Unlock()
if set.data == nil {
set.data = make(map[interface{}]struct{})
set.data = make(map[any]struct{})
}
if _, ok := set.data[item]; !ok {
set.data[item] = struct{}{}
@ -102,7 +102,7 @@ func (set *Set) AddIfNotExist(item interface{}) bool {
//
// Note that, if `item` is nil, it does nothing and returns false. The function `f`
// is executed without writing lock.
func (set *Set) AddIfNotExistFunc(item interface{}, f func() bool) bool {
func (set *Set) AddIfNotExistFunc(item any, f func() bool) bool {
if item == nil {
return false
}
@ -111,7 +111,7 @@ func (set *Set) AddIfNotExistFunc(item interface{}, f func() bool) bool {
set.mu.Lock()
defer set.mu.Unlock()
if set.data == nil {
set.data = make(map[interface{}]struct{})
set.data = make(map[any]struct{})
}
if _, ok := set.data[item]; !ok {
set.data[item] = struct{}{}
@ -128,7 +128,7 @@ func (set *Set) AddIfNotExistFunc(item interface{}, f func() bool) bool {
//
// Note that, if `item` is nil, it does nothing and returns false. The function `f`
// is executed within writing lock.
func (set *Set) AddIfNotExistFuncLock(item interface{}, f func() bool) bool {
func (set *Set) AddIfNotExistFuncLock(item any, f func() bool) bool {
if item == nil {
return false
}
@ -136,7 +136,7 @@ func (set *Set) AddIfNotExistFuncLock(item interface{}, f func() bool) bool {
set.mu.Lock()
defer set.mu.Unlock()
if set.data == nil {
set.data = make(map[interface{}]struct{})
set.data = make(map[any]struct{})
}
if f() {
if _, ok := set.data[item]; !ok {
@ -149,7 +149,7 @@ func (set *Set) AddIfNotExistFuncLock(item interface{}, f func() bool) bool {
}
// Contains checks whether the set contains `item`.
func (set *Set) Contains(item interface{}) bool {
func (set *Set) Contains(item any) bool {
var ok bool
set.mu.RLock()
if set.data != nil {
@ -160,7 +160,7 @@ func (set *Set) Contains(item interface{}) bool {
}
// Remove deletes `item` from set.
func (set *Set) Remove(item interface{}) {
func (set *Set) Remove(item any) {
set.mu.Lock()
if set.data != nil {
delete(set.data, item)
@ -179,16 +179,16 @@ func (set *Set) Size() int {
// Clear deletes all items of the set.
func (set *Set) Clear() {
set.mu.Lock()
set.data = make(map[interface{}]struct{})
set.data = make(map[any]struct{})
set.mu.Unlock()
}
// Slice returns all items of the set as slice.
func (set *Set) Slice() []interface{} {
func (set *Set) Slice() []any {
set.mu.RLock()
var (
i = 0
ret = make([]interface{}, len(set.data))
ret = make([]any, len(set.data))
)
for item := range set.data {
ret[i] = item
@ -251,14 +251,14 @@ func (set *Set) String() string {
}
// LockFunc locks writing with callback function `f`.
func (set *Set) LockFunc(f func(m map[interface{}]struct{})) {
func (set *Set) LockFunc(f func(m map[any]struct{})) {
set.mu.Lock()
defer set.mu.Unlock()
f(set.data)
}
// RLockFunc locks reading with callback function `f`.
func (set *Set) RLockFunc(f func(m map[interface{}]struct{})) {
func (set *Set) RLockFunc(f func(m map[any]struct{})) {
set.mu.RLock()
defer set.mu.RUnlock()
f(set.data)
@ -422,7 +422,7 @@ func (set *Set) Sum() (sum int) {
}
// Pop randomly pops an item from set.
func (set *Set) Pop() interface{} {
func (set *Set) Pop() any {
set.mu.Lock()
defer set.mu.Unlock()
for k := range set.data {
@ -434,7 +434,7 @@ func (set *Set) Pop() interface{} {
// Pops randomly pops `size` items from set.
// It returns all items if size == -1.
func (set *Set) Pops(size int) []interface{} {
func (set *Set) Pops(size int) []any {
set.mu.Lock()
defer set.mu.Unlock()
if size > len(set.data) || size == -1 {
@ -444,7 +444,7 @@ func (set *Set) Pops(size int) []interface{} {
return nil
}
index := 0
array := make([]interface{}, size)
array := make([]any, size)
for k := range set.data {
delete(set.data, k)
array[index] = k
@ -457,10 +457,10 @@ func (set *Set) Pops(size int) []interface{} {
}
// Walk applies a user supplied function `f` to every item of set.
func (set *Set) Walk(f func(item interface{}) interface{}) *Set {
func (set *Set) Walk(f func(item any) any) *Set {
set.mu.Lock()
defer set.mu.Unlock()
m := make(map[interface{}]struct{}, len(set.data))
m := make(map[any]struct{}, len(set.data))
for k, v := range set.data {
m[f(k)] = v
}
@ -478,9 +478,9 @@ func (set *Set) UnmarshalJSON(b []byte) error {
set.mu.Lock()
defer set.mu.Unlock()
if set.data == nil {
set.data = make(map[interface{}]struct{})
set.data = make(map[any]struct{})
}
var array []interface{}
var array []any
if err := json.UnmarshalUseNumber(b, &array); err != nil {
return err
}
@ -491,13 +491,13 @@ func (set *Set) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for set.
func (set *Set) UnmarshalValue(value interface{}) (err error) {
func (set *Set) UnmarshalValue(value any) (err error) {
set.mu.Lock()
defer set.mu.Unlock()
if set.data == nil {
set.data = make(map[interface{}]struct{})
set.data = make(map[any]struct{})
}
var array []interface{}
var array []any
switch value.(type) {
case string, []byte:
err = json.UnmarshalUseNumber(gconv.Bytes(value), &array)
@ -511,13 +511,13 @@ func (set *Set) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (set *Set) DeepCopy() interface{} {
func (set *Set) DeepCopy() any {
if set == nil {
return nil
}
set.mu.RLock()
defer set.mu.RUnlock()
data := make([]interface{}, 0)
data := make([]any, 0)
for k := range set.data {
data = append(data, k)
}

View File

@ -450,7 +450,7 @@ func (set *IntSet) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for set.
func (set *IntSet) UnmarshalValue(value interface{}) (err error) {
func (set *IntSet) UnmarshalValue(value any) (err error) {
set.mu.Lock()
defer set.mu.Unlock()
if set.data == nil {
@ -470,7 +470,7 @@ func (set *IntSet) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (set *IntSet) DeepCopy() interface{} {
func (set *IntSet) DeepCopy() any {
if set == nil {
return nil
}

View File

@ -480,7 +480,7 @@ func (set *StrSet) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for set.
func (set *StrSet) UnmarshalValue(value interface{}) (err error) {
func (set *StrSet) UnmarshalValue(value any) (err error) {
set.mu.Lock()
defer set.mu.Unlock()
if set.data == nil {
@ -500,7 +500,7 @@ func (set *StrSet) UnmarshalValue(value interface{}) (err error) {
}
// DeepCopy implements interface for deep copy of current type.
func (set *StrSet) DeepCopy() interface{} {
func (set *StrSet) DeepCopy() any {
if set == nil {
return nil
}

View File

@ -26,7 +26,7 @@ func TestSet_Var(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var s gset.Set
s.Add(1, 1, 2)
s.Add([]interface{}{3, 4}...)
s.Add([]any{3, 4}...)
t.Assert(s.Size(), 4)
t.AssertIN(1, s.Slice())
t.AssertIN(2, s.Slice())
@ -46,7 +46,7 @@ func TestSet_New(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
s := gset.New()
s.Add(1, 1, 2)
s.Add([]interface{}{3, 4}...)
s.Add([]any{3, 4}...)
t.Assert(s.Size(), 4)
t.AssertIN(1, s.Slice())
t.AssertIN(2, s.Slice())
@ -66,7 +66,7 @@ func TestSet_Basic(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
s := gset.NewSet()
s.Add(1, 1, 2)
s.Add([]interface{}{3, 4}...)
s.Add([]any{3, 4}...)
t.Assert(s.Size(), 4)
t.AssertIN(1, s.Slice())
t.AssertIN(2, s.Slice())
@ -84,8 +84,8 @@ func TestSet_Basic(t *testing.T) {
func TestSet_Iterator_Deadlock(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
set := gset.NewFrom([]interface{}{1, 2, 3, 4, 5}, true)
set.Iterator(func(k interface{}) bool {
set := gset.NewFrom([]any{1, 2, 3, 4, 5}, true)
set.Iterator(func(k any) bool {
if gconv.Int(k)%2 == 0 {
set.Remove(k)
}
@ -107,11 +107,11 @@ func TestSet_Iterator(t *testing.T) {
a1 := garray.New(true)
a2 := garray.New(true)
s.Iterator(func(v interface{}) bool {
s.Iterator(func(v any) bool {
a1.Append(1)
return false
})
s.Iterator(func(v interface{}) bool {
s.Iterator(func(v any) bool {
a2.Append(1)
return true
})
@ -125,12 +125,12 @@ func TestSet_LockFunc(t *testing.T) {
s := gset.NewSet()
s.Add(1, 2, 3)
t.Assert(s.Size(), 3)
s.LockFunc(func(m map[interface{}]struct{}) {
s.LockFunc(func(m map[any]struct{}) {
delete(m, 1)
})
t.Assert(s.Size(), 2)
s.RLockFunc(func(m map[interface{}]struct{}) {
t.Assert(m, map[interface{}]struct{}{
s.RLockFunc(func(m map[any]struct{}) {
t.Assert(m, map[any]struct{}{
3: {},
2: {},
})
@ -352,7 +352,7 @@ func TestSet_Pops(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
s := gset.New(true)
a := []interface{}{1, 2, 3, 4}
a := []any{1, 2, 3, 4}
s.Add(a...)
t.Assert(s.Size(), 4)
t.Assert(s.Pops(-2), nil)
@ -362,7 +362,7 @@ func TestSet_Pops(t *testing.T) {
func TestSet_Json(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
s1 := []interface{}{"a", "b", "d", "c"}
s1 := []any{"a", "b", "d", "c"}
a1 := gset.NewFrom(s1)
b1, err1 := json.Marshal(a1)
b2, err2 := json.Marshal(s1)
@ -442,7 +442,7 @@ func TestSet_Walk(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var set gset.Set
set.Add(g.Slice{1, 2}...)
set.Walk(func(item interface{}) interface{} {
set.Walk(func(item any) any {
return gconv.Int(item) + 10
})
t.Assert(set.Size(), 2)

View File

@ -14,77 +14,77 @@ import "github.com/gogf/gf/v2/container/gvar"
// iTree defines the interface for basic operations of a tree.
type iTree interface {
// Set sets key-value pair into the tree.
Set(key interface{}, value interface{})
Set(key any, value any)
// Sets batch sets key-values to the tree.
Sets(data map[interface{}]interface{})
Sets(data map[any]any)
// SetIfNotExist sets `value` to the map if the `key` does not exist, and then returns true.
// It returns false if `key` exists, and such setting key-value pair operation would be ignored.
SetIfNotExist(key interface{}, value interface{}) bool
SetIfNotExist(key any, value any) bool
// SetIfNotExistFunc sets value with return value of callback function `f`, and then returns true.
// It returns false if `key` exists, and such setting key-value pair operation would be ignored.
SetIfNotExistFunc(key interface{}, f func() interface{}) bool
SetIfNotExistFunc(key any, f func() any) bool
// SetIfNotExistFuncLock sets value with return value of callback function `f`, and then returns true.
// It returns false if `key` exists, and such setting key-value pair operation would be ignored.
//
// SetIfNotExistFuncLock differs with SetIfNotExistFunc function is that
// it executes function `f` within mutex.Lock of the hash map.
SetIfNotExistFuncLock(key interface{}, f func() interface{}) bool
SetIfNotExistFuncLock(key any, f func() any) bool
// Get searches the `key` in the tree and returns its associated `value` or nil if key is not found in tree.
//
// Note that, the `nil` value from Get function cannot be used to determine key existence, please use Contains
// function to do so.
Get(key interface{}) (value interface{})
Get(key any) (value any)
// GetOrSet returns its `value` of `key`, or sets value with given `value` if it does not exist and then returns
// this value.
GetOrSet(key interface{}, value interface{}) interface{}
GetOrSet(key any, value any) any
// GetOrSetFunc returns its `value` of `key`, or sets value with returned value of callback function `f` if it does
// not exist and then returns this value.
GetOrSetFunc(key interface{}, f func() interface{}) interface{}
GetOrSetFunc(key any, f func() any) any
// GetOrSetFuncLock returns its `value` of `key`, or sets value with returned value of callback function `f` if it
// does not exist and then returns this value.
//
// GetOrSetFuncLock differs with GetOrSetFunc function is that it executes function `f` within mutex.Lock of the
// hash map.
GetOrSetFuncLock(key interface{}, f func() interface{}) interface{}
GetOrSetFuncLock(key any, f func() any) any
// GetVar returns a gvar.Var with the value by given `key`.
// Note that, the returned gvar.Var is un-concurrent safe.
//
// Also see function Get.
GetVar(key interface{}) *gvar.Var
GetVar(key any) *gvar.Var
// GetVarOrSet returns a gvar.Var with result from GetVarOrSet.
// Note that, the returned gvar.Var is un-concurrent safe.
//
// Also see function GetOrSet.
GetVarOrSet(key interface{}, value interface{}) *gvar.Var
GetVarOrSet(key any, value any) *gvar.Var
// GetVarOrSetFunc returns a gvar.Var with result from GetOrSetFunc.
// Note that, the returned gvar.Var is un-concurrent safe.
//
// Also see function GetOrSetFunc.
GetVarOrSetFunc(key interface{}, f func() interface{}) *gvar.Var
GetVarOrSetFunc(key any, f func() any) *gvar.Var
// GetVarOrSetFuncLock returns a gvar.Var with result from GetOrSetFuncLock.
// Note that, the returned gvar.Var is un-concurrent safe.
//
// Also see function GetOrSetFuncLock.
GetVarOrSetFuncLock(key interface{}, f func() interface{}) *gvar.Var
GetVarOrSetFuncLock(key any, f func() any) *gvar.Var
// Search searches the tree with given `key`.
// Second return parameter `found` is true if key was found, otherwise false.
Search(key interface{}) (value interface{}, found bool)
Search(key any) (value any, found bool)
// Contains checks and returns whether given `key` exists in the tree.
Contains(key interface{}) bool
Contains(key any) bool
// Size returns number of nodes in the tree.
Size() int
@ -94,22 +94,22 @@ type iTree interface {
// Remove removes the node from the tree by `key`, and returns its associated value of `key`.
// The given `key` should adhere to the comparator's type assertion, otherwise method panics.
Remove(key interface{}) (value interface{})
Remove(key any) (value any)
// Removes batch deletes key-value pairs from the tree by `keys`.
Removes(keys []interface{})
Removes(keys []any)
// Clear removes all nodes from the tree.
Clear()
// Keys returns all keys from the tree in order by its comparator.
Keys() []interface{}
Keys() []any
// Values returns all values from the true in order by its comparator based on the key.
Values() []interface{}
Values() []any
// Replace clears the data of the tree and sets the nodes by given `data`.
Replace(data map[interface{}]interface{})
Replace(data map[any]any)
// Print prints the tree to stdout.
Print()
@ -121,24 +121,24 @@ type iTree interface {
MarshalJSON() (jsonBytes []byte, err error)
// Map returns all key-value pairs as map.
Map() map[interface{}]interface{}
Map() map[any]any
// MapStrAny returns all key-value items as map[string]any.
MapStrAny() map[string]interface{}
MapStrAny() map[string]any
// Iterator is alias of IteratorAsc.
//
// Also see IteratorAsc.
Iterator(f func(key, value interface{}) bool)
Iterator(f func(key, value any) bool)
// IteratorFrom is alias of IteratorAscFrom.
//
// Also see IteratorAscFrom.
IteratorFrom(key interface{}, match bool, f func(key, value interface{}) bool)
IteratorFrom(key any, match bool, f func(key, value any) bool)
// IteratorAsc iterates the tree readonly in ascending order with given callback function `f`.
// If callback function `f` returns true, then it continues iterating; or false to stop.
IteratorAsc(f func(key, value interface{}) bool)
IteratorAsc(f func(key, value any) bool)
// IteratorAscFrom iterates the tree readonly in ascending order with given callback function `f`.
//
@ -146,12 +146,12 @@ type iTree interface {
// The parameter `match` specifies whether starting iterating only if the `key` is fully matched, or else using
// index searching iterating.
// If callback function `f` returns true, then it continues iterating; or false to stop.
IteratorAscFrom(key interface{}, match bool, f func(key, value interface{}) bool)
IteratorAscFrom(key any, match bool, f func(key, value any) bool)
// IteratorDesc iterates the tree readonly in descending order with given callback function `f`.
//
// If callback function `f` returns true, then it continues iterating; or false to stop.
IteratorDesc(f func(key, value interface{}) bool)
IteratorDesc(f func(key, value any) bool)
// IteratorDescFrom iterates the tree readonly in descending order with given callback function `f`.
//
@ -159,7 +159,7 @@ type iTree interface {
// The parameter `match` specifies whether starting iterating only if the `key` is fully matched, or else using
// index searching iterating.
// If callback function `f` returns true, then it continues iterating; or false to stop.
IteratorDescFrom(key interface{}, match bool, f func(key, value interface{}) bool)
IteratorDescFrom(key any, match bool, f func(key, value any) bool)
}
// iteratorFromGetIndex returns the index of the key in the keys slice.

View File

@ -20,7 +20,7 @@ func Test_AVLTree_Basic(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gtree.NewAVLTree(gutil.ComparatorString)
m.Set("key1", "val1")
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -40,20 +40,20 @@ func Test_AVLTree_Basic(t *testing.T) {
t.AssertIN("val3", m.Values())
t.AssertIN("val1", m.Values())
m.Sets(map[interface{}]interface{}{"key3": "val3", "key1": "val1"})
m.Sets(map[any]any{"key3": "val3", "key1": "val1"})
m.Flip()
t.Assert(m.Map(), map[interface{}]interface{}{"val3": "key3", "val1": "key1"})
t.Assert(m.Map(), map[any]any{"val3": "key3", "val1": "key1"})
m.Flip(gutil.ComparatorString)
t.Assert(m.Map(), map[interface{}]interface{}{"key3": "val3", "key1": "val1"})
t.Assert(m.Map(), map[any]any{"key3": "val3", "key1": "val1"})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gtree.NewAVLTreeFrom(gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[interface{}]interface{}{1: 1, "key1": "val1"})
m2 := gtree.NewAVLTreeFrom(gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[any]any{1: 1, "key1": "val1"})
})
}
@ -102,10 +102,10 @@ func Test_AVLTree_Get_Set_Var(t *testing.T) {
func Test_AVLTree_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gtree.NewAVLTree(gutil.ComparatorString)
m.Sets(map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]interface{}{"key1", 1})
t.Assert(m.Map(), map[interface{}]interface{}{"key2": "val2", "key3": "val3"})
m.Sets(map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]any{"key1", 1})
t.Assert(m.Map(), map[any]any{"key2": "val2", "key3": "val3"})
})
}
@ -115,19 +115,19 @@ func Test_AVLTree_Iterator(t *testing.T) {
keyLen := len(keys)
index := 0
expect := map[interface{}]interface{}{"key4": "val4", 1: 1, "key1": "val1", "key2": "val2", "key3": "val3"}
expect := map[any]any{"key4": "val4", 1: 1, "key1": "val1", "key2": "val2", "key3": "val3"}
m := gtree.NewAVLTreeFrom(gutil.ComparatorString, expect)
gtest.C(t, func(t *gtest.T) {
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
t.Assert(k, keys[index])
index++
t.Assert(expect[k], v)
return true
})
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
index--
t.Assert(k, keys[index])
t.Assert(expect[k], v)
@ -140,11 +140,11 @@ func Test_AVLTree_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
i := 0
j := 0
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
i++
return true
})
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
j++
return false
})
@ -155,11 +155,11 @@ func Test_AVLTree_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
i := 0
j := 0
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
i++
return true
})
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
j++
return false
})
@ -170,7 +170,7 @@ func Test_AVLTree_Iterator(t *testing.T) {
}
func Test_AVLTree_IteratorFrom(t *testing.T) {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 10; i++ {
m[i] = i * 10
}
@ -178,7 +178,7 @@ func Test_AVLTree_IteratorFrom(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
n := 5
tree.IteratorFrom(5, true, func(key, value interface{}) bool {
tree.IteratorFrom(5, true, func(key, value any) bool {
t.Assert(n, key)
t.Assert(n*10, value)
n++
@ -186,7 +186,7 @@ func Test_AVLTree_IteratorFrom(t *testing.T) {
})
i := 5
tree.IteratorAscFrom(5, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(5, true, func(key, value any) bool {
t.Assert(i, key)
t.Assert(i*10, value)
i++
@ -194,7 +194,7 @@ func Test_AVLTree_IteratorFrom(t *testing.T) {
})
j := 5
tree.IteratorDescFrom(5, true, func(key, value interface{}) bool {
tree.IteratorDescFrom(5, true, func(key, value any) bool {
t.Assert(j, key)
t.Assert(j*10, value)
j--
@ -206,7 +206,7 @@ func Test_AVLTree_IteratorFrom(t *testing.T) {
func Test_AVLTree_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
//clone 方法是深克隆
m := gtree.NewAVLTreeFrom(gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
m := gtree.NewAVLTreeFrom(gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
m_clone := m.Clone()
m.Remove(1)
//修改原 map,clone 后的 map 不影响
@ -219,7 +219,7 @@ func Test_AVLTree_Clone(t *testing.T) {
}
func Test_AVLTree_LRNode(t *testing.T) {
expect := map[interface{}]interface{}{"key4": "val4", "key1": "val1", "key2": "val2", "key3": "val3"}
expect := map[any]any{"key4": "val4", "key1": "val1", "key2": "val2", "key3": "val3"}
//safe
gtest.C(t, func(t *gtest.T) {
m := gtree.NewAVLTreeFrom(gutil.ComparatorString, expect)
@ -235,7 +235,7 @@ func Test_AVLTree_LRNode(t *testing.T) {
}
func Test_AVLTree_CeilingFloor(t *testing.T) {
expect := map[interface{}]interface{}{
expect := map[any]any{
20: "val20",
6: "val6",
10: "val10",

View File

@ -23,7 +23,7 @@ func Test_BTree_Basic(t *testing.T) {
t.Assert(m.Height(), 1)
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -46,8 +46,8 @@ func Test_BTree_Basic(t *testing.T) {
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gtree.NewBTreeFrom(3, gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[interface{}]interface{}{1: 1, "key1": "val1"})
m2 := gtree.NewBTreeFrom(3, gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[any]any{1: 1, "key1": "val1"})
})
}
@ -96,10 +96,10 @@ func Test_BTree_Get_Set_Var(t *testing.T) {
func Test_BTree_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gtree.NewBTree(3, gutil.ComparatorString)
m.Sets(map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]interface{}{"key1", 1})
t.Assert(m.Map(), map[interface{}]interface{}{"key2": "val2", "key3": "val3"})
m.Sets(map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]any{"key1", 1})
t.Assert(m.Map(), map[any]any{"key2": "val2", "key3": "val3"})
})
}
@ -108,19 +108,19 @@ func Test_BTree_Iterator(t *testing.T) {
keyLen := len(keys)
index := 0
expect := map[interface{}]interface{}{"key4": "val4", 1: 1, "key1": "val1", "key2": "val2", "key3": "val3"}
expect := map[any]any{"key4": "val4", 1: 1, "key1": "val1", "key2": "val2", "key3": "val3"}
m := gtree.NewBTreeFrom(3, gutil.ComparatorString, expect)
gtest.C(t, func(t *gtest.T) {
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
t.Assert(k, keys[index])
index++
t.Assert(expect[k], v)
return true
})
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
index--
t.Assert(k, keys[index])
t.Assert(expect[k], v)
@ -133,11 +133,11 @@ func Test_BTree_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
i := 0
j := 0
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
i++
return true
})
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
j++
return false
})
@ -148,11 +148,11 @@ func Test_BTree_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
i := 0
j := 0
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
i++
return true
})
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
j++
return false
})
@ -162,7 +162,7 @@ func Test_BTree_Iterator(t *testing.T) {
}
func Test_BTree_IteratorFrom(t *testing.T) {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 10; i++ {
m[i] = i * 10
}
@ -170,7 +170,7 @@ func Test_BTree_IteratorFrom(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
n := 5
tree.IteratorFrom(5, true, func(key, value interface{}) bool {
tree.IteratorFrom(5, true, func(key, value any) bool {
t.Assert(n, key)
t.Assert(n*10, value)
n++
@ -178,7 +178,7 @@ func Test_BTree_IteratorFrom(t *testing.T) {
})
i := 5
tree.IteratorAscFrom(5, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(5, true, func(key, value any) bool {
t.Assert(i, key)
t.Assert(i*10, value)
i++
@ -186,7 +186,7 @@ func Test_BTree_IteratorFrom(t *testing.T) {
})
j := 5
tree.IteratorDescFrom(5, true, func(key, value interface{}) bool {
tree.IteratorDescFrom(5, true, func(key, value any) bool {
t.Assert(j, key)
t.Assert(j*10, value)
j--
@ -198,7 +198,7 @@ func Test_BTree_IteratorFrom(t *testing.T) {
func Test_BTree_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
//clone 方法是深克隆
m := gtree.NewBTreeFrom(3, gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
m := gtree.NewBTreeFrom(3, gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
m_clone := m.Clone()
m.Remove(1)
//修改原 map,clone 后的 map 不影响
@ -211,7 +211,7 @@ func Test_BTree_Clone(t *testing.T) {
}
func Test_BTree_LRNode(t *testing.T) {
expect := map[interface{}]interface{}{"key4": "val4", "key1": "val1", "key2": "val2", "key3": "val3"}
expect := map[any]any{"key4": "val4", "key1": "val1", "key2": "val2", "key3": "val3"}
//safe
gtest.C(t, func(t *gtest.T) {
m := gtree.NewBTreeFrom(3, gutil.ComparatorString, expect)

View File

@ -48,7 +48,7 @@ func ExampleAVLTree_Set() {
func ExampleAVLTree_Sets() {
tree := gtree.NewAVLTree(gutil.ComparatorString)
tree.Sets(map[interface{}]interface{}{
tree.Sets(map[any]any{
"key1": "val1",
"key2": "val2",
})
@ -95,10 +95,10 @@ func ExampleAVLTree_GetOrSetFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetOrSetFunc("key1", func() interface{} {
fmt.Println(tree.GetOrSetFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetOrSetFunc("key6", func() interface{} {
fmt.Println(tree.GetOrSetFunc("key6", func() any {
return "val6"
}))
@ -113,10 +113,10 @@ func ExampleAVLTree_GetOrSetFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetOrSetFuncLock("key1", func() interface{} {
fmt.Println(tree.GetOrSetFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetOrSetFuncLock("key6", func() interface{} {
fmt.Println(tree.GetOrSetFuncLock("key6", func() any {
return "val6"
}))
@ -157,10 +157,10 @@ func ExampleAVLTree_GetVarOrSetFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetVarOrSetFunc("key1", func() interface{} {
fmt.Println(tree.GetVarOrSetFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetVarOrSetFunc("key6", func() interface{} {
fmt.Println(tree.GetVarOrSetFunc("key6", func() any {
return "val6"
}))
@ -175,10 +175,10 @@ func ExampleAVLTree_GetVarOrSetFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetVarOrSetFuncLock("key1", func() interface{} {
fmt.Println(tree.GetVarOrSetFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetVarOrSetFuncLock("key6", func() interface{} {
fmt.Println(tree.GetVarOrSetFuncLock("key6", func() any {
return "val6"
}))
@ -207,10 +207,10 @@ func ExampleAVLTree_SetIfNotExistFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.SetIfNotExistFunc("key1", func() interface{} {
fmt.Println(tree.SetIfNotExistFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.SetIfNotExistFunc("key6", func() interface{} {
fmt.Println(tree.SetIfNotExistFunc("key6", func() any {
return "val6"
}))
@ -225,10 +225,10 @@ func ExampleAVLTree_SetIfNotExistFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.SetIfNotExistFuncLock("key1", func() interface{} {
fmt.Println(tree.SetIfNotExistFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.SetIfNotExistFuncLock("key6", func() interface{} {
fmt.Println(tree.SetIfNotExistFuncLock("key6", func() any {
return "val6"
}))
@ -273,7 +273,7 @@ func ExampleAVLTree_Removes() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
removeKeys := make([]interface{}, 2)
removeKeys := make([]any, 2)
removeKeys = append(removeKeys, "key1")
removeKeys = append(removeKeys, "key6")
@ -405,7 +405,7 @@ func ExampleAVLTree_Replace() {
fmt.Println(tree.Map())
data := map[interface{}]interface{}{
data := map[any]any{
"newKey0": "newVal0",
"newKey1": "newVal1",
"newKey2": "newVal2",
@ -573,7 +573,7 @@ func ExampleAVLTree_Iterator() {
}
var totalKey, totalValue int
tree.Iterator(func(key, value interface{}) bool {
tree.Iterator(func(key, value any) bool {
totalKey += key.(int)
totalValue += value.(int)
@ -589,13 +589,13 @@ func ExampleAVLTree_Iterator() {
}
func ExampleAVLTree_IteratorFrom() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewAVLTreeFrom(gutil.ComparatorInt, m)
tree.IteratorFrom(1, true, func(key, value interface{}) bool {
tree.IteratorFrom(1, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -614,7 +614,7 @@ func ExampleAVLTree_IteratorAsc() {
tree.Set(i, 10-i)
}
tree.IteratorAsc(func(key, value interface{}) bool {
tree.IteratorAsc(func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -633,13 +633,13 @@ func ExampleAVLTree_IteratorAsc() {
}
func ExampleAVLTree_IteratorAscFrom_normal() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewAVLTreeFrom(gutil.ComparatorInt, m)
tree.IteratorAscFrom(1, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(1, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -653,13 +653,13 @@ func ExampleAVLTree_IteratorAscFrom_normal() {
}
func ExampleAVLTree_IteratorAscFrom_noExistKey() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewAVLTreeFrom(gutil.ComparatorInt, m)
tree.IteratorAscFrom(0, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(0, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -668,13 +668,13 @@ func ExampleAVLTree_IteratorAscFrom_noExistKey() {
}
func ExampleAVLTree_IteratorAscFrom_noExistKeyAndMatchFalse() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewAVLTreeFrom(gutil.ComparatorInt, m)
tree.IteratorAscFrom(6, false, func(key, value interface{}) bool {
tree.IteratorAscFrom(6, false, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -688,7 +688,7 @@ func ExampleAVLTree_IteratorDesc() {
tree.Set(i, 10-i)
}
tree.IteratorDesc(func(key, value interface{}) bool {
tree.IteratorDesc(func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -707,13 +707,13 @@ func ExampleAVLTree_IteratorDesc() {
}
func ExampleAVLTree_IteratorDescFrom() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewAVLTreeFrom(gutil.ComparatorInt, m)
tree.IteratorDescFrom(5, true, func(key, value interface{}) bool {
tree.IteratorDescFrom(5, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})

View File

@ -48,7 +48,7 @@ func ExampleBTree_Set() {
func ExampleBTree_Sets() {
tree := gtree.NewBTree(3, gutil.ComparatorString)
tree.Sets(map[interface{}]interface{}{
tree.Sets(map[any]any{
"key1": "val1",
"key2": "val2",
})
@ -95,10 +95,10 @@ func ExampleBTree_GetOrSetFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetOrSetFunc("key1", func() interface{} {
fmt.Println(tree.GetOrSetFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetOrSetFunc("key6", func() interface{} {
fmt.Println(tree.GetOrSetFunc("key6", func() any {
return "val6"
}))
@ -113,10 +113,10 @@ func ExampleBTree_GetOrSetFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetOrSetFuncLock("key1", func() interface{} {
fmt.Println(tree.GetOrSetFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetOrSetFuncLock("key6", func() interface{} {
fmt.Println(tree.GetOrSetFuncLock("key6", func() any {
return "val6"
}))
@ -157,10 +157,10 @@ func ExampleBTree_GetVarOrSetFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetVarOrSetFunc("key1", func() interface{} {
fmt.Println(tree.GetVarOrSetFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetVarOrSetFunc("key6", func() interface{} {
fmt.Println(tree.GetVarOrSetFunc("key6", func() any {
return "val6"
}))
@ -175,10 +175,10 @@ func ExampleBTree_GetVarOrSetFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetVarOrSetFuncLock("key1", func() interface{} {
fmt.Println(tree.GetVarOrSetFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetVarOrSetFuncLock("key6", func() interface{} {
fmt.Println(tree.GetVarOrSetFuncLock("key6", func() any {
return "val6"
}))
@ -207,10 +207,10 @@ func ExampleBTree_SetIfNotExistFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.SetIfNotExistFunc("key1", func() interface{} {
fmt.Println(tree.SetIfNotExistFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.SetIfNotExistFunc("key6", func() interface{} {
fmt.Println(tree.SetIfNotExistFunc("key6", func() any {
return "val6"
}))
@ -225,10 +225,10 @@ func ExampleBTree_SetIfNotExistFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.SetIfNotExistFuncLock("key1", func() interface{} {
fmt.Println(tree.SetIfNotExistFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.SetIfNotExistFuncLock("key6", func() interface{} {
fmt.Println(tree.SetIfNotExistFuncLock("key6", func() any {
return "val6"
}))
@ -273,7 +273,7 @@ func ExampleBTree_Removes() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
removeKeys := make([]interface{}, 2)
removeKeys := make([]any, 2)
removeKeys = append(removeKeys, "key1")
removeKeys = append(removeKeys, "key6")
@ -388,7 +388,7 @@ func ExampleBTree_Replace() {
fmt.Println(tree.Map())
data := map[interface{}]interface{}{
data := map[any]any{
"newKey0": "newVal0",
"newKey1": "newVal1",
"newKey2": "newVal2",
@ -499,7 +499,7 @@ func ExampleBTree_Iterator() {
}
var totalKey, totalValue int
tree.Iterator(func(key, value interface{}) bool {
tree.Iterator(func(key, value any) bool {
totalKey += key.(int)
totalValue += value.(int)
@ -515,13 +515,13 @@ func ExampleBTree_Iterator() {
}
func ExampleBTree_IteratorFrom() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewBTreeFrom(3, gutil.ComparatorInt, m)
tree.IteratorFrom(1, true, func(key, value interface{}) bool {
tree.IteratorFrom(1, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -540,7 +540,7 @@ func ExampleBTree_IteratorAsc() {
tree.Set(i, 10-i)
}
tree.IteratorAsc(func(key, value interface{}) bool {
tree.IteratorAsc(func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -559,13 +559,13 @@ func ExampleBTree_IteratorAsc() {
}
func ExampleBTree_IteratorAscFrom_normal() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewBTreeFrom(3, gutil.ComparatorInt, m)
tree.IteratorAscFrom(1, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(1, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -579,13 +579,13 @@ func ExampleBTree_IteratorAscFrom_normal() {
}
func ExampleBTree_IteratorAscFrom_noExistKey() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewBTreeFrom(3, gutil.ComparatorInt, m)
tree.IteratorAscFrom(0, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(0, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -594,13 +594,13 @@ func ExampleBTree_IteratorAscFrom_noExistKey() {
}
func ExampleBTree_IteratorAscFrom_noExistKeyAndMatchFalse() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewBTreeFrom(3, gutil.ComparatorInt, m)
tree.IteratorAscFrom(0, false, func(key, value interface{}) bool {
tree.IteratorAscFrom(0, false, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -619,7 +619,7 @@ func ExampleBTree_IteratorDesc() {
tree.Set(i, 10-i)
}
tree.IteratorDesc(func(key, value interface{}) bool {
tree.IteratorDesc(func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -638,13 +638,13 @@ func ExampleBTree_IteratorDesc() {
}
func ExampleBTree_IteratorDescFrom() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewBTreeFrom(3, gutil.ComparatorInt, m)
tree.IteratorDescFrom(5, true, func(key, value interface{}) bool {
tree.IteratorDescFrom(5, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})

View File

@ -63,7 +63,7 @@ func ExampleRedBlackTree_Set() {
func ExampleRedBlackTree_Sets() {
tree := gtree.NewRedBlackTree(gutil.ComparatorString)
tree.Sets(map[interface{}]interface{}{
tree.Sets(map[any]any{
"key1": "val1",
"key2": "val2",
})
@ -110,10 +110,10 @@ func ExampleRedBlackTree_GetOrSetFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetOrSetFunc("key1", func() interface{} {
fmt.Println(tree.GetOrSetFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetOrSetFunc("key6", func() interface{} {
fmt.Println(tree.GetOrSetFunc("key6", func() any {
return "val6"
}))
@ -128,10 +128,10 @@ func ExampleRedBlackTree_GetOrSetFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetOrSetFuncLock("key1", func() interface{} {
fmt.Println(tree.GetOrSetFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetOrSetFuncLock("key6", func() interface{} {
fmt.Println(tree.GetOrSetFuncLock("key6", func() any {
return "val6"
}))
@ -172,10 +172,10 @@ func ExampleRedBlackTree_GetVarOrSetFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetVarOrSetFunc("key1", func() interface{} {
fmt.Println(tree.GetVarOrSetFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetVarOrSetFunc("key6", func() interface{} {
fmt.Println(tree.GetVarOrSetFunc("key6", func() any {
return "val6"
}))
@ -190,10 +190,10 @@ func ExampleRedBlackTree_GetVarOrSetFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.GetVarOrSetFuncLock("key1", func() interface{} {
fmt.Println(tree.GetVarOrSetFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.GetVarOrSetFuncLock("key6", func() interface{} {
fmt.Println(tree.GetVarOrSetFuncLock("key6", func() any {
return "val6"
}))
@ -222,10 +222,10 @@ func ExampleRedBlackTree_SetIfNotExistFunc() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.SetIfNotExistFunc("key1", func() interface{} {
fmt.Println(tree.SetIfNotExistFunc("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.SetIfNotExistFunc("key6", func() interface{} {
fmt.Println(tree.SetIfNotExistFunc("key6", func() any {
return "val6"
}))
@ -240,10 +240,10 @@ func ExampleRedBlackTree_SetIfNotExistFuncLock() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
fmt.Println(tree.SetIfNotExistFuncLock("key1", func() interface{} {
fmt.Println(tree.SetIfNotExistFuncLock("key1", func() any {
return "newVal1"
}))
fmt.Println(tree.SetIfNotExistFuncLock("key6", func() interface{} {
fmt.Println(tree.SetIfNotExistFuncLock("key6", func() any {
return "val6"
}))
@ -288,7 +288,7 @@ func ExampleRedBlackTree_Removes() {
tree.Set("key"+gconv.String(i), "val"+gconv.String(i))
}
removeKeys := make([]interface{}, 2)
removeKeys := make([]any, 2)
removeKeys = append(removeKeys, "key1")
removeKeys = append(removeKeys, "key6")
@ -485,7 +485,7 @@ func ExampleRedBlackTree_Iterator() {
}
var totalKey, totalValue int
tree.Iterator(func(key, value interface{}) bool {
tree.Iterator(func(key, value any) bool {
totalKey += key.(int)
totalValue += value.(int)
@ -501,13 +501,13 @@ func ExampleRedBlackTree_Iterator() {
}
func ExampleRedBlackTree_IteratorFrom() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewRedBlackTreeFrom(gutil.ComparatorInt, m)
tree.IteratorFrom(1, true, func(key, value interface{}) bool {
tree.IteratorFrom(1, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -526,7 +526,7 @@ func ExampleRedBlackTree_IteratorAsc() {
tree.Set(i, 10-i)
}
tree.IteratorAsc(func(key, value interface{}) bool {
tree.IteratorAsc(func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -545,13 +545,13 @@ func ExampleRedBlackTree_IteratorAsc() {
}
func ExampleRedBlackTree_IteratorAscFrom_normal() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewRedBlackTreeFrom(gutil.ComparatorInt, m)
tree.IteratorAscFrom(1, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(1, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -565,13 +565,13 @@ func ExampleRedBlackTree_IteratorAscFrom_normal() {
}
func ExampleRedBlackTree_IteratorAscFrom_noExistKey() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewRedBlackTreeFrom(gutil.ComparatorInt, m)
tree.IteratorAscFrom(0, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(0, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -580,13 +580,13 @@ func ExampleRedBlackTree_IteratorAscFrom_noExistKey() {
}
func ExampleRedBlackTree_IteratorAscFrom_noExistKeyAndMatchFalse() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewRedBlackTreeFrom(gutil.ComparatorInt, m)
tree.IteratorAscFrom(0, false, func(key, value interface{}) bool {
tree.IteratorAscFrom(0, false, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -605,7 +605,7 @@ func ExampleRedBlackTree_IteratorDesc() {
tree.Set(i, 10-i)
}
tree.IteratorDesc(func(key, value interface{}) bool {
tree.IteratorDesc(func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -624,13 +624,13 @@ func ExampleRedBlackTree_IteratorDesc() {
}
func ExampleRedBlackTree_IteratorDescFrom() {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 5; i++ {
m[i] = i * 10
}
tree := gtree.NewRedBlackTreeFrom(gutil.ComparatorInt, m)
tree.IteratorDescFrom(5, true, func(key, value interface{}) bool {
tree.IteratorDescFrom(5, true, func(key, value any) bool {
fmt.Println("key:", key, ", value:", value)
return true
})
@ -666,7 +666,7 @@ func ExampleRedBlackTree_Replace() {
fmt.Println(tree.Map())
data := map[interface{}]interface{}{
data := map[any]any{
"newKey0": "newVal0",
"newKey1": "newVal1",
"newKey2": "newVal2",

View File

@ -16,7 +16,7 @@ import (
"github.com/gogf/gf/v2/util/gutil"
)
func getValue() interface{} {
func getValue() any {
return 3
}
@ -24,7 +24,7 @@ func Test_RedBlackTree_Basic(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gtree.NewRedBlackTree(gutil.ComparatorString)
m.Set("key1", "val1")
t.Assert(m.Keys(), []interface{}{"key1"})
t.Assert(m.Keys(), []any{"key1"})
t.Assert(m.Get("key1"), "val1")
t.Assert(m.Size(), 1)
@ -44,20 +44,20 @@ func Test_RedBlackTree_Basic(t *testing.T) {
t.AssertIN("val3", m.Values())
t.AssertIN("val1", m.Values())
m.Sets(map[interface{}]interface{}{"key3": "val3", "key1": "val1"})
m.Sets(map[any]any{"key3": "val3", "key1": "val1"})
m.Flip()
t.Assert(m.Map(), map[interface{}]interface{}{"val3": "key3", "val1": "key1"})
t.Assert(m.Map(), map[any]any{"val3": "key3", "val1": "key1"})
m.Flip(gutil.ComparatorString)
t.Assert(m.Map(), map[interface{}]interface{}{"key3": "val3", "key1": "val1"})
t.Assert(m.Map(), map[any]any{"key3": "val3", "key1": "val1"})
m.Clear()
t.Assert(m.Size(), 0)
t.Assert(m.IsEmpty(), true)
m2 := gtree.NewRedBlackTreeFrom(gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[interface{}]interface{}{1: 1, "key1": "val1"})
m2 := gtree.NewRedBlackTreeFrom(gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
t.Assert(m2.Map(), map[any]any{1: 1, "key1": "val1"})
})
}
@ -106,10 +106,10 @@ func Test_RedBlackTree_Get_Set_Var(t *testing.T) {
func Test_RedBlackTree_Batch(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
m := gtree.NewRedBlackTree(gutil.ComparatorString)
m.Sets(map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[interface{}]interface{}{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]interface{}{"key1", 1})
t.Assert(m.Map(), map[interface{}]interface{}{"key2": "val2", "key3": "val3"})
m.Sets(map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
t.Assert(m.Map(), map[any]any{1: 1, "key1": "val1", "key2": "val2", "key3": "val3"})
m.Removes([]any{"key1", 1})
t.Assert(m.Map(), map[any]any{"key2": "val2", "key3": "val3"})
})
}
@ -118,19 +118,19 @@ func Test_RedBlackTree_Iterator(t *testing.T) {
keyLen := len(keys)
index := 0
expect := map[interface{}]interface{}{"key4": "val4", 1: 1, "key1": "val1", "key2": "val2", "key3": "val3"}
expect := map[any]any{"key4": "val4", 1: 1, "key1": "val1", "key2": "val2", "key3": "val3"}
m := gtree.NewRedBlackTreeFrom(gutil.ComparatorString, expect)
gtest.C(t, func(t *gtest.T) {
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
t.Assert(k, keys[index])
index++
t.Assert(expect[k], v)
return true
})
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
index--
t.Assert(k, keys[index])
t.Assert(expect[k], v)
@ -142,11 +142,11 @@ func Test_RedBlackTree_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
i := 0
j := 0
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
i++
return true
})
m.Iterator(func(k interface{}, v interface{}) bool {
m.Iterator(func(k any, v any) bool {
j++
return false
})
@ -157,11 +157,11 @@ func Test_RedBlackTree_Iterator(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
i := 0
j := 0
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
i++
return true
})
m.IteratorDesc(func(k interface{}, v interface{}) bool {
m.IteratorDesc(func(k any, v any) bool {
j++
return false
})
@ -171,7 +171,7 @@ func Test_RedBlackTree_Iterator(t *testing.T) {
}
func Test_RedBlackTree_IteratorFrom(t *testing.T) {
m := make(map[interface{}]interface{})
m := make(map[any]any)
for i := 1; i <= 10; i++ {
m[i] = i * 10
}
@ -179,7 +179,7 @@ func Test_RedBlackTree_IteratorFrom(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
n := 5
tree.IteratorFrom(5, true, func(key, value interface{}) bool {
tree.IteratorFrom(5, true, func(key, value any) bool {
t.Assert(n, key)
t.Assert(n*10, value)
n++
@ -187,7 +187,7 @@ func Test_RedBlackTree_IteratorFrom(t *testing.T) {
})
i := 5
tree.IteratorAscFrom(5, true, func(key, value interface{}) bool {
tree.IteratorAscFrom(5, true, func(key, value any) bool {
t.Assert(i, key)
t.Assert(i*10, value)
i++
@ -195,7 +195,7 @@ func Test_RedBlackTree_IteratorFrom(t *testing.T) {
})
j := 5
tree.IteratorDescFrom(5, true, func(key, value interface{}) bool {
tree.IteratorDescFrom(5, true, func(key, value any) bool {
t.Assert(j, key)
t.Assert(j*10, value)
j--
@ -207,7 +207,7 @@ func Test_RedBlackTree_IteratorFrom(t *testing.T) {
func Test_RedBlackTree_Clone(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
//clone 方法是深克隆
m := gtree.NewRedBlackTreeFrom(gutil.ComparatorString, map[interface{}]interface{}{1: 1, "key1": "val1"})
m := gtree.NewRedBlackTreeFrom(gutil.ComparatorString, map[any]any{1: 1, "key1": "val1"})
m_clone := m.Clone()
m.Remove(1)
//修改原 map,clone 后的 map 不影响
@ -220,7 +220,7 @@ func Test_RedBlackTree_Clone(t *testing.T) {
}
func Test_RedBlackTree_LRNode(t *testing.T) {
expect := map[interface{}]interface{}{"key4": "val4", "key1": "val1", "key2": "val2", "key3": "val3"}
expect := map[any]any{"key4": "val4", "key1": "val1", "key2": "val2", "key3": "val3"}
//safe
gtest.C(t, func(t *gtest.T) {
m := gtree.NewRedBlackTreeFrom(gutil.ComparatorString, expect)
@ -236,7 +236,7 @@ func Test_RedBlackTree_LRNode(t *testing.T) {
}
func Test_RedBlackTree_CeilingFloor(t *testing.T) {
expect := map[interface{}]interface{}{
expect := map[any]any{
20: "val20",
6: "val6",
10: "val10",

View File

@ -9,6 +9,6 @@ package gtype
// New is alias of NewAny.
// See NewAny, NewInterface.
func New(value ...interface{}) *Any {
func New(value ...any) *Any {
return NewAny(value...)
}

View File

@ -92,13 +92,13 @@ func (v *Bool) UnmarshalJSON(b []byte) error {
}
// UnmarshalValue is an interface implement which sets any type of value for `v`.
func (v *Bool) UnmarshalValue(value interface{}) error {
func (v *Bool) UnmarshalValue(value any) error {
v.Set(gconv.Bool(value))
return nil
}
// DeepCopy implements interface for deep copy of current type.
func (v *Bool) DeepCopy() interface{} {
func (v *Bool) DeepCopy() any {
if v == nil {
return nil
}

Some files were not shown because too many files have changed in this diff Show More