From 156fd2ef5d92f43f920d379374f2b7afac3df2d9 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Wed, 30 Aug 2023 15:08:27 +0800 Subject: [PATCH] doc: build doc --- .gitignore | 2 +- docs/.vitepress/dist/404.html | 25 + docs/.vitepress/dist/api/overview.html | 28 + .../dist/api/packages/algorithm.html | 836 ++++++ .../.vitepress/dist/api/packages/compare.html | 482 ++++ .../dist/api/packages/concurrency.html | 536 ++++ .../dist/api/packages/condition.html | 316 ++ .../dist/api/packages/convertor.html | 1018 +++++++ .../.vitepress/dist/api/packages/cryptor.html | 1396 +++++++++ .../datastructure/copyonwritelist.html | 386 +++ .../api/packages/datastructure/hashmap.html | 274 ++ .../dist/api/packages/datastructure/heap.html | 464 +++ .../dist/api/packages/datastructure/link.html | 984 +++++++ .../dist/api/packages/datastructure/list.html | 1022 +++++++ .../api/packages/datastructure/queue.html | 1334 +++++++++ .../dist/api/packages/datastructure/set.html | 598 ++++ .../api/packages/datastructure/stack.html | 572 ++++ .../dist/api/packages/datastructure/tree.html | 662 +++++ .../dist/api/packages/datetime.html | 1426 +++++++++ .../dist/api/packages/fileutil.html | 808 ++++++ .../dist/api/packages/formatter.html | 356 +++ .../dist/api/packages/function.html | 476 ++++ .../.vitepress/dist/api/packages/maputil.html | 1658 +++++++++++ .../dist/api/packages/mathutil.html | 1086 +++++++ .../.vitepress/dist/api/packages/netutil.html | 1200 ++++++++ .../.vitepress/dist/api/packages/pointer.html | 260 ++ docs/.vitepress/dist/api/packages/random.html | 218 ++ docs/.vitepress/dist/api/packages/retry.html | 328 +++ docs/.vitepress/dist/api/packages/slice.html | 2536 +++++++++++++++++ docs/.vitepress/dist/api/packages/stream.html | 972 +++++++ docs/.vitepress/dist/api/packages/struct.html | 586 ++++ .../.vitepress/dist/api/packages/strutil.html | 1566 ++++++++++ docs/.vitepress/dist/api/packages/system.html | 284 ++ docs/.vitepress/dist/api/packages/tuple.html | 1138 ++++++++ .../dist/api/packages/validator.html | 1228 ++++++++ docs/.vitepress/dist/api/packages/xerror.html | 508 ++++ .../dist/assets/api_overview.md.0734e445.js | 1 + .../assets/api_overview.md.0734e445.lean.js | 1 + .../api_packages_algorithm.md.a5fd6586.js | 809 ++++++ ...api_packages_algorithm.md.a5fd6586.lean.js | 1 + .../api_packages_compare.md.046b68ac.js | 455 +++ .../api_packages_compare.md.046b68ac.lean.js | 1 + .../api_packages_concurrency.md.02593d84.js | 509 ++++ ...i_packages_concurrency.md.02593d84.lean.js | 1 + .../api_packages_condition.md.2519cae3.js | 289 ++ ...api_packages_condition.md.2519cae3.lean.js | 1 + .../api_packages_convertor.md.3dc6f3b4.js | 991 +++++++ ...api_packages_convertor.md.3dc6f3b4.lean.js | 1 + .../api_packages_cryptor.md.2d4965d7.js | 1369 +++++++++ .../api_packages_cryptor.md.2d4965d7.lean.js | 1 + ...tastructure_copyonwritelist.md.1a351580.js | 359 +++ ...ucture_copyonwritelist.md.1a351580.lean.js | 1 + ...kages_datastructure_hashmap.md.310e4711.js | 247 ++ ..._datastructure_hashmap.md.310e4711.lean.js | 1 + ...packages_datastructure_heap.md.749f37d9.js | 437 +++ ...ges_datastructure_heap.md.749f37d9.lean.js | 1 + ...packages_datastructure_link.md.53b556c9.js | 957 +++++++ ...ges_datastructure_link.md.53b556c9.lean.js | 1 + ...packages_datastructure_list.md.c39c7138.js | 995 +++++++ ...ges_datastructure_list.md.c39c7138.lean.js | 1 + ...ackages_datastructure_queue.md.55dce1c4.js | 1307 +++++++++ ...es_datastructure_queue.md.55dce1c4.lean.js | 1 + ..._packages_datastructure_set.md.8bd77304.js | 571 ++++ ...ages_datastructure_set.md.8bd77304.lean.js | 1 + ...ackages_datastructure_stack.md.9d7b51a7.js | 545 ++++ ...es_datastructure_stack.md.9d7b51a7.lean.js | 1 + ...packages_datastructure_tree.md.1eeacf87.js | 635 +++++ ...ges_datastructure_tree.md.1eeacf87.lean.js | 1 + .../api_packages_datetime.md.53f898b5.js | 1399 +++++++++ .../api_packages_datetime.md.53f898b5.lean.js | 1 + .../api_packages_fileutil.md.94d3797c.js | 781 +++++ .../api_packages_fileutil.md.94d3797c.lean.js | 1 + .../api_packages_formatter.md.8820c0cf.js | 329 +++ ...api_packages_formatter.md.8820c0cf.lean.js | 1 + .../api_packages_function.md.5cbb4c31.js | 449 +++ .../api_packages_function.md.5cbb4c31.lean.js | 1 + .../api_packages_maputil.md.68434477.js | 1631 +++++++++++ .../api_packages_maputil.md.68434477.lean.js | 1 + .../api_packages_mathutil.md.274658f0.js | 1059 +++++++ .../api_packages_mathutil.md.274658f0.lean.js | 1 + .../api_packages_netutil.md.d9f6ee6d.js | 1173 ++++++++ .../api_packages_netutil.md.d9f6ee6d.lean.js | 1 + .../api_packages_pointer.md.3465a655.js | 233 ++ .../api_packages_pointer.md.3465a655.lean.js | 1 + .../assets/api_packages_random.md.c5785d61.js | 191 ++ .../api_packages_random.md.c5785d61.lean.js | 1 + .../assets/api_packages_retry.md.746cf8ed.js | 301 ++ .../api_packages_retry.md.746cf8ed.lean.js | 1 + .../assets/api_packages_slice.md.f48c775b.js | 2509 ++++++++++++++++ .../api_packages_slice.md.f48c775b.lean.js | 1 + .../assets/api_packages_stream.md.f8a1897d.js | 945 ++++++ .../api_packages_stream.md.f8a1897d.lean.js | 1 + .../assets/api_packages_struct.md.bdd9b8b9.js | 559 ++++ .../api_packages_struct.md.bdd9b8b9.lean.js | 1 + .../api_packages_strutil.md.2574c069.js | 1539 ++++++++++ .../api_packages_strutil.md.2574c069.lean.js | 1 + .../assets/api_packages_system.md.3c9cc0ec.js | 257 ++ .../api_packages_system.md.3c9cc0ec.lean.js | 1 + .../assets/api_packages_tuple.md.04b31a3e.js | 1111 ++++++++ .../api_packages_tuple.md.04b31a3e.lean.js | 1 + .../api_packages_validator.md.1f431893.js | 1201 ++++++++ ...api_packages_validator.md.1f431893.lean.js | 1 + .../assets/api_packages_xerror.md.b2d37d2c.js | 481 ++++ .../api_packages_xerror.md.b2d37d2c.lean.js | 1 + docs/.vitepress/dist/assets/app.531ff9c7.js | 1 + .../chunks/@localSearchIndexen.3dcccaf9.js | 1 + .../chunks/@localSearchIndexroot.84da4c78.js | 1 + .../chunks/VPLocalSearchBox.2bf1f725.js | 7 + .../dist/assets/chunks/framework.6e839c56.js | 2 + .../dist/assets/chunks/theme.4451c782.js | 7 + .../assets/en_api_overview.md.1eb70105.js | 1 + .../en_api_overview.md.1eb70105.lean.js | 1 + .../en_api_packages_algorithm.md.4b3abf4d.js | 809 ++++++ ...api_packages_algorithm.md.4b3abf4d.lean.js | 1 + .../en_api_packages_compare.md.409d8174.js | 455 +++ ...n_api_packages_compare.md.409d8174.lean.js | 1 + ...en_api_packages_concurrency.md.4ccb7541.js | 513 ++++ ...i_packages_concurrency.md.4ccb7541.lean.js | 1 + .../en_api_packages_condition.md.a164dfc9.js | 289 ++ ...api_packages_condition.md.a164dfc9.lean.js | 1 + .../en_api_packages_convertor.md.4d1b1ca4.js | 991 +++++++ ...api_packages_convertor.md.4d1b1ca4.lean.js | 1 + .../en_api_packages_cryptor.md.83b35674.js | 1369 +++++++++ ...n_api_packages_cryptor.md.83b35674.lean.js | 1 + ...tastructure_copyonwritelist.md.c4ab8b5a.js | 359 +++ ...ucture_copyonwritelist.md.c4ab8b5a.lean.js | 1 + ...kages_datastructure_hashmap.md.55db8537.js | 247 ++ ..._datastructure_hashmap.md.55db8537.lean.js | 1 + ...packages_datastructure_heap.md.638dd5d1.js | 437 +++ ...ges_datastructure_heap.md.638dd5d1.lean.js | 1 + ...packages_datastructure_link.md.062572a5.js | 959 +++++++ ...ges_datastructure_link.md.062572a5.lean.js | 1 + ...packages_datastructure_list.md.d467285d.js | 995 +++++++ ...ges_datastructure_list.md.d467285d.lean.js | 1 + ...ackages_datastructure_queue.md.88ad36da.js | 1307 +++++++++ ...es_datastructure_queue.md.88ad36da.lean.js | 1 + ..._packages_datastructure_set.md.963fc914.js | 571 ++++ ...ages_datastructure_set.md.963fc914.lean.js | 1 + ...ackages_datastructure_stack.md.1998c8dc.js | 545 ++++ ...es_datastructure_stack.md.1998c8dc.lean.js | 1 + ...packages_datastructure_tree.md.e0a47a13.js | 635 +++++ ...ges_datastructure_tree.md.e0a47a13.lean.js | 1 + .../en_api_packages_datetime.md.32edaec1.js | 1399 +++++++++ ..._api_packages_datetime.md.32edaec1.lean.js | 1 + .../en_api_packages_fileutil.md.fea45f47.js | 781 +++++ ..._api_packages_fileutil.md.fea45f47.lean.js | 1 + .../en_api_packages_formatter.md.00b1f98e.js | 329 +++ ...api_packages_formatter.md.00b1f98e.lean.js | 1 + .../en_api_packages_function.md.0aff7e60.js | 447 +++ ..._api_packages_function.md.0aff7e60.lean.js | 1 + .../en_api_packages_maputil.md.4fc65b0e.js | 1645 +++++++++++ ...n_api_packages_maputil.md.4fc65b0e.lean.js | 1 + .../en_api_packages_mathutil.md.cd3e0e74.js | 1059 +++++++ ..._api_packages_mathutil.md.cd3e0e74.lean.js | 1 + .../en_api_packages_netutil.md.4a71afe0.js | 1169 ++++++++ ...n_api_packages_netutil.md.4a71afe0.lean.js | 1 + .../en_api_packages_pointer.md.51cdc76e.js | 233 ++ ...n_api_packages_pointer.md.51cdc76e.lean.js | 1 + .../en_api_packages_random.md.09d4734b.js | 191 ++ ...en_api_packages_random.md.09d4734b.lean.js | 1 + .../en_api_packages_retry.md.9ae8caac.js | 301 ++ .../en_api_packages_retry.md.9ae8caac.lean.js | 1 + .../en_api_packages_slice.md.1a1b5495.js | 2507 ++++++++++++++++ .../en_api_packages_slice.md.1a1b5495.lean.js | 1 + .../en_api_packages_stream.md.99e473e0.js | 945 ++++++ ...en_api_packages_stream.md.99e473e0.lean.js | 1 + .../en_api_packages_struct.md.ebe3b9e2.js | 561 ++++ ...en_api_packages_struct.md.ebe3b9e2.lean.js | 1 + .../en_api_packages_strutil.md.2bfcfdc2.js | 1541 ++++++++++ ...n_api_packages_strutil.md.2bfcfdc2.lean.js | 1 + .../en_api_packages_system.md.b89ed647.js | 257 ++ ...en_api_packages_system.md.b89ed647.lean.js | 1 + .../en_api_packages_tuple.md.ce828c9e.js | 1111 ++++++++ .../en_api_packages_tuple.md.ce828c9e.lean.js | 1 + .../en_api_packages_validator.md.fa34c2f2.js | 1201 ++++++++ ...api_packages_validator.md.fa34c2f2.lean.js | 1 + .../en_api_packages_xerror.md.5cac58cd.js | 481 ++++ ...en_api_packages_xerror.md.5cac58cd.lean.js | 1 + .../en_guide_getting_started.md.fbd5d30c.js | 23 + ..._guide_getting_started.md.fbd5d30c.lean.js | 1 + .../en_guide_introduction.md.d2712e12.js | 1 + .../en_guide_introduction.md.d2712e12.lean.js | 1 + .../dist/assets/en_index.md.3bc9892c.js | 1 + .../dist/assets/en_index.md.3bc9892c.lean.js | 1 + .../guide_getting_started.md.acfc7802.js | 23 + .../guide_getting_started.md.acfc7802.lean.js | 1 + .../assets/guide_introduction.md.c4fdb40e.js | 1 + .../guide_introduction.md.c4fdb40e.lean.js | 1 + .../dist/assets/index.md.3fde7444.js | 1 + .../dist/assets/index.md.3fde7444.lean.js | 1 + .../inter-italic-cyrillic-ext.33bd5a8e.woff2 | Bin 0 -> 28332 bytes .../inter-italic-cyrillic.ea42a392.woff2 | Bin 0 -> 17824 bytes .../inter-italic-greek-ext.4fbe9427.woff2 | Bin 0 -> 12188 bytes .../assets/inter-italic-greek.8f4463c4.woff2 | Bin 0 -> 23264 bytes .../inter-italic-latin-ext.bd8920cc.woff2 | Bin 0 -> 63552 bytes .../assets/inter-italic-latin.bd3b6f56.woff2 | Bin 0 -> 46048 bytes .../inter-italic-vietnamese.6ce511fb.woff2 | Bin 0 -> 8784 bytes .../inter-roman-cyrillic-ext.e75737ce.woff2 | Bin 0 -> 26600 bytes .../inter-roman-cyrillic.5f2c6c8c.woff2 | Bin 0 -> 16780 bytes .../inter-roman-greek-ext.ab0619bc.woff2 | Bin 0 -> 11808 bytes .../assets/inter-roman-greek.d5a6d92a.woff2 | Bin 0 -> 21776 bytes .../inter-roman-latin-ext.0030eebd.woff2 | Bin 0 -> 59608 bytes .../assets/inter-roman-latin.2ed14f66.woff2 | Bin 0 -> 42464 bytes .../inter-roman-vietnamese.14ce25a6.woff2 | Bin 0 -> 8492 bytes .../.vitepress/dist/assets/style.d1d977d1.css | 1 + docs/.vitepress/dist/en/api/overview.html | 28 + .../dist/en/api/packages/algorithm.html | 836 ++++++ .../dist/en/api/packages/compare.html | 482 ++++ .../dist/en/api/packages/concurrency.html | 540 ++++ .../dist/en/api/packages/condition.html | 316 ++ .../dist/en/api/packages/convertor.html | 1018 +++++++ .../dist/en/api/packages/cryptor.html | 1396 +++++++++ .../datastructure/copyonwritelist.html | 386 +++ .../api/packages/datastructure/hashmap.html | 274 ++ .../en/api/packages/datastructure/heap.html | 464 +++ .../en/api/packages/datastructure/link.html | 986 +++++++ .../en/api/packages/datastructure/list.html | 1022 +++++++ .../en/api/packages/datastructure/queue.html | 1334 +++++++++ .../en/api/packages/datastructure/set.html | 598 ++++ .../en/api/packages/datastructure/stack.html | 572 ++++ .../en/api/packages/datastructure/tree.html | 662 +++++ .../dist/en/api/packages/datetime.html | 1426 +++++++++ .../dist/en/api/packages/fileutil.html | 808 ++++++ .../dist/en/api/packages/formatter.html | 356 +++ .../dist/en/api/packages/function.html | 474 +++ .../dist/en/api/packages/maputil.html | 1672 +++++++++++ .../dist/en/api/packages/mathutil.html | 1086 +++++++ .../dist/en/api/packages/netutil.html | 1196 ++++++++ .../dist/en/api/packages/pointer.html | 260 ++ .../dist/en/api/packages/random.html | 218 ++ .../dist/en/api/packages/retry.html | 328 +++ .../dist/en/api/packages/slice.html | 2534 ++++++++++++++++ .../dist/en/api/packages/stream.html | 972 +++++++ .../dist/en/api/packages/struct.html | 588 ++++ .../dist/en/api/packages/strutil.html | 1568 ++++++++++ .../dist/en/api/packages/system.html | 284 ++ .../dist/en/api/packages/tuple.html | 1138 ++++++++ .../dist/en/api/packages/validator.html | 1228 ++++++++ .../dist/en/api/packages/xerror.html | 508 ++++ .../dist/en/guide/getting_started.html | 50 + .../dist/en/guide/introduction.html | 28 + docs/.vitepress/dist/en/index.html | 28 + .../dist/guide/getting_started.html | 50 + docs/.vitepress/dist/guide/introduction.html | 28 + docs/.vitepress/dist/hashmap.json | 1 + docs/.vitepress/dist/index.html | 28 + docs/.vitepress/dist/lancet_logo.png | Bin 0 -> 18948 bytes docs/.vitepress/dist/lancet_logo_mini.png | Bin 0 -> 9551 bytes 248 files changed, 108747 insertions(+), 1 deletion(-) create mode 100644 docs/.vitepress/dist/404.html create mode 100644 docs/.vitepress/dist/api/overview.html create mode 100644 docs/.vitepress/dist/api/packages/algorithm.html create mode 100644 docs/.vitepress/dist/api/packages/compare.html create mode 100644 docs/.vitepress/dist/api/packages/concurrency.html create mode 100644 docs/.vitepress/dist/api/packages/condition.html create mode 100644 docs/.vitepress/dist/api/packages/convertor.html create mode 100644 docs/.vitepress/dist/api/packages/cryptor.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/copyonwritelist.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/hashmap.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/heap.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/link.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/list.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/queue.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/set.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/stack.html create mode 100644 docs/.vitepress/dist/api/packages/datastructure/tree.html create mode 100644 docs/.vitepress/dist/api/packages/datetime.html create mode 100644 docs/.vitepress/dist/api/packages/fileutil.html create mode 100644 docs/.vitepress/dist/api/packages/formatter.html create mode 100644 docs/.vitepress/dist/api/packages/function.html create mode 100644 docs/.vitepress/dist/api/packages/maputil.html create mode 100644 docs/.vitepress/dist/api/packages/mathutil.html create mode 100644 docs/.vitepress/dist/api/packages/netutil.html create mode 100644 docs/.vitepress/dist/api/packages/pointer.html create mode 100644 docs/.vitepress/dist/api/packages/random.html create mode 100644 docs/.vitepress/dist/api/packages/retry.html create mode 100644 docs/.vitepress/dist/api/packages/slice.html create mode 100644 docs/.vitepress/dist/api/packages/stream.html create mode 100644 docs/.vitepress/dist/api/packages/struct.html create mode 100644 docs/.vitepress/dist/api/packages/strutil.html create mode 100644 docs/.vitepress/dist/api/packages/system.html create mode 100644 docs/.vitepress/dist/api/packages/tuple.html create mode 100644 docs/.vitepress/dist/api/packages/validator.html create mode 100644 docs/.vitepress/dist/api/packages/xerror.html create mode 100644 docs/.vitepress/dist/assets/api_overview.md.0734e445.js create mode 100644 docs/.vitepress/dist/assets/api_overview.md.0734e445.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.js create mode 100644 docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.js create mode 100644 docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.js create mode 100644 docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.js create mode 100644 docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.js create mode 100644 docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.js create mode 100644 docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.js create mode 100644 docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.js create mode 100644 docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.js create mode 100644 docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.js create mode 100644 docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.js create mode 100644 docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.js create mode 100644 docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.js create mode 100644 docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.js create mode 100644 docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.js create mode 100644 docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.js create mode 100644 docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.js create mode 100644 docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.js create mode 100644 docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.js create mode 100644 docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.js create mode 100644 docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.js create mode 100644 docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.js create mode 100644 docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.js create mode 100644 docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.lean.js create mode 100644 docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.js create mode 100644 docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.lean.js create mode 100644 docs/.vitepress/dist/assets/app.531ff9c7.js create mode 100644 docs/.vitepress/dist/assets/chunks/@localSearchIndexen.3dcccaf9.js create mode 100644 docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.84da4c78.js create mode 100644 docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.2bf1f725.js create mode 100644 docs/.vitepress/dist/assets/chunks/framework.6e839c56.js create mode 100644 docs/.vitepress/dist/assets/chunks/theme.4451c782.js create mode 100644 docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.js create mode 100644 docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.lean.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.js create mode 100644 docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.lean.js create mode 100644 docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.js create mode 100644 docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.lean.js create mode 100644 docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.js create mode 100644 docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.lean.js create mode 100644 docs/.vitepress/dist/assets/en_index.md.3bc9892c.js create mode 100644 docs/.vitepress/dist/assets/en_index.md.3bc9892c.lean.js create mode 100644 docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.js create mode 100644 docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.lean.js create mode 100644 docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.js create mode 100644 docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.lean.js create mode 100644 docs/.vitepress/dist/assets/index.md.3fde7444.js create mode 100644 docs/.vitepress/dist/assets/index.md.3fde7444.lean.js create mode 100644 docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-italic-cyrillic.ea42a392.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-italic-greek-ext.4fbe9427.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-italic-greek.8f4463c4.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-italic-latin-ext.bd8920cc.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-italic-latin.bd3b6f56.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-italic-vietnamese.6ce511fb.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.e75737ce.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-roman-cyrillic.5f2c6c8c.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-roman-greek-ext.ab0619bc.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-roman-greek.d5a6d92a.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-roman-latin-ext.0030eebd.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-roman-latin.2ed14f66.woff2 create mode 100644 docs/.vitepress/dist/assets/inter-roman-vietnamese.14ce25a6.woff2 create mode 100644 docs/.vitepress/dist/assets/style.d1d977d1.css create mode 100644 docs/.vitepress/dist/en/api/overview.html create mode 100644 docs/.vitepress/dist/en/api/packages/algorithm.html create mode 100644 docs/.vitepress/dist/en/api/packages/compare.html create mode 100644 docs/.vitepress/dist/en/api/packages/concurrency.html create mode 100644 docs/.vitepress/dist/en/api/packages/condition.html create mode 100644 docs/.vitepress/dist/en/api/packages/convertor.html create mode 100644 docs/.vitepress/dist/en/api/packages/cryptor.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/copyonwritelist.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/hashmap.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/heap.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/link.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/list.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/queue.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/set.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/stack.html create mode 100644 docs/.vitepress/dist/en/api/packages/datastructure/tree.html create mode 100644 docs/.vitepress/dist/en/api/packages/datetime.html create mode 100644 docs/.vitepress/dist/en/api/packages/fileutil.html create mode 100644 docs/.vitepress/dist/en/api/packages/formatter.html create mode 100644 docs/.vitepress/dist/en/api/packages/function.html create mode 100644 docs/.vitepress/dist/en/api/packages/maputil.html create mode 100644 docs/.vitepress/dist/en/api/packages/mathutil.html create mode 100644 docs/.vitepress/dist/en/api/packages/netutil.html create mode 100644 docs/.vitepress/dist/en/api/packages/pointer.html create mode 100644 docs/.vitepress/dist/en/api/packages/random.html create mode 100644 docs/.vitepress/dist/en/api/packages/retry.html create mode 100644 docs/.vitepress/dist/en/api/packages/slice.html create mode 100644 docs/.vitepress/dist/en/api/packages/stream.html create mode 100644 docs/.vitepress/dist/en/api/packages/struct.html create mode 100644 docs/.vitepress/dist/en/api/packages/strutil.html create mode 100644 docs/.vitepress/dist/en/api/packages/system.html create mode 100644 docs/.vitepress/dist/en/api/packages/tuple.html create mode 100644 docs/.vitepress/dist/en/api/packages/validator.html create mode 100644 docs/.vitepress/dist/en/api/packages/xerror.html create mode 100644 docs/.vitepress/dist/en/guide/getting_started.html create mode 100644 docs/.vitepress/dist/en/guide/introduction.html create mode 100644 docs/.vitepress/dist/en/index.html create mode 100644 docs/.vitepress/dist/guide/getting_started.html create mode 100644 docs/.vitepress/dist/guide/introduction.html create mode 100644 docs/.vitepress/dist/hashmap.json create mode 100644 docs/.vitepress/dist/index.html create mode 100644 docs/.vitepress/dist/lancet_logo.png create mode 100644 docs/.vitepress/dist/lancet_logo_mini.png diff --git a/.gitignore b/.gitignore index 385ad28..e607caa 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ cryptor/*.pem test docs/node_modules docs/.vitepress/cache -docs/.vitepress/dist +# docs/.vitepress/dist diff --git a/docs/.vitepress/dist/404.html b/docs/.vitepress/dist/404.html new file mode 100644 index 0000000..3f1b0a8 --- /dev/null +++ b/docs/.vitepress/dist/404.html @@ -0,0 +1,25 @@ + + + + + + 404 | Lancet + + + + + + + + + + + + + + +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/overview.html b/docs/.vitepress/dist/api/overview.html new file mode 100644 index 0000000..dfd96a7 --- /dev/null +++ b/docs/.vitepress/dist/api/overview.html @@ -0,0 +1,28 @@ + + + + + + API概述 | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

API概述

lancet(柳叶刀)是一个功能强大、全面、高效、可复用的go语言工具函数库。包含25个包,超过600个工具函数。功能涵盖字符串处理、切片处理、网络、并发、加解密、文件处理、时间/日期、流处理、迭代器等等。

lancet功能模块

algorithm
compare
concurrency
condition
convertor
cryptor
datastructure
datetime
fileutil
formatter
function
iterator
maputil
mathutil
netutil
pointer
random
retry
slice
stream
structs
strutil
system
tuple
validator
xerror

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/algorithm.html b/docs/.vitepress/dist/api/packages/algorithm.html new file mode 100644 index 0000000..0ceac7a --- /dev/null +++ b/docs/.vitepress/dist/api/packages/algorithm.html @@ -0,0 +1,836 @@ + + + + + + Algorithm | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Algorithm

algorithm 算法包实现一些基本算法,sort,search,lrucache。

源码

用法

go
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)

目录

文档

BubbleSort

冒泡排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

InsertionSort

插入排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}

SelectionSort

选择排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

ShellSort

希尔排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

QuickSort

快速排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

HeapSort

堆排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

MergeSort

归并排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

CountSort

计数排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

BinarySearch

二分递归查找,返回元素索引,未找到元素返回-1,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

BinaryIterativeSearch

二分迭代查找,返回元素索引,未找到元素返回-1,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

LinearSearch

基于传入的相等函数线性查找元素,返回元素索引,未找到元素返回-1。

函数签名:

go
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LRUCache

lru算法实现缓存。

函数签名:

go
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/compare.html b/docs/.vitepress/dist/api/packages/compare.html new file mode 100644 index 0000000..6686e18 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/compare.html @@ -0,0 +1,482 @@ + + + + + + Compare | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Compare

compare包提供几个轻量级的类型比较函数。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)

目录

文档

Equal

检查两个值是否相等(检查类型和值)

函数签名:

go
func Equal(left, right any) bool
func Equal(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

EqualValue

检查两个值是否相等(只检查值)

函数签名:

go
func EqualValue(left, right any) bool
func EqualValue(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

LessThan

验证参数`left`的值是否小于参数`right`的值。

函数签名:

go
func LessThan(left, right any) bool
func LessThan(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterThan

验证参数`left`的值是否大于参数`right`的值。

函数签名:

go
func GreaterThan(left, right any) bool
func GreaterThan(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LessOrEqual

验证参数`left`的值是否小于或等于参数`right`的值。

函数签名:

go
func LessOrEqual(left, right any) bool
func LessOrEqual(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterOrEqual

验证参数`left`的值是否大于或参数`right`的值。

函数签名:

go
func GreaterOrEqual(left, right any) bool
func GreaterOrEqual(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

InDelta

检查增量内两个值是否相等。

函数签名:

go
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/concurrency.html b/docs/.vitepress/dist/api/packages/concurrency.html new file mode 100644 index 0000000..5bfdc8c --- /dev/null +++ b/docs/.vitepress/dist/api/packages/concurrency.html @@ -0,0 +1,536 @@ + + + + + + Concurrency | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Concurrency

并发包包含一些支持并发编程的功能。例如:goroutine, channel 等。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)

目录

Channel

文档

Channel

NewChannel

返回一个Channel指针实例

函数签名:

go
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}

Bridge

将多个channel链接到一个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}

FanIn

将多个channel合并为一个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}

Generate

根据传入的值,生成channel.

函数签名:

go
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

Repeat

返回一个channel,将参数`values`重复放入channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}

RepeatFn

返回一个channel,重复执行函数fn,并将结果放入返回的channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+    // Output:
+    // hello
+    // hello
+    // hello
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+    // Output:
+    // hello
+    // hello
+    // hello
+}

Or

将一个或多个channel读取到一个channel中,当任何读取channel关闭时将结束读取。

函数签名:

go
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}

OrDone

将一个channel读入另一个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}

Take

返回一个channel,其值从另一个channel获取,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

Tee

将一个channel分成两个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/condition.html b/docs/.vitepress/dist/api/packages/condition.html new file mode 100644 index 0000000..d6e6c49 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/condition.html @@ -0,0 +1,316 @@ + + + + + + Condition | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Condition

condition包含一些用于条件判断的函数。这个包的实现参考了carlmjohnson的truthy包的实现,更多有用的信息可以在truthy中找到,感谢carlmjohnson。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)

目录

文档

Bool

返回传入参数的bool值.
如果出入类型参数含有Bool方法, 会调用该方法并返回
如果传入类型参数有IsZero方法, 返回IsZero方法返回值的取反
slices和map的length大于0时,返回true,否则返回false
其他类型会判断是否是零值

函数签名:

go
func Bool[T any](value T) bool
func Bool[T any](value T) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}

And

逻辑且操作,当切仅当a和b都为true时返回true

函数签名:

go
func And[T, U any](a T, b U) bool
func And[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}

Or

逻辑或操作,当切仅当a和b都为false时返回false

函数签名:

go
func Or[T, U any](a T, b U) bool
func Or[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}

Xor

逻辑异或操作,a和b相同返回false,a和b不相同返回true

函数签名:

go
func Xor[T, U any](a T, b U) bool
func Xor[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}

Nor

异或的取反操作

函数签名:

go
func Nor[T, U any](a T, b U) bool
func Nor[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}

Xnor

如果a和b都是真的或a和b均是假的,则返回true。

函数签名:

go
func Xnor[T, U any](a T, b U) bool
func Xnor[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}

Nand

如果a和b都为真,返回false,否则返回true

函数签名:

go
func Nand[T, U any](a T, b U) bool
func Nand[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}

TernaryOperator

三元运算符

函数签名:

go
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/convertor.html b/docs/.vitepress/dist/api/packages/convertor.html new file mode 100644 index 0000000..e331a2b --- /dev/null +++ b/docs/.vitepress/dist/api/packages/convertor.html @@ -0,0 +1,1018 @@ + + + + + + Convertor | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Convertor

convertor 转换器包支持一些常见的数据类型转换

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)

目录

文档

ColorHexToRGB

颜色值十六进制转rgb。

函数签名:

go
func ColorHexToRGB(colorHex string) (red, green, blue int)
func ColorHexToRGB(colorHex string) (red, green, blue int)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}

ColorRGBToHex

颜色值rgb转十六进制。

函数签名:

go
func ColorRGBToHex(red, green, blue int) string
func ColorRGBToHex(red, green, blue int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}

ToBool

字符串转布尔类型,使用strconv.ParseBool。

函数签名:

go
func ToBool(s string) (bool, error)
func ToBool(s string) (bool, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}

ToBytes

Interface转字节切片。

函数签名:

go
func ToBytes(data any) ([]byte, error)
func ToBytes(data any) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}

ToChar

字符串转字符切片。

函数签名:

go
func ToChar(s string) []string
func ToChar(s string) []string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}

ToChannel

将切片转为只读channel。

函数签名:

go
func ToChannel[T any](array []T) <-chan T
func ToChannel[T any](array []T) <-chan T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

ToFloat

将interface转成float64类型,如果参数无法转换,会返回0和error。

函数签名:

go
func ToFloat(value any) (float64, error)
func ToFloat(value any) (float64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}

ToInt

将interface转成int64类型,如果参数无法转换,会返回0和error。

函数签名:

go
func ToInt(value any) (int64, error)
func ToInt(value any) (int64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}

ToJson

将interface转成json字符串,如果参数无法转换,会返回""和error。

函数签名:

go
func ToJson(value any) (string, error)
func ToJson(value any) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}

ToMap

将切片转为map。

函数签名:

go
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}

ToPointer

返回传入值的指针。

函数签名:

go
func ToPointer[T any](value T) *T
func ToPointer[T any](value T) *T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}

ToString

将值转换为字符串,对于数字、字符串、[]byte,将转换为字符串。 对于其他类型(切片、映射、数组、结构体)将调用 json.Marshal

函数签名:

go
func ToString(value any) string
func ToString(value any) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}

StructToMap

将struct转成map,只会转换struct中可导出的字段。struct中导出字段需要设置json tag标记。

函数签名:

go
func StructToMap(value any) (map[string]any, error)
func StructToMap(value any) (map[string]any, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}

MapToSlice

map中key和value执行函数iteratee后,转为切片。

函数签名:

go
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}

EncodeByte

将data编码成字节切片。

函数签名:

go
func EncodeByte(data any) ([]byte, error)
func EncodeByte(data any) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}

DecodeByte

解码字节切片到目标对象,目标对象需要传入一个指针实例。

函数签名:

go
func DecodeByte(data []byte, target any) error
func DecodeByte(data []byte, target any) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

DeepClone

创建一个传入值的深拷贝, 无法克隆结构体的非导出字段。

函数签名:

go
func DeepClone[T any](src T) T
func DeepClone[T any](src T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}

CopyProperties

拷贝不同结构体之间的同名字段。使用json.Marshal序列化,需要设置dst和src struct字段的json tag。

函数签名:

go
func CopyProperties[T, U any](dst T, src U) (err error)
func CopyProperties[T, U any](dst T, src U) (err error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type DiskVO struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type Indicator struct {
+        Id      string    `json:"id"`
+        Ip      string    `json:"ip"`
+        UpTime  string    `json:"upTime"`
+        LoadAvg string    `json:"loadAvg"`
+        Cpu     int       `json:"cpu"`
+        Disk    []Disk    `json:"disk"`
+        Stop    chan bool `json:"-"`
+    }
+
+    type IndicatorVO struct {
+        Id      string   `json:"id"`
+        Ip      string   `json:"ip"`
+        UpTime  string   `json:"upTime"`
+        LoadAvg string   `json:"loadAvg"`
+        Cpu     int64    `json:"cpu"`
+        Disk    []DiskVO `json:"disk"`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type DiskVO struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type Indicator struct {
+        Id      string    `json:"id"`
+        Ip      string    `json:"ip"`
+        UpTime  string    `json:"upTime"`
+        LoadAvg string    `json:"loadAvg"`
+        Cpu     int       `json:"cpu"`
+        Disk    []Disk    `json:"disk"`
+        Stop    chan bool `json:"-"`
+    }
+
+    type IndicatorVO struct {
+        Id      string   `json:"id"`
+        Ip      string   `json:"ip"`
+        UpTime  string   `json:"upTime"`
+        LoadAvg string   `json:"loadAvg"`
+        Cpu     int64    `json:"cpu"`
+        Disk    []DiskVO `json:"disk"`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}

ToInterface

将反射值转换成对应的interface类型。

函数签名:

go
func ToInterface(v reflect.Value) (value interface{}, ok bool)
func ToInterface(v reflect.Value) (value interface{}, ok bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\n", iVal)
+    fmt.Printf("%v\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\n", iVal)
+    fmt.Printf("%v\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true
+}

Utf8ToGbk

utf8编码转GBK编码。

函数签名:

go
func Utf8ToGbk(bs []byte) ([]byte, error)
func Utf8ToGbk(bs []byte) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true
+}

GbkToUtf8

GBK编码转utf8编码。

函数签名:

go
func GbkToUtf8(bs []byte) ([]byte, error)
func GbkToUtf8(bs []byte) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/cryptor.html b/docs/.vitepress/dist/api/packages/cryptor.html new file mode 100644 index 0000000..eb76262 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/cryptor.html @@ -0,0 +1,1396 @@ + + + + + + Cryptor | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Cryptor

cryptor包包含数据加密和解密功能。支持 base64, md5, hmac, hash, aes, des, rsa。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)

目录

文档

AesEcbEncrypt

使用AES ECB算法模式加密数据. 参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesEcbEncrypt(data, key []byte) []byte
func AesEcbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesEcbDecrypt

使用AES ECB算法模式解密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesEcbDecrypt(encrypted, key []byte) []byte
func AesEcbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcEncrypt

使用AES CBC算法模式加密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesCbcEncrypt(data, key []byte) []byte
func AesCbcEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcDecrypt

使用AES CBC算法模式解密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesCbcDecrypt(encrypted, key []byte) []byte
func AesCbcDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCtrCrypt

使用AES CTR算法模式加密/解密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesCtrCrypt(data, key []byte) []byte
func AesCtrCrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbEncrypt

使用AES CFB算法模式加密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesCfbEncrypt(data, key []byte) []byte
func AesCfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbDecrypt

使用AES CFB算法模式解密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesCfbDecrypt(encrypted, key []byte) []byte
func AesCfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbEncrypt

使用AES OFB算法模式加密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesOfbEncrypt(data, key []byte) []byte
func AesOfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbDecrypt

使用AES OFB算法模式解密数据,参数`key`的长度是16, 24 or 32。

函数签名:

go
func AesOfbDecrypt(encrypted, key []byte) []byte
func AesOfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

Base64StdEncode

将字符串base64编码。

函数签名:

go
func Base64StdEncode(s string) string
func Base64StdEncode(s string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}

Base64StdDecode

解码base64字符串。

函数签名:

go
func Base64StdDecode(s string) string
func Base64StdDecode(s string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}

DesEcbEncrypt

使用DES ECB算法模式加密数据,参数`key`的长度是8。

函数签名:

go
func DesEcbEncrypt(data, key []byte) []byte
func DesEcbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesEcbDecrypt

使用DES ECB算法模式解决密数据,参数`key`的长度是8。

函数签名:

go
func DesEcbDecrypt(encrypted, key []byte) []byte
func DesEcbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcEncrypt

使用DES CBC算法模式加密数据,参数`key`的长度是8。

函数签名:

go
func DesCbcEncrypt(data, key []byte) []byte
func DesCbcEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcDecrypt

使用DES CBC算法模式解密数据,参数`key`的长度是8。

函数签名:

go
func DesCbcDecrypt(encrypted, key []byte) []byte
func DesCbcDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCtrCrypt

使用DES CTR算法模式加密/解密数据,参数`key`的长度是8

函数签名:

go
func DesCtrCrypt(data, key []byte) []byte
func DesCtrCrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbEncrypt

使用DES CFB算法模式加密数据,参数`key`的长度是8。

函数签名:

go
func DesCfbEncrypt(data, key []byte) []byte
func DesCfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbDecrypt

使用DES CFB算法模式解决密数据,参数`key`的长度是8。

函数签名:

go
func DesCfbDecrypt(encrypted, key []byte) []byte
func DesCfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbEncrypt

使用DES OFB算法模式加密数据,参数`key`的长度是8。

函数签名:

go
func DesOfbEncrypt(data, key []byte) []byte
func DesOfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbDecrypt

使用DES OFB算法模式解密数据,参数`key`的长度是8。

函数签名:

go
func DesOfbDecrypt(encrypted, key []byte) []byte
func DesOfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

HmacMd5

获取字符串md5 hmac值。

函数签名:

go
func HmacMd5(str, key string) string
func HmacMd5(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}

HmacMd5WithBase64

获取字符串md5 hmac base64字符串值。

函数签名:

go
func HmacMd5WithBase64(str, key string) string
func HmacMd5WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}

HmacSha1

获取字符串的sha1 hmac值。

函数签名:

go
func HmacSha1(str, key string) string
func HmacSha1(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}

HmacSha1WithBase64

获取字符串的sha1 base64值。

函数签名:

go
func HmacSha1WithBase64(str, key string) string
func HmacSha1WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}

HmacSha256

获取字符串sha256 hmac值。

函数签名:

go
func HmacSha256(str, key string) string
func HmacSha256(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}

HmacSha256WithBase64

获取字符串sha256 hmac base64值。

函数签名:

go
func HmacSha256WithBase64(str, key string) string
func HmacSha256WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}

HmacSha512

获取字符串sha512 hmac值。

函数签名:

go
func HmacSha512(str, key string) string
func HmacSha512(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}

HmacSha512WithBase64

获取字符串sha512 hmac base64值。

函数签名:

go
func HmacSha512WithBase64(str, key string) string
func HmacSha512WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}

Md5String

获取字符串md5值。

函数签名:

go
func Md5String(str string) string
func Md5String(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}

Md5StringWithBase64

获取字符串md5 base64值。

函数签名:

go
func Md5StringWithBase64(s string) string
func Md5StringWithBase64(s string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5Byte

获取byte slice的md5值。

函数签名:

go
func Md5Byte(data []byte) string
func Md5Byte(data []byte) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}

Md5ByteWithBase64

获取byte slice的md5 base64值。

函数签名:

go
func Md5ByteWithBase64(data []byte) string
func Md5ByteWithBase64(data []byte) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5File

获取文件md5值。

函数签名:

go
func Md5File(filepath string) (string, error)
func Md5File(filepath string) (string, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}

Sha1

获取字符串sha1值。

函数签名:

go
func Sha1(str string) string
func Sha1(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}

Sha1WithBase64

获取字符串sha1 base64值。

函数签名:

go
func Sha1WithBase64(str string) string
func Sha1WithBase64(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}

Sha256

获取字符串sha256值。

函数签名:

go
func Sha256(str string) string
func Sha256(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}

Sha256WithBase64

获取字符串sha256 base64值。

函数签名:

go
func Sha256WithBase64(str string) string
func Sha256WithBase64(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}

Sha512

获取字符串sha512值。

函数签名:

go
func Sha512(str string) string
func Sha512(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}

Sha512WithBase64

获取字符串sha512 base64值。

函数签名:

go
func Sha512WithBase64(str string) string
func Sha512WithBase64(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}

GenerateRsaKey

在当前目录下创建rsa私钥文件和公钥文件。

函数签名:

go
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

RsaEncrypt

用公钥文件ras加密数据。

函数签名:

go
func RsaEncrypt(data []byte, pubKeyFileName string) []byte
func RsaEncrypt(data []byte, pubKeyFileName string) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

RsaDecrypt

用私钥文件rsa解密数据。

函数签名:

go
func RsaDecrypt(data []byte, privateKeyFileName string) []byte
func RsaDecrypt(data []byte, privateKeyFileName string) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/copyonwritelist.html b/docs/.vitepress/dist/api/packages/datastructure/copyonwritelist.html new file mode 100644 index 0000000..3480683 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/copyonwritelist.html @@ -0,0 +1,386 @@ + + + + + + CopyOnWriteList | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

CopyOnWriteList

CopyOnWriteList 是一个线程安全的 List 实现,底层使用 go 切片。写入时,会复制一份新的切片,写入完成后,再将新的切片赋值给原来的切片。读取时,直接读取原来的切片。

源码

用法

go
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)

目录

文档

NewCopyOnWriteList

返回一个具有空切片的 CopyOnWriteList。

go
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.Locker
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.Locker
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}

Size

返回 CopyOnWriteList 的长度。

go
func (l *CopyOnWriteList[T]) Size() int
func (l *CopyOnWriteList[T]) Size() int

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}

Get

返回列表中指定位置的元素

go
func (c *CopyOnWriteList[T]) Get(index int) *T
func (c *CopyOnWriteList[T]) Get(index int) *T

示例

go
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	fmt.Println(l.Get(2))
+}
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	fmt.Println(l.Get(2))
+}

Set

将此列表中指定位置的元素替换为指定元素。

go
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)

示例

go
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}

Remove

IndexOf

返回列表中值的索引,如果没有找到返回-1。

go
func (c *CopyOnWriteList[T]) IndexOf(e T) int
func (c *CopyOnWriteList[T]) IndexOf(e T) int

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}

LastIndexOf

返回指定元素在此列表中最后出现的索引,如果此列表不包含该元素,则返回-1。

go
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3,1})
+	fmt.Println(l.LastIndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3,1})
+	fmt.Println(l.LastIndexOf(1))
+}

IsEmpty

如果此列表不包含任何元素,则返回 true。

go
func (c *CopyOnWriteList[T]) IsEmpty() bool
func (c *CopyOnWriteList[T]) IsEmpty() bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{})
+	fmt.Println(l.IsEmpty())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{})
+	fmt.Println(l.IsEmpty())
+}

Contain

判断 CopyOnWriteList 是否包含某个元素

go
func (c *CopyOnWriteList[T]) Contain(e T) bool
func (c *CopyOnWriteList[T]) Contain(e T) bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Contain(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Contain(1))
+}

ValueOf

返回列表中索引处的值指针

go
func (c *CopyOnWriteList[T]) ValueOf(index int) []T
func (c *CopyOnWriteList[T]) ValueOf(index int) []T

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}

Add

将指定的元素追加到此列表的末尾。

go
func (c *CopyOnWriteList[T]) Add(e T) bool
func (c *CopyOnWriteList[T]) Add(e T) bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}

AddAll

将指定集合中的所有元素追加到此列表的末尾

go
func (c *CopyOnWriteList[T]) AddAll(e []T) bool
func (c *CopyOnWriteList[T]) AddAll(e []T) bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}

AddByIndex

将指定元素插入此列表中的指定位置。

go
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.AddByIndex(2, 6)
+	fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.AddByIndex(2, 6)
+	fmt.Println(l.getList())
+}

DeleteAt

移除此列表中指定位置的元素。

go
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.DeleteAt(2)
+	fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.DeleteAt(2)
+	fmt.Println(l.getList())
+}

DeleteIf

从此列表中删除第一个出现的指定元素(如果该元素存在)。

go
func (c *CopyOnWriteList[T]) DeleteIf(f func(T) bool) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteIf(f func(T) bool) (oldValue *T, ok bool)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}

DeleteBy

从此列表中删除第一个出现的指定元素(如果该元素存在)。

go
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}

DeleteRange

从该列表中删除索引介于 fromIndex(包含)和 toIndex(不包含)之间的所有元素。 (左闭右开)。

go
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}

Equal

如果指定的对象等于此列表,则返回 true。

go
func (c *CopyOnWriteList[T]) Equal(e []T) bool
func (c *CopyOnWriteList[T]) Equal(e []T) bool

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/hashmap.html b/docs/.vitepress/dist/api/packages/datastructure/hashmap.html new file mode 100644 index 0000000..f804348 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/hashmap.html @@ -0,0 +1,274 @@ + + + + + + HashMap | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

HashMap

HashMap 数据结构实现

源码

用法

go
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)

目录

API 文档

NewHashMap

新建默认容量(1 << 10)的HashMap指针实例

函数签名:

go
func NewHashMap() *HashMap
func NewHashMap() *HashMap

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}

NewHashMapWithCapacity

新建指定容量和长度的HashMap指针实例.

函数签名:

go
func NewHashMapWithCapacity(size, capacity uint64) *HashMap
func NewHashMapWithCapacity(size, capacity uint64) *HashMap

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}

Get

在hashmap中根据key获取值

函数签名:

go
func (hm *HashMap) Get(key any) any
func (hm *HashMap) Get(key any) any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}

Put

将key-value放入hashmap中

函数签名:

go
func (hm *HashMap) Put(key any, value any) any
func (hm *HashMap) Put(key any, value any) any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}

Delete

将指定的key从hashmap中删除

函数签名:

go
func (hm *HashMap) Delete(key any)
func (hm *HashMap) Delete(key any)

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}

Contains

判断hashmap中是否包含指定的key

函数签名:

go
func (hm *HashMap) Contains(key any) bool
func (hm *HashMap) Contains(key any) bool

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}

Iterate

迭代hashmap,对每个key和value执行iteratee函数

函数签名:

go
func (hm *HashMap) Iterate(iteratee func(key, value any))
func (hm *HashMap) Iterate(iteratee func(key, value any))

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}

Keys

返回hashmap所有key的切片 (随机顺序)

函数签名:

go
func (hm *HashMap) Keys() []any
func (hm *HashMap) Keys() []any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}

Values

返回hashmap所有值的切片 (随机顺序).

函数签名:

go
func (hm *HashMap) Values() []any
func (hm *HashMap) Values() []any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/heap.html b/docs/.vitepress/dist/api/packages/datastructure/heap.html new file mode 100644 index 0000000..fef8329 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/heap.html @@ -0,0 +1,464 @@ + + + + + + Heap | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Heap

堆,切片实现的二叉堆数据结构。

源码

用法

go
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)

目录

API文档

1. MaxHeap

MaxHeap是通过slice实现的二叉堆树,根节点的key既大于等于左子树的key值且大于等于右子树的key值。

NewMaxHeap

返回NewMaxHeap指针实例

函数签名:

go
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}

Push

向堆中插入数据

函数签名:

go
func (h *MaxHeap[T]) Push(value T)
func (h *MaxHeap[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Pop

返回堆中最大值并将其从堆中删除,如果堆为空,返回零值并返回false

函数签名:

go
func (h *MaxHeap[T]) Pop() (T, bool)
func (h *MaxHeap[T]) Pop() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}

Peek

返回堆中最大值,如果堆为空,返回零值并返回false

函数签名:

go
func (h *MaxHeap[T]) Peek() (T, bool)
func (h *MaxHeap[T]) Peek() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}

Data

返回堆中全部元素的切片

函数签名:

go
func (h *MaxHeap[T]) Data() []T
func (h *MaxHeap[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Size

返回堆中元素的数量

函数签名:

go
func (h *MaxHeap[T]) Size() int
func (h *MaxHeap[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}

PrintStructure

打印堆的树形结构

函数签名:

go
func (h *MaxHeap[T]) PrintStructure()
func (h *MaxHeap[T]) PrintStructure()

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/link.html b/docs/.vitepress/dist/api/packages/datastructure/link.html new file mode 100644 index 0000000..6ac517f --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/link.html @@ -0,0 +1,984 @@ + + + + + + Linklist | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/list.html b/docs/.vitepress/dist/api/packages/datastructure/list.html new file mode 100644 index 0000000..62dac5c --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/list.html @@ -0,0 +1,1022 @@ + + + + + + List | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

List

List是线性表数据结构, 用go切片实现。

源码

用法

go
import (
+    "github.com/duke-git/lancet/v2/datastructure"
+)
import (
+    "github.com/duke-git/lancet/v2/datastructure"
+)

目录

文档

NewList

返回List指针实例

函数签名:

go
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}

Contain

判断列表中是否包含特定值

函数签名:

go
func (l *List[T]) Contain(value T) bool
func (l *List[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}

Data

返回List中所有数据(切片)

函数签名:

go
func (l *List[T]) Data() []T
func (l *List[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}

ValueOf

返回列表中索引处的值指针

函数签名:

go
func (l *List[T]) ValueOf(index int) (*T, bool)
func (l *List[T]) ValueOf(index int) (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}

IndexOf

返回列表中值的索引,如果没有找到返回-1

函数签名:

go
func (l *List[T]) IndexOf(value T) int
func (l *List[T]) IndexOf(value T) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}

LastIndexOf

返回列表中最后一次出现的值的索引。如果未找到,则返回-1

函数签名:

go
func (l *List[T]) LastIndexOf(value T) int
func (l *List[T]) LastIndexOf(value T) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}

IndexOfFunc

返回第一个符合函数条件的元素的索引。如果未找到,则返回-1

函数签名:

go
func (l *List[T]) IndexOfFunc(f func(T) bool) int
func (l *List[T]) IndexOfFunc(f func(T) bool) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

LastIndexOfFunc

返回最后一个符合函数条件的元素的索引。如果未找到,则返回-1

函数签名:

go
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

Push

将值附加到列表末尾

函数签名:

go
func (l *List[T]) Push(value T)
func (l *List[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}

PopFirst

删除列表的第一个值并返回该值

函数签名:

go
func (l *List[T]) PopFirst() (*T, bool)
func (l *List[T]) PopFirst() (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}

PopFirst

删除列表的最后一个值并返回该值

函数签名:

go
func (l *List[T]) PopLast() (*T, bool)
func (l *List[T]) PopLast() (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}

DeleteAt

删除索引处列表的值,如果索引不在0和列表数据长度之间,则不执行任何操作

函数签名:

go
func (l *List[T]) DeleteAt(index int)
func (l *List[T]) DeleteAt(index int)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}

InsertAt

在索引处插入值到列表中,如果索引不在 0 和列表数据长度之间,则不执行任何操作

函数签名:

go
func (l *List[T]) InsertAt(index int, value T)
func (l *List[T]) InsertAt(index int, value T)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}

UpdateAt

更新索引处列表的值,索引应该在0和列表数据长度-1之间

函数签名:

go
func (l *List[T]) UpdateAt(index int, value T)
func (l *List[T]) UpdateAt(index int, value T)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}

Equal

比较一个列表和另一个列表,在每个元素上使用 reflect.DeepEqual

函数签名:

go
func (l *List[T]) Equal(other *List[T]) bool
func (l *List[T]) Equal(other *List[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}

IsEmpty

判断列表是否为空

函数签名:

go
func (l *List[T]) IsEmpty() bool
func (l *List[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}

Clear

清空列表数据

函数签名:

go
func (l *List[T]) Clear()
func (l *List[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}

Clone

返回列表的一个拷贝

函数签名:

go
func (l *List[T]) Clone() *List[T]
func (l *List[T]) Clone() *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}

Merge

合并两个列表,返回新的列表

函数签名:

go
func (l *List[T]) Merge(other *List[T]) *List[T]
func (l *List[T]) Merge(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}

Size

返回列表数据项的数量

函数签名:

go
func (l *List[T]) Size() int
func (l *List[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}

Cap

返回列表数据容量

函数签名:

go
func (l *List[T]) Cap() int
func (l *List[T]) Cap() int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}

Swap

交换列表中两个索引位置的值

函数签名:

go
func (l *List[T]) Swap(i, j int)
func (l *List[T]) Swap(i, j int)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}

Reverse

反转列表的数据项顺序

函数签名:

go
func (l *List[T]) Reverse()
func (l *List[T]) Reverse()

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}

Unique

列表去除重复数据项

函数签名:

go
func (l *List[T]) Unique()
func (l *List[T]) Unique()

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}

Union

两个列表取并集,去除重复数据项

函数签名:

go
func (l *List[T]) Union(other *List[T]) *List[T]
func (l *List[T]) Union(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}

Intersection

两个列表取交集

函数签名:

go
func (l *List[T]) Intersection(other *List[T]) *List[T]
func (l *List[T]) Intersection(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}

Difference

差集运算。

函数签名:

go
func (l *List[T]) Difference(other *List[T]) *List[T]
func (l *List[T]) Difference(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}

SymmetricDifference

对称差集运算。

函数签名:

go
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}

RetainAll

仅保留列表中包含在给定列表中的元素。

函数签名:

go
func (l *List[T]) RetainAll(list *List[T]) bool
func (l *List[T]) RetainAll(list *List[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}

DeleteAll

从列表中删除给定列表中包含的所有元素。

函数签名:

go
func (l *List[T]) DeleteAll(list *List[T]) bool
func (l *List[T]) DeleteAll(list *List[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}

ForEach

对列表的每个元素执行给定的操作。

函数签名:

go
func (l *List[T]) ForEach(consumer func(T))
func (l *List[T]) ForEach(consumer func(T))

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

Iterator

按顺序返回列表中元素的迭代器。

函数签名:

go
func (l *List[T]) Iterator() iterator.Iterator[T]
func (l *List[T]) Iterator() iterator.Iterator[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

ListToMap

基于iteratee函数将列表转换为映射map。

函数签名:

go
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}

SubList

返回指定的fromIndex(包含)和toIndex(不包含)之间的原始列表的子列表。

函数签名:

go
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}

DeleteIf

删除列表中所有符合函数(调用函数返回true)的元素,返回删除元素的数量

函数签名:

go
func (l *List[T]) DeleteIf(f func(T) bool) int
func (l *List[T]) DeleteIf(f func(T) bool) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/queue.html b/docs/.vitepress/dist/api/packages/datastructure/queue.html new file mode 100644 index 0000000..52901d1 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/queue.html @@ -0,0 +1,1334 @@ + + + + + + Queue | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Queue

队列数据结构,包括ArrayQueue, LinkedQueue, CircularQueue, and PriorityQueue。

源码

用法

go
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)

目录

1. ArrayQueue

2. LinkedQueue

3. CircularQueue

4. PriorityQueue

文档

1. ArrayQueue

切片实现普通队列数据结构

NewArrayQueue

返回具有特定容量的ArrayQueue指针

函数签名:

go
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *ArrayQueue[T]) Data() []T
func (q *ArrayQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *ArrayQueue[T]) Enqueue(item T) bool
func (q *ArrayQueue[T]) Enqueue(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *ArrayQueue[T]) Dequeue() (T, bool)
func (q *ArrayQueue[T]) Dequeue() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

获取对列头部元素

函数签名:

go
func (q *ArrayQueue[T]) Front() T
func (q *ArrayQueue[T]) Front() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

获取对列尾部元素

函数签名:

go
func (q *ArrayQueue[T]) Back() T
func (q *ArrayQueue[T]) Back() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

获取队列元素的数量

函数签名:

go
func (q *ArrayQueue[T]) Size() int
func (q *ArrayQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *ArrayQueue[T]) IsEmpty() bool
func (q *ArrayQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

判断对了是否为满

函数签名:

go
func (q *ArrayQueue[T]) IsFull() bool
func (q *ArrayQueue[T]) IsFull() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

清空队列元素

函数签名:

go
func (q *ArrayQueue[T]) Clear()
func (q *ArrayQueue[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

判断队列是否包含某个值

函数签名:

go
func (q *ArrayQueue[T]) Contain(value T) bool
func (q *ArrayQueue[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

2. LinkedQueue

链表实现普通队列数据结构

NewLinkedQueue

返回LinkedQueue指针

函数签名:

go
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *LinkedQueue[T]) Data() []T
func (q *LinkedQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *LinkedQueue[T]) Enqueue(value T)
func (q *LinkedQueue[T]) Enqueue(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *LinkedQueue[T]) Dequeue() (T, error)
func (q *LinkedQueue[T]) Dequeue() (T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

获取对列头部元素

函数签名:

go
func (q *LinkedQueue[T]) Front() (*T, error)
func (q *LinkedQueue[T]) Front() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

获取对列尾部元素

函数签名:

go
func (q *LinkedQueue[T]) Back() (*T, error)
func (q *LinkedQueue[T]) Back() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

获取队列元素的数量

函数签名:

go
func (q *LinkedQueue[T]) Size() int
func (q *LinkedQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *LinkedQueue[T]) IsEmpty() bool
func (q *LinkedQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

Clear

清空队列元素

函数签名:

go
func (q *LinkedQueue[T]) Clear()
func (q *LinkedQueue[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

判断队列是否包含某个值

函数签名:

go
func (q *LinkedQueue[T]) Contain(value T) bool
func (q *LinkedQueue[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

3. CircularQueue

切片实现的循环队列.

NewCircularQueue

返回具有特定容量的CircularQueue指针

函数签名:

go
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *CircularQueue[T]) Data() []T
func (q *CircularQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *CircularQueue[T]) Enqueue(value T) error
func (q *CircularQueue[T]) Enqueue(value T) error

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *CircularQueue[T]) Dequeue() (*T, bool)
func (q *CircularQueue[T]) Dequeue() (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

获取对列头部元素

函数签名:

go
func (q *CircularQueue[T]) Front() T
func (q *CircularQueue[T]) Front() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

获取对列尾部元素

函数签名:

go
func (q *CircularQueue[T]) Back() T
func (q *CircularQueue[T]) Back() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

获取队列元素的数量

函数签名:

go
func (q *CircularQueue[T]) Size() int
func (q *CircularQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *CircularQueue[T]) IsEmpty() bool
func (q *CircularQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

判断对了是否为满

函数签名:

go
func (q *CircularQueue[T]) IsFull() bool
func (q *CircularQueue[T]) IsFull() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

清空队列元素

函数签名:

go
func (q *CircularQueue[T]) Clear()
func (q *CircularQueue[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

判断队列是否包含某个值

函数签名:

go
func (q *CircularQueue[T]) Contain(value T) bool
func (q *CircularQueue[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

4. PriorityQueue

切片实现的额优先级队列。

NewPriorityQueue

返回一个具有特定容量的PriorityQueue指针,参数 `comarator` 用于比较队列中T类型的值。

函数签名:

go
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *PriorityQueue[T]) Data() []T
func (q *PriorityQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *PriorityQueue[T]) Enqueue(item T) bool
func (q *PriorityQueue[T]) Enqueue(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *PriorityQueue[T]) Dequeue() (T, bool)
func (q *PriorityQueue[T]) Dequeue() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *PriorityQueue[T]) IsEmpty() bool
func (q *PriorityQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

判断对了是否为满

函数签名:

go
func (q *PriorityQueue[T]) IsFull() bool
func (q *PriorityQueue[T]) IsFull() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}

Size

获取队列元素的数量

函数签名:

go
func (q *PriorityQueue[T]) Size() int
func (q *PriorityQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/set.html b/docs/.vitepress/dist/api/packages/datastructure/set.html new file mode 100644 index 0000000..197a293 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/set.html @@ -0,0 +1,598 @@ + + + + + + Set | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Set

Set 集合数据结构,类似列表。Set 中元素不重复。

源码

用法

go
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)

目录

文档

NewSet

返回Set结构体对象

函数签名:

go
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

NewSetFromSlice

基于切片创建集合

函数签名:

go
func NewSetFromSlice[T comparable](items []T) Set[T]
func NewSetFromSlice[T comparable](items []T) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}

Values

获取集合中所有元素的切片

函数签名:

go
func (s Set[T]) Values() []T
func (s Set[T]) Values() []T

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

Add

向集合中添加元素

函数签名:

go
func (s Set[T]) Add(items ...T)
func (s Set[T]) Add(items ...T)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}

AddIfNotExist

如果集合中不存在元素,则添加该元素返回true, 如果集合中存在元素, 不做任何操作,返回false

函数签名:

go
func (s Set[T]) AddIfNotExist(item T) bool
func (s Set[T]) AddIfNotExist(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}

AddIfNotExistBy

根据checker函数判断元素是否在集合中,如果集合中不存在元素且checker返回true,则添加该元素返回true, 否则不做任何操作,返回false

函数签名:

go
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}

Delete

删除集合中元素

函数签名:

go
func (s Set[T]) Delete(items ...T)
func (s Set[T]) Delete(items ...T)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}

Contain

判断集合是否包含某个值

函数签名:

go
func (s Set[T]) Contain(item T) bool
func (s Set[T]) Contain(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}

ContainAll

判断集合是否包含另一个集合

函数签名:

go
func (s Set[T]) ContainAll(other Set[T]) bool
func (s Set[T]) ContainAll(other Set[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}

Size

获取集合中元素的个数

函数签名:

go
func (s Set[T]) Size() int
func (s Set[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}

Clone

克隆一个集合

函数签名:

go
func (s Set[T]) Clone() Set[T]
func (s Set[T]) Clone() Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}

Equal

比较两个集合是否相等,包含相同元素为相等

函数签名:

go
func (s Set[T]) Equal(other Set[T]) bool
func (s Set[T]) Equal(other Set[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}

Iterate

迭代结合,在每个元素上调用函数

函数签名:

go
func (s Set[T]) Iterate(fn func(item T))
func (s Set[T]) Iterate(fn func(item T))

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}

EachWithBreak

遍历集合的元素并为每个元素调用iteratee函数,当iteratee函数返回false时,终止遍历。

函数签名:

go
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}

IsEmpty

判断集合是否为空

函数签名:

go
func (s Set[T]) IsEmpty() bool
func (s Set[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}

Union

求两个集合的并集

函数签名:

go
func (s Set[T]) Union(other Set[T]) Set[T]
func (s Set[T]) Union(other Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}

Intersection

求两个集合的交集

函数签名:

go
func (s Set[T]) Intersection(other Set[T]) Set[T]
func (s Set[T]) Intersection(other Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}

SymmetricDifference

返回一个集合,其中元素在第一个集合或第二个集合中,且不同时存在于两个集合中

函数签名:

go
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}

Minus

创建一个集合,其元素在原始集中但不在比较集中

函数签名:

go
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}

Pop

删除并返回集合中的顶部元素

函数签名:

go
func (s Set[T]) Pop() (v T, ok bool)
func (s Set[T]) Pop() (v T, ok bool)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/stack.html b/docs/.vitepress/dist/api/packages/datastructure/stack.html new file mode 100644 index 0000000..b881b0a --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/stack.html @@ -0,0 +1,572 @@ + + + + + + Stack | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Stack

栈数据结构,包括ArrayStack(数组栈)和LinkedStack(链表栈)。

源码

用法

go
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)

目录

1. ArrayStack(数组栈)

2. LinkedStack(链表栈)

文档

1. ArrayStack

用切片实现栈结构

NewArrayStack

返回ArrayStack指针实例

函数签名:

go
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}

Push

将元素加入数组栈

函数签名:

go
func (s *ArrayStack[T]) Push(value T)
func (s *ArrayStack[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

删除栈顶元素并返回该元素指针

函数签名:

go
func (s *ArrayStack[T]) Pop() (*T, error)
func (s *ArrayStack[T]) Pop() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

返回栈顶元素指针

函数签名:

go
func (s *ArrayStack[T]) Peak() (*T, error)
func (s *ArrayStack[T]) Peak() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

返回栈中所有元素组成的切片

函数签名:

go
func (s *ArrayStack[T]) Data() []T
func (s *ArrayStack[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

返回栈中元素的数量

函数签名:

go
func (s *ArrayStack[T]) Size() int
func (s *ArrayStack[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

判断栈是否为空

函数签名:

go
func (s *ArrayStack[T]) IsEmpty() bool
func (s *ArrayStack[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

清空栈元素,使栈为空

函数签名:

go
func (s *ArrayStack[T]) Clear()
func (s *ArrayStack[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

2. LinkedStack

链表实现的栈结构。

NewLinkedStack

返回LinkedStack指针实例

函数签名:

go
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}

Push

将元素加入链表栈

函数签名:

go
func (s *LinkedStack[T]) Push(value T)
func (s *LinkedStack[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

删除栈顶元素并返回该元素指针

函数签名:

go
func (s *LinkedStack[T]) Pop() (*T, error)
func (s *LinkedStack[T]) Pop() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

返回栈顶元素指针

函数签名:

go
func (s *LinkedStack[T]) Peak() (*T, error)
func (s *LinkedStack[T]) Peak() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

返回栈中所有元素组成的切片

函数签名:

go
func (s *LinkedStack[T]) Data() []T
func (s *LinkedStack[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

返回栈中元素的数量

函数签名:

go
func (s *LinkedStack[T]) Size() int
func (s *LinkedStack[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

判断栈是否为空

函数签名:

go
func (s *LinkedStack[T]) IsEmpty() bool
func (s *LinkedStack[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

清空栈元素,使栈为空

函数签名:

go
func (s *LinkedStack[T]) Clear()
func (s *LinkedStack[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

Print

打印链表栈结构

函数签名:

go
func (s *LinkedStack[T]) Print()
func (s *LinkedStack[T]) Print()

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datastructure/tree.html b/docs/.vitepress/dist/api/packages/datastructure/tree.html new file mode 100644 index 0000000..721e95e --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datastructure/tree.html @@ -0,0 +1,662 @@ + + + + + + Tree | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Tree

树是树节点的集合。 每个树节点都有一个值,一个指向左节点的左指针和一个指向右节点的右指针。

源码

用法

go
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)

目录

1. BSTree

文档

1. BSTree

BSTree是一种二叉搜索树数据结构,其中每个节点有两个孩子,分别称为左孩子和右孩子。 在 BSTree 中:leftNode < rootNode < rightNode。 T类型应该实现lancetconstraints.Comparator。

NewBSTree

返回BSTree指针实例

函数签名:

go
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}

Insert

将值插入二叉搜索树

函数签名:

go
func (t *BSTree[T]) Insert(data T)
func (t *BSTree[T]) Insert(data T)

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

Delete

删除插入二叉搜索树中指定的值

函数签名:

go
func (t *BSTree[T]) Delete(data T)
func (t *BSTree[T]) Delete(data T)

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}

PreOrderTraverse

按前序遍历树节点

函数签名:

go
func (t *BSTree[T]) PreOrderTraverse() []T
func (t *BSTree[T]) PreOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

InOrderTraverse

按中序遍历树节点

函数签名:

go
func (t *BSTree[T]) InOrderTraverse() []T
func (t *BSTree[T]) InOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}

PostOrderTraverse

按后序遍历树节点

函数签名:

go
func (t *BSTree[T]) PostOrderTraverse() []T
func (t *BSTree[T]) PostOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}

LevelOrderTraverse

按节点层次遍历树节点

函数签名:

go
func (t *BSTree[T]) LevelOrderTraverse() []T
func (t *BSTree[T]) LevelOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}

Depth

获取树的深度

函数签名:

go
func (t *BSTree[T]) Depth() int
func (t *BSTree[T]) Depth() int

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}

HasSubTree

判断给定树是否是子树

函数签名:

go
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}

Print

打印树结构

函数签名:

go
func (t *BSTree[T]) Print()
func (t *BSTree[T]) Print()

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \
+//      /   \
+//     /     \
+//    /       \
+//    5       7
+//   /
+//  /
+//  2
+//   \
+//    4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \
+//      /   \
+//     /     \
+//    /       \
+//    5       7
+//   /
+//  /
+//  2
+//   \
+//    4
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/datetime.html b/docs/.vitepress/dist/api/packages/datetime.html new file mode 100644 index 0000000..42e97c8 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/datetime.html @@ -0,0 +1,1426 @@ + + + + + + Datetime | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Datetime

datetime 日期时间处理包,格式化日期,比较日期。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)

目录

文档

注:

  1. 函数中format参数值需要传以下值之一 (忽略大小写):
  • yyyy-mm-dd hh:mm:ss
  • yyyy-mm-dd hh:mm
  • yyyy-mm-dd hh
  • yyyy-mm-dd
  • yyyy-mm
  • mm-dd
  • dd-mm-yy hh:mm:ss
  • yyyy/mm/dd hh:mm:ss
  • yyyy/mm/dd hh:mm
  • yyyy/mm/dd hh
  • yyyy/mm/dd
  • yyyy/mm
  • mm/dd
  • dd/mm/yy hh:mm:ss
  • yyyymmdd
  • mmddyy
  • yyyy
  • yy
  • mm
  • hh:mm:ss
  • hh:mm
  • mm:ss

AddDay

将日期加/减天数。

函数签名:

go
func AddDay(t time.Time, day int64) time.Time
func AddDay(t time.Time, day int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}

AddHour

将日期加/减小时数。

函数签名:

go
func AddHour(t time.Time, hour int64) time.Time
func AddHour(t time.Time, hour int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}

AddMinute

将日期加/减分钟数。

函数签名:

go
func AddMinute(t time.Time, minute int64) time.Time
func AddMinute(t time.Time, minute int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}

AddYear

将日期加/减年数。

函数签名:

go
func AddYear(t time.Time, year int64) time.Time
func AddYear(t time.Time, year int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}

BeginOfMinute

返回指定时间的分钟开始时间。

函数签名:

go
func BeginOfMinute(t time.Time) time.Time
func BeginOfMinute(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}

BeginOfHour

返回指定时间的小时开始时间。

函数签名:

go
func BeginOfHour(t time.Time) time.Time
func BeginOfHour(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}

BeginOfDay

返回指定时间的当天开始时间。

函数签名:

go
func BeginOfDay(t time.Time) time.Time
func BeginOfDay(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfWeek

返回指定时间的每周开始时间,默认开始时间星期日。

函数签名:

go
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfMonth

返回指定时间的当月开始时间。

函数签名:

go
func BeginOfMonth(t time.Time) time.Time
func BeginOfMonth(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

BeginOfYear

返回指定时间的当年开始时间

函数签名:

go
func BeginOfYear(t time.Time) time.Time
func BeginOfYear(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

EndOfMinute

返回指定时间的分钟结束时间。

函数签名:

go
func EndOfMinute(t time.Time) time.Time
func EndOfMinute(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}

EndOfHour

返回指定时间的小时结束时间。

函数签名:

go
func EndOfHour(t time.Time) time.Time
func EndOfHour(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}

EndOfDay

返回指定时间的当天结束时间。

函数签名:

go
func EndOfDay(t time.Time) time.Time
func EndOfDay(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}

EndOfWeek

返回指定时间的星期结束时间,默认结束时间星期六。

函数签名:

go
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}

EndOfMonth

返回指定时间的当月结束时间。

函数签名:

go
func EndOfMonth(t time.Time) time.Time
func EndOfMonth(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}

EndOfYear

返回指定时间的当年结束时间。

函数签名:

go
func EndOfYear(t time.Time) time.Time
func EndOfYear(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}

GetNowDate

获取当天日期,返回格式:yyyy-mm-dd。

函数签名:

go
func GetNowDate() string
func GetNowDate() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}

GetNowTime

获取当时时间,返回格式:hh:mm:ss

函数签名:

go
func GetNowTime() string
func GetNowTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime)
+
+    // Output:
+    // 15:57:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime)
+
+    // Output:
+    // 15:57:33
+}

GetNowDateTime

获取当时日期和时间,返回格式:yyyy-mm-dd hh:mm:ss。

函数签名:

go
func GetNowDateTime() string
func GetNowDateTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}

GetTodayStartTime

返回当天开始时间, 格式: yyyy-mm-dd 00:00:00。

函数签名:

go
func GetTodayStartTime() string
func GetTodayStartTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}

GetTodayEndTime

返回当天结束时间,格式: yyyy-mm-dd 23:59:59。

函数签名:

go
func GetTodayEndTime() string
func GetTodayEndTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}

GetZeroHourTimestamp

获取零点时间戳(timestamp of 00:00)

函数签名:

go
func GetZeroHourTimestamp() int64
func GetZeroHourTimestamp() int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}

GetNightTimestamp

获取午夜时间戳(timestamp of 23:59)。

函数签名:

go
func GetNightTimestamp() int64
func GetNightTimestamp() int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}

FormatTimeToStr

将日期格式化成字符串,`format` 参数格式参考注1。

函数签名:

go
func FormatTimeToStr(t time.Time, format string, timezone ...string) string
func FormatTimeToStr(t time.Time, format string, timezone ...string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}

FormatStrToTime

将字符串格式化成时间,`format` 参数格式参考注1。

函数签名:

go
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}

NewUnixNow

创建一个当前时间的unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewUnix

创建一个unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewFormat

创建一个yyyy-mm-dd hh:mm:ss格式时间字符串的unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}

NewISO8601

创建一个iso8601格式时间字符串的unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}

ToUnix

返回unix时间戳。

函数签名:

go
func (t *theTime) ToUnix() int64
func (t *theTime) ToUnix() int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}

ToFormat

返回格式'yyyy-mm-dd hh:mm:ss'的日期字符串。

函数签名:

go
func (t *theTime) ToFormat() string
func (t *theTime) ToFormat() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}

ToFormatForTpl

返回tpl格式指定的日期字符串。

函数签名:

go
func (t *theTime) ToFormatForTpl(tpl string) string
func (t *theTime) ToFormatForTpl(tpl string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}

ToIso8601

返回iso8601日期字符串。

函数签名:

go
func (t *theTime) ToIso8601() string
func (t *theTime) ToIso8601() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}

IsLeapYear

验证是否是闰年。

函数签名:

go
func IsLeapYear(year int) bool
func IsLeapYear(year int) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

BetweenSeconds

返回两个时间的间隔秒数。

函数签名:

go
func BetweenSeconds(t1 time.Time, t2 time.Time) int64
func BetweenSeconds(t1 time.Time, t2 time.Time) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}

DayOfYear

返回参数日期是一年中的第几天。

函数签名:

go
func DayOfYear(t time.Time) int
func DayOfYear(t time.Time) int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}

IsWeekend(已废弃, 使用 '== Weekday')

判断日期是否是周末。

函数签名:

go
func IsWeekend(t time.Time) bool
func IsWeekend(t time.Time) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

NowDateOrTime

根据指定的格式和时区返回当前时间字符串。

函数签名:

go
func NowDateOrTime(format string, timezone ...string) string
func NowDateOrTime(format string, timezone ...string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}

Timestamp

返回当前秒级时间戳。

函数签名:

go
func Timestamp(timezone ...string) int64
func Timestamp(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}

TimestampMilli

返回当前毫秒级时间戳。

函数签名:

go
func TimestampMilli(timezone ...string) int64
func TimestampMilli(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}

TimestampMicro

返回当前微秒级时间戳。

函数签名:

go
func TimestampMicro(timezone ...string) int64
func TimestampMicro(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}

TimestampNano

返回当前纳秒级时间戳。

函数签名:

go
func TimestampNano(timezone ...string) int64
func TimestampNano(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/fileutil.html b/docs/.vitepress/dist/api/packages/fileutil.html new file mode 100644 index 0000000..89b3f10 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/fileutil.html @@ -0,0 +1,808 @@ + + + + + + Fileutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Fileutil

fileutil 包支持文件基本操作。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)

目录

文档

ClearFile

清空文件内容

函数签名:

go
func ClearFile(path string) error
func ClearFile(path string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CreateFile

创建文件,创建成功返回true, 否则返回false

函数签名:

go
func CreateFile(path string) bool
func CreateFile(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}

CreateDir

使用绝对路径创建嵌套目录,例如/a/, /a/b

函数签名:

go
func CreateDir(absPath string) error
func CreateDir(absPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}

CopyFile

拷贝文件,会覆盖原有的文件

函数签名:

go
func CopyFile(srcPath string, dstPath string) error
func CopyFile(srcPath string, dstPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CurrentPath

返回当前位置的绝对路径。

函数签名:

go
func CurrentPath() string
func CurrentPath() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}

FileMode

获取文件mode信息

函数签名:

go
func FileMode(path string) (fs.FileMode, error)
func FileMode(path string) (fs.FileMode, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}

MiMeType

获取文件mime类型, 'file'参数的类型必须是string或者*os.File

函数签名:

go
func MiMeType(file any) string
func MiMeType(file any) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}

IsExist

判断文件或目录是否存在

函数签名:

go
func IsExist(path string) bool
func IsExist(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}

判断文件是否是符号链接

函数签名:

go
func IsLink(path string) bool
func IsLink(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}

IsDir

判断参数是否是目录

函数签名:

go
func IsDir(path string) bool
func IsDir(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}

ListFileNames

返回目录下所有文件名

函数签名:

go
func ListFileNames(path string) ([]string, error)
func ListFileNames(path string) ([]string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}

RemoveFile

删除文件

函数签名:

go
func RemoveFile(path string) error
func RemoveFile(path string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ReadFileToString

读取文件内容并返回字符串

函数签名:

go
func ReadFileToString(path string) (string, error)
func ReadFileToString(path string) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}

ReadFileByLine

按行读取文件内容,返回字符串切片包含每一行

函数签名:

go
func ReadFileByLine(path string)([]string, error)
func ReadFileByLine(path string)([]string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}

Zip

zip压缩文件, fpath参数可以是文件或目录

函数签名:

go
func Zip(fpath string, destPath string) error
func Zip(fpath string, destPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ZipAppendEntry

通过将单个文件或目录追加到现有的zip文件

函数签名:

go
func ZipAppendEntry(fpath string, destPath string) error
func ZipAppendEntry(fpath string, destPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

UnZip

zip解压缩文件并保存在目录中

函数签名:

go
func UnZip(zipFile string, destPath string) error
func UnZip(zipFile string, destPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

IsZipFile

判断文件是否是zip压缩文件。

函数签名:

go
func IsZipFile(filepath string) bool
func IsZipFile(filepath string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}

FileSize

返回文件字节大小。

函数签名:

go
func FileSize(path string) (int64, error)
func FileSize(path string) (int64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}

MTime

返回文件修改时间(unix timestamp).

函数签名:

go
func MTime(filepath string) (int64, error)
func MTime(filepath string) (int64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}

Sha

返回文件sha值,参数`shaType` 应传值为: 1, 256,512.

函数签名:

go
func Sha(filepath string, shaType ...int) (string, error)
func Sha(filepath string, shaType ...int) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}

ReadCsvFile

读取csv文件内容到切片

函数签名:

go
func ReadCsvFile(filepath string) ([][]string, error)
func ReadCsvFile(filepath string) ([][]string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}

WriteCsvFile

向csv文件写入内容。

函数签名:

go
func WriteCsvFile(filepath string, records [][]string, append bool) error
func WriteCsvFile(filepath string, records [][]string, append bool) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}

WriteBytesToFile

将bytes写入文件。

函数签名:

go
func WriteBytesToFile(filepath string, content []byte) error
func WriteBytesToFile(filepath string, content []byte) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}

WriteStringToFile

将字符串写入文件。

函数签名:

go
func WriteStringToFile(filepath string, content string, append bool) error
func WriteStringToFile(filepath string, content string, append bool) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/formatter.html b/docs/.vitepress/dist/api/packages/formatter.html new file mode 100644 index 0000000..80405fe --- /dev/null +++ b/docs/.vitepress/dist/api/packages/formatter.html @@ -0,0 +1,356 @@ + + + + + + Formatter | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Formatter

formatter 格式化器包含一些数据格式化处理方法。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)

目录

文档

Comma

用逗号每隔3位分割数字/字符串,支持前缀添加符号。参数value必须是数字或者可以转为数字的字符串, 否则返回空字符串

函数签名:

go
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}

Pretty

返回pretty JSON字符串.

函数签名:

go
func Pretty(v any) (string, error)
func Pretty(v any) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}

PrettyToWriter

Pretty encode数据到writer。

函数签名:

go
func PrettyToWriter(v any, out io.Writer) error
func PrettyToWriter(v any, out io.Writer) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string `json:"name"`
+        Aage uint   `json:"age"`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string `json:"name"`
+        Aage uint   `json:"age"`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}

DecimalBytes

返回十进制标准(以1000为基数)下的可读字节单位字符串。precision参数指定小数点后的位数,默认为4。

函数签名:

go
func DecimalBytes(size float64, precision ...int) string
func DecimalBytes(size float64, precision ...int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}

BinaryBytes

返回binary标准(以1024为基数)下的可读字节单位字符串。precision参数指定小数点后的位数,默认为4。

函数签名:

go
func BinaryBytes(size float64, precision ...int) string
func BinaryBytes(size float64, precision ...int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}

ParseDecimalBytes

将字节单位字符串转换成其所表示的字节数(以1000为基数)。

函数签名:

go
func ParseDecimalBytes(size string) (uint64, error)
func ParseDecimalBytes(size string) (uint64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}

ParseBinaryBytes

将字节单位字符串转换成其所表示的字节数(以1024为基数)。

函数签名:

go
func ParseBinaryBytes(size string) (uint64, error)
func ParseBinaryBytes(size string) (uint64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/function.html b/docs/.vitepress/dist/api/packages/function.html new file mode 100644 index 0000000..5149b6e --- /dev/null +++ b/docs/.vitepress/dist/api/packages/function.html @@ -0,0 +1,476 @@ + + + + + + Function | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Function

function 函数包控制函数执行流程,包含部分函数式编程。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/function"
+)
import (
+    "github.com/duke-git/lancet/v2/function"
+)

目录

文档

After

创建一个函数,当他被调用n或更多次之后将马上触发fn

函数签名:

go
func After(n int, fn any) func(args ...any) []reflect.Value
func After(n int, fn any) func(args ...any) []reflect.Value

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}

Before

创建一个函数,调用次数不超过n次,之后再调用这个函数,将返回一次最后调用fn的结果

函数签名:

go
func Before(n int, fn any) func(args ...any) []reflect.Value
func Before(n int, fn any) func(args ...any) []reflect.Value

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}

CurryFn

创建柯里化函数

函数签名:

go
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}

Compose

从右至左组合函数列表fnList,返回组合后的函数

函数签名:

go
func Compose[T any](fnList ...func(...T) T) func(...T) T
func Compose[T any](fnList ...func(...T) T) func(...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}

Debounced

创建一个debounced函数,该函数延迟调用fn直到自上次调用debounced函数后等待持续时间过去。

函数签名:

go
func Debounced(fn func(), duration time.Duration) func()
func Debounced(fn func(), duration time.Duration) func()

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}

Delay

延迟delay时间后调用函数

函数签名:

go
func Delay(delay time.Duration, fn any, args ...any)
func Delay(delay time.Duration, fn any, args ...any)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}

Schedule

每次持续时间调用函数,直到关闭返回的 bool chan

函数签名:

go
func Schedule(d time.Duration, fn any, args ...any) chan bool
func Schedule(d time.Duration, fn any, args ...any) chan bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}

Pipeline

执行函数pipeline.

函数签名:

go
func Pipeline[T any](funcs ...func(T) T) func(T) T
func Pipeline[T any](funcs ...func(T) T) func(T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}

Watcher

Watcher用于记录代码执行时间。可以启动/停止/重置手表定时器。获取函数执行的时间。

函数签名:

go
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start()
+func (w *Watcher) Stop()
+func (w *Watcher) Reset()
+func (w *Watcher) GetElapsedTime() time.Duration
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start()
+func (w *Watcher) Stop()
+func (w *Watcher) Reset()
+func (w *Watcher) GetElapsedTime() time.Duration

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/maputil.html b/docs/.vitepress/dist/api/packages/maputil.html new file mode 100644 index 0000000..7dea2e4 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/maputil.html @@ -0,0 +1,1658 @@ + + + + + + Maputil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Maputil

maputil 包包括一些操作 map 的函数。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)

目录:

API 文档:

MapTo

快速将map或者其他类型映射到结构体或者指定类型。

函数签名:

go
func MapTo(src any, dst any) error
func MapTo(src any, dst any) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  `json:"name"`
+            Age   int     `json:"age"`
+            Phone string  `json:"phone"`
+            Addr  Address `json:"address"`
+        }
+
+        Address struct {
+            Street string `json:"street"`
+            Number int    `json:"number"`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  `json:"name"`
+            Age   int     `json:"age"`
+            Phone string  `json:"phone"`
+            Addr  Address `json:"address"`
+        }
+
+        Address struct {
+            Street string `json:"street"`
+            Number int    `json:"number"`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}

ForEach

对map中的每对key和value执行iteratee函数

函数签名:

go
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}

Filter

迭代map中的每对key和value, 返回符合predicate函数的key, value。

函数签名:

go
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}

FilterByKeys

迭代map, 返回一个新map,其key都是给定的key值。

函数签名:

go
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}

FilterByValues

迭代map, 返回一个新map,其value都是给定的value值。

函数签名:

go
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}

OmitBy

Filter的反向操作, 迭代map中的每对key和value, 删除符合predicate函数的key, value, 返回新map。

函数签名:

go
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}

OmitByKeys

FilterByKeys的反向操作, 迭代map, 返回一个新map,其key不包括给定的key值。

函数签名:

go
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}

OmitByValues

FilterByValues的反向操作, 迭代map, 返回一个新map,其value不包括给定的value值。

函数签名:

go
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Intersect

多个map的交集操作

函数签名:

go
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}

Keys

返回map中所有key的切片

函数签名:

go
func Keys[K comparable, V any](m map[K]V) []K
func Keys[K comparable, V any](m map[K]V) []K

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Merge

合并多个maps, 相同的key会被后来的key覆盖

函数签名:

go
func Merge[K comparable, V any](maps ...map[K]V) map[K]V
func Merge[K comparable, V any](maps ...map[K]V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}

Minus

返回一个map,其中的key存在于mapA,不存在于mapB.

函数签名:

go
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}

Values

返回map中所有value的切片

函数签名:

go
func Values[K comparable, V any](m map[K]V) []V
func Values[K comparable, V any](m map[K]V) []V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    // Output:
+    // [a a b c d]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    // Output:
+    // [a a b c d]
+}

KeysBy

创建一个切片,其元素是每个map的key调用mapper函数的结果。

函数签名:

go
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}

ValuesBy

创建一个切片,其元素是每个map的value调用mapper函数的结果。

函数签名:

go
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}

MapKeys

操作map的每个key,然后转为新的map。

函数签名:

go
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}

MapValues

操作map的每个value,然后转为新的map。

函数签名:

go
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}

Entry

将map转换为键/值对切片。

函数签名:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}

FromEntries

基于键/值对的切片创建map。

函数签名:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Transform

将map转换为其他类型的map。

函数签名:

go
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2

示例:运行

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

IsDisjoint

验证两个map是否具有不同的key

函数签名:

go
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasKey

检查map是否包含某个key。用于代替以下样板代码:

go
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}

函数签名:

go
func HasKey[K comparable, V any](m map[K]V, key K) bool
func HasKey[K comparable, V any](m map[K]V, key K) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NewConcurrentMap

ConcurrentMap协程安全的map结构。

函数签名:

go
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}

ConcurrentMap_Set

在map中设置key和value。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Set(key K, value V)
func (cm *ConcurrentMap[K, V]) Set(key K, value V)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_Get

根据key获取value, 如果不存在key,返回零值。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_GetOrSet

返回键的现有值(如果存在),否则,设置key并返回给定值。

函数签名:

go
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}

ConcurrentMap_Delete

删除key。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Delete(key K)
func (cm *ConcurrentMap[K, V]) Delete(key K)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(i)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(i)
+    }
+    wg2.Wait()
+}

ConcurrentMap_GetAndDelete

获取key,然后删除。

函数签名:

go
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}

ConcurrentMap_Has

验证是否包含key。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Has(key K) bool
func (cm *ConcurrentMap[K, V]) Has(key K) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}

ConcurrentMap_Range

为map中每个键和值顺序调用迭代器。 如果iterator返回false,则停止迭代。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/mathutil.html b/docs/.vitepress/dist/api/packages/mathutil.html new file mode 100644 index 0000000..5cf9107 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/mathutil.html @@ -0,0 +1,1086 @@ + + + + + + Mathutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Mathutil

mathutil 包实现了一些数学计算的函数.

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)

目录

文档

Average

计算平均数. 可能需要对结果调用RoundToFloat方法四舍五入

函数签名:

go
func Average[T constraints.Integer | constraints.Float](numbers ...T) T
func Average[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}

Exponent

指数计算(x的n次方)

函数签名:

go
func Exponent(x, n int64) int64
func Exponent(x, n int64) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}

Fibonacci

计算斐波那契数列的第n个数

函数签名:

go
func Fibonacci(first, second, n int) int
func Fibonacci(first, second, n int) int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}

Factorial

计算阶乘

函数签名:

go
func Factorial(x uint) uint
func Factorial(x uint) uint

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}

Max

返回参数中的最大数

函数签名:

go
func Max[T constraints.Integer | constraints.Float](numbers ...T) T
func Max[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}

MaxBy

使用给定的比较器函数返回切片的最大值

函数签名:

go
func MaxBy[T any](slice []T, comparator func(T, T) bool) T
func MaxBy[T any](slice []T, comparator func(T, T) bool) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}

Min

返回参数中的最小数

函数签名:

go
func Min[T constraints.Integer | constraints.Float](numbers ...T) T
func Min[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}

MinBy

使用给定的比较器函数返回切片的最小值

函数签名:

go
func MinBy[T any](slice []T, comparator func(T, T) bool) T
func MinBy[T any](slice []T, comparator func(T, T) bool) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}

Percent

计算百分比,保留n位小数

函数签名:

go
func Percent(val, total float64, n int) float64
func Percent(val, total float64, n int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}

RoundToFloat

四舍五入,保留n位小数

函数签名:

go
func RoundToFloat(x float64, n int) float64
func RoundToFloat(x float64, n int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

RoundToString

四舍五入,保留n位小数,返回字符串

函数签名:

go
func RoundToString(x float64, n int) string
func RoundToString(x float64, n int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

TruncRound

截短n位小数(不进行四舍五入)

函数签名:

go
func TruncRound(x float64, n int) float64
func TruncRound(x float64, n int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}

Range

根据指定的起始值和数量,创建一个数字切片。

函数签名:

go
func Range[T constraints.Integer | constraints.Float](start T, count int) []T
func Range[T constraints.Integer | constraints.Float](start T, count int) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}

RangeWithStep

根据指定的起始值,结束值,步长,创建一个数字切片。

函数签名:

go
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}

AngleToRadian

将角度值转为弧度值

函数签名:

go
func AngleToRadian(angle float64) float64
func AngleToRadian(angle float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}

RadianToAngle

将弧度值转为角度值

函数签名:

go
func RadianToAngle(radian float64) float64
func RadianToAngle(radian float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}

PointDistance

计算两个坐标点的距离

函数签名:

go
func PointDistance(x1, y1, x2, y2 float64) float64
func PointDistance(x1, y1, x2, y2 float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}

IsPrime

判断质数。

函数签名:

go
func IsPrime(n int) bool
func IsPrime(n int) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

GCD

计算最大公约数。

函数签名:

go
func GCD[T constraints.Integer](integers ...T) T
func GCD[T constraints.Integer](integers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}

LCM

计算最小公倍数。

函数签名:

go
func LCM[T constraints.Integer](integers ...T) T
func LCM[T constraints.Integer](integers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}

Cos

计算弧度的余弦值

函数签名:

go
func Cos(radian float64, precision ...int) float64
func Cos(radian float64, precision ...int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}

Sin

计算弧度的正弦值

函数签名:

go
func Sin(radian float64, precision ...int) float64
func Sin(radian float64, precision ...int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}

Log

计算以base为底n的对数。

函数签名:

go
func Log(n, base float64) float64
func Log(n, base float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}

Sum

求传入参数之和。

函数签名:

go
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}

Abs

求绝对值。

函数签名:

go
func Abs[T constraints.Integer | constraints.Float](x T) T
func Abs[T constraints.Integer | constraints.Float](x T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/netutil.html b/docs/.vitepress/dist/api/packages/netutil.html new file mode 100644 index 0000000..044d1c8 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/netutil.html @@ -0,0 +1,1200 @@ + + + + + + Netutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Netutil

netutil 网络包支持获取 ip 地址,发送 http 请求。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)

目录

文档

ConvertMapToQueryString

将map转换成http查询字符串.

函数签名:

go
func ConvertMapToQueryString(param map[string]any) string
func ConvertMapToQueryString(param map[string]any) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    fmt.Println(qs)
+
+    // Output:
+    // a=1&b=2&c=3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    fmt.Println(qs)
+
+    // Output:
+    // a=1&b=2&c=3
+}

EncodeUrl

编码url query string的值

函数签名:

go
func EncodeUrl(urlStr string) (string, error)
func EncodeUrl(urlStr string) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}

GetInternalIp

获取内部ip

函数签名:

go
func GetInternalIp() string
func GetInternalIp() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}

GetIps

获取ipv4地址列表

函数签名:

go
func GetIps() []string
func GetIps() []string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}

GetMacAddrs

获取mac地址列

函数签名:

go
func GetMacAddrs() []string {
func GetMacAddrs() []string {

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}

GetPublicIpInfo

获取公网ip信息

函数签名:

go
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  `json:"status"`
+    Country     string  `json:"country"`
+    CountryCode string  `json:"countryCode"`
+    Region      string  `json:"region"`
+    RegionName  string  `json:"regionName"`
+    City        string  `json:"city"`
+    Lat         float64 `json:"lat"`
+    Lon         float64 `json:"lon"`
+    Isp         string  `json:"isp"`
+    Org         string  `json:"org"`
+    As          string  `json:"as"`
+    Ip          string  `json:"query"`
+}
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  `json:"status"`
+    Country     string  `json:"country"`
+    CountryCode string  `json:"countryCode"`
+    Region      string  `json:"region"`
+    RegionName  string  `json:"regionName"`
+    City        string  `json:"city"`
+    Lat         float64 `json:"lat"`
+    Lon         float64 `json:"lon"`
+    Isp         string  `json:"isp"`
+    Org         string  `json:"org"`
+    As          string  `json:"as"`
+    Ip          string  `json:"query"`
+}

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}

GetRequestPublicIp

获取http请求ip

函数签名:

go
func GetRequestPublicIp(req *http.Request) string
func GetRequestPublicIp(req *http.Request) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}

IsPublicIP

判断ip是否是公共ip

函数签名:

go
func IsPublicIP(IP net.IP) bool
func IsPublicIP(IP net.IP) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

IsInternalIP

判断ip是否是局域网ip.

函数签名:

go
func IsInternalIP(IP net.IP) bool
func IsInternalIP(IP net.IP) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HttpRequest

HttpRequest用于抽象HTTP请求实体的结构

函数签名:

go
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}

HttpClient

HttpClient是用于发送HTTP请求的结构体。它可以用一些配置参数或无配置实例化.

函数签名:

go
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}

SendRequest

HttpClient发送http请求

函数签名:

go
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

DecodeResponse

解析http响应体到目标结构体

函数签名:

go
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

StructToUrlValues

将结构体转为url values, 仅转化结构体导出字段并且包含`json` tag

函数签名:

go
func StructToUrlValues(targetStruct any) url.Values
func StructToUrlValues(targetStruct any) url.Values

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Name   string `json:"name,omitempty"`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Name   string `json:"name,omitempty"`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}

HttpGet

发送http get请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpGet(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpGet(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPost

发送http post请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPost(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPost(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPut

发送http put请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPut(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPut(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpDelete

发送http delete请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpDelete(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpDelete(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPatch

发送http patch请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPatch(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPatch(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

ParseHttpResponse

将http请求响应解码成特定struct值

函数签名:

go
func ParseHttpResponse(resp *http.Response, obj any) error
func ParseHttpResponse(resp *http.Response, obj any) error

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    `json:"id"`
+        UserId    int    `json:"userId"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    `json:"id"`
+        UserId    int    `json:"userId"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}

DownloadFile

从指定的server地址下载文件。

函数签名:

go
func DownloadFile(filepath string, url string) error
func DownloadFile(filepath string, url string) error

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}

UploadFile

将文件上传指定的server地址。

函数签名:

go
func UploadFile(filepath string, server string) (bool, error)
func UploadFile(filepath string, server string) (bool, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}

IsPingConnected

检查能否ping通主机。

函数签名:

go
func IsPingConnected(host string) bool
func IsPingConnected(host string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsTelnetConnected

检查能否telnet到主机。

函数签名:

go
func IsTelnetConnected(host string, port string) bool
func IsTelnetConnected(host string, port string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/pointer.html b/docs/.vitepress/dist/api/packages/pointer.html new file mode 100644 index 0000000..731fb4f --- /dev/null +++ b/docs/.vitepress/dist/api/packages/pointer.html @@ -0,0 +1,260 @@ + + + + + + Pointer | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Pointer

pointer 包支持一些指针类型的操作。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)

目录

文档

Of

返回传入参数的指针值。

函数签名:

go
func Of[T any](v T) *T
func Of[T any](v T) *T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}

Unwrap

返回传入指针指向的值。

函数签名:

go
func Unwrap[T any](p *T) T
func Unwrap[T any](p *T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}

ExtractPointer

返回传入interface的底层值。

函数签名:

go
func ExtractPointer(value any) any
func ExtractPointer(value any) any

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}

UnwarpOr

返回指针的值,如果指针为零值,则返回fallback。

函数签名:

go
UnwarpOr[T any](p *T, fallback T) T
UnwarpOr[T any](p *T, fallback T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}

UnwarpOrDefault

返回指针的值,如果指针为零值,则返回相应零值。

函数签名:

go
UnwarpOrDefault[T any](p *T) T
UnwarpOrDefault[T any](p *T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/random.html b/docs/.vitepress/dist/api/packages/random.html new file mode 100644 index 0000000..0e0a296 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/random.html @@ -0,0 +1,218 @@ + + + + + + Random | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Random

random 随机数生成器包,可以生成随机[]bytes, int, string。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/random"
+)
import (
+    "github.com/duke-git/lancet/v2/random"
+)

目录

文档

RandBytes

生成随机字节切片

函数签名:

go
func RandBytes(length int) []byte
func RandBytes(length int) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}

RandInt

生成随机int, 范围[min, max)

函数签名:

go
func RandInt(min, max int) int
func RandInt(min, max int) int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}

RandString

生成给定长度的随机字符串,只包含字母(a-zA-Z)

函数签名:

go
func RandString(length int) string
func RandString(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}

RandUpper

生成给定长度的随机大写字母字符串

函数签名:

go
func RandUpper(length int) string
func RandUpper(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}

RandLower

生成给定长度的随机小写字母字符串

函数签名:

go
func RandLower(length int) string
func RandLower(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}

RandNumeral

生成给定长度的随机数字字符串

函数签名:

go
func RandNumeral(length int) string
func RandNumeral(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}

RandNumeralOrLetter

生成给定长度的随机字符串(数字+字母)

函数签名:

go
func RandNumeralOrLetter(length int) string
func RandNumeralOrLetter(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}

UUIdV4

生成UUID v4字符串

函数签名:

go
func UUIdV4() (string, error)
func UUIdV4() (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}

RandUniqueIntSlice

生成一个不重复的长度为n的随机int切片。

函数签名:

go
func RandUniqueIntSlice(n, min, max int) []int
func RandUniqueIntSlice(n, min, max int) []int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/retry.html b/docs/.vitepress/dist/api/packages/retry.html new file mode 100644 index 0000000..90643af --- /dev/null +++ b/docs/.vitepress/dist/api/packages/retry.html @@ -0,0 +1,328 @@ + + + + + + Retry | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Retry

retry 重试执行函数直到函数运行成功或被 context cancel。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/retry"
+)
import (
+    "github.com/duke-git/lancet/v2/retry"
+)

目录

文档

Context

设置重试context参数

函数签名:

go
func Context(ctx context.Context)
func Context(ctx context.Context)

示例:运行

go
import (
+    "context"
+    "errors"
+    "fmt"
+    "lancet-demo/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}
import (
+    "context"
+    "errors"
+    "fmt"
+    "lancet-demo/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}

RetryFunc

被重试执行的函数

函数签名:

go
type RetryFunc func() error
type RetryFunc func() error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

RetryTimes

设置重试次数,默认5

函数签名:

go
func RetryTimes(n uint)
func RetryTimes(n uint)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}

RetryDuration

设置重试间隔时间,默认3秒

函数签名:

go
func RetryDuration(d time.Duration)
func RetryDuration(d time.Duration)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

Retry

重试执行函数retryFunc,直到函数运行成功,或被context停止

函数签名:

go
func Retry(retryFunc RetryFunc, opts ...Option) error
func Retry(retryFunc RetryFunc, opts ...Option) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/slice.html b/docs/.vitepress/dist/api/packages/slice.html new file mode 100644 index 0000000..a1b6c9d --- /dev/null +++ b/docs/.vitepress/dist/api/packages/slice.html @@ -0,0 +1,2536 @@ + + + + + + Slice | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Slice

slice 包包含操作切片的方法集合。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/slice"
+)
import (
+    "github.com/duke-git/lancet/v2/slice"
+)

目录

文档

AppendIfAbsent

当前切片中不包含值时,将该值追加到切片中

函数签名:

go
func AppendIfAbsent[T comparable](slice []T, item T) []T
func AppendIfAbsent[T comparable](slice []T, item T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}

Contain

判断slice是否包含value

函数签名:

go
func Contain[T comparable](slice []T, target T) bool
func Contain[T comparable](slice []T, target T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainBy

根据predicate函数判断切片是否包含某个值。

函数签名:

go
func ContainBy[T any](slice []T, predicate func(item T) bool) bool
func ContainBy[T any](slice []T, predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}

ContainSubSlice

判断slice是否包含subslice

函数签名:

go
func ContainSubSlice[T comparable](slice, subSlice []T) bool
func ContainSubSlice[T comparable](slice, subSlice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Chunk

按照size参数均分slice

函数签名:

go
func Chunk[T any](slice []T, size int) [][]T
func Chunk[T any](slice []T, size int) [][]T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}

Compact

去除slice中的假值(false values are false, nil, 0, "")

函数签名:

go
func Compact[T comparable](slice []T) []T
func Compact[T comparable](slice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}

Concat

合并多个slices到slice中

函数签名:

go
func Concat[T any](slice []T, slices ...[]T) []T
func Concat[T any](slice []T, slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}

Count

返回切片中指定元素的个数

函数签名:

go
func Count[T comparable](slice []T, item T) int
func Count[T comparable](slice []T, item T) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}

CountBy

遍历切片,对每个元素执行函数predicate. 返回符合函数返回值为true的元素的个数.

函数签名:

go
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}

Difference

创建一个切片,其元素不包含在另一个给定切片中

函数签名:

go
func Difference[T comparable](slice, comparedSlice []T) []T
func Difference[T comparable](slice, comparedSlice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

DifferenceBy

将两个slice中的每个元素调用iteratee函数,并比较它们的返回值,如果不相等返回在slice中对应的值

函数签名:

go
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}

DifferenceWith

接受比较器函数,该比较器被调用以将切片的元素与值进行比较。 结果值的顺序和引用由第一个切片确定

函数签名:

go
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}

DeleteAt

删除切片中指定开始索引到结束索引的元素

函数签名:

go
func DeleteAt[T any](slice []T, start int, end ...int)
func DeleteAt[T any](slice []T, start int, end ...int)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+
+}

Drop

从切片的头部删除n个元素。

函数签名:

go
func Drop[T any](slice []T, n int) []T
func Drop[T any](slice []T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}

DropRight

从切片的尾部删除n个元素。

函数签名:

go
func DropRight[T any](slice []T, n int) []T
func DropRight[T any](slice []T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}

DropWhile

从切片的头部删除n个元素,这个n个元素满足predicate函数返回true。

函数签名:

go
func DropWhile[T any](slice []T, predicate func(item T) bool) []T
func DropWhile[T any](slice []T, predicate func(item T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}

DropRightWhile

从切片的尾部删除n个元素,这个n个元素满足predicate函数返回true。

函数签名:

go
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}

Every

如果切片中的所有值都通过谓词函数,则返回true。 函数签名应该是func(index int, value any) bool

函数签名:

go
func Every[T any](slice []T, predicate func(index int, item T) bool) bool
func Every[T any](slice []T, predicate func(index int, item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}

Equal

检查两个切片是否相等,相等条件:切片长度相同,元素顺序和值都相同

函数签名:

go
func Equal[T comparable](slice1, slice2 []T) bool
func Equal[T comparable](slice1, slice2 []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

EqualWith

检查两个切片是否相等,相等条件:对两个切片的元素调用比较函数comparator,返回true

函数签名:

go
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

Filter

返回切片中通过predicate函数真值测试的所有元素

函数签名:

go
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}

Find (废弃:使用 FindBy)

遍历slice的元素,返回第一个通过predicate函数真值测试的元素

函数签名:

go
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindBy

遍历slice的元素,返回第一个通过predicate函数真值测试的元素

函数签名:

go
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindLast(废弃:使用 FindLastBy)

遍历slice的元素,返回最后一个通过predicate函数真值测试的元素。

函数签名:

go
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

FindLastBy

从遍历slice的元素,返回最后一个通过predicate函数真值测试的元素。

函数签名:

go
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Flatten

将切片压平一层

函数签名:

go
func Flatten(slice any) any
func Flatten(slice any) any

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}

FlattenDeep

flattens slice recursive.

函数签名:

go
func FlattenDeep(slice any) any
func FlattenDeep(slice any) any

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}

ForEach

遍历切片的元素并为每个元素调用iteratee函数

函数签名:

go
func ForEach[T any](slice []T, iteratee func(index int, item T))
func ForEach[T any](slice []T, iteratee func(index int, item T))

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

ForEachWithBreak

遍历切片的元素并为每个元素调用iteratee函数,当iteratee函数返回false时,终止遍历。

函数签名:

go
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}

GroupBy

迭代切片的元素,每个元素将按条件分组,返回两个切片

函数签名:

go
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}

GroupWith

创建一个map,key是iteratee遍历slice中的每个元素返回的结果。 分组值的顺序是由他们出现在slice中的顺序确定的。每个键对应的值负责生成key的元素组成的数组。iteratee调用1个参数: (value)

函数签名:

go
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}

IntSlice (已弃用: 使用 go1.18+泛型代替)

将接口切片转换为int切片

函数签名:

go
func IntSlice(slice any) []int
func IntSlice(slice any) []int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

InterfaceSlice(已弃用: 使用 go1.18+泛型代替)

将值转换为接口切片

函数签名:

go
func InterfaceSlice(slice any) []any
func InterfaceSlice(slice any) []any

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

Intersection

多个切片的交集

函数签名:

go
func Intersection[T comparable](slices ...[]T) []T
func Intersection[T comparable](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}

InsertAt

将元素插入到索引处的切片中

函数签名:

go
func InsertAt[T any](slice []T, index int, value any) []T
func InsertAt[T any](slice []T, index int, value any) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}

IndexOf

返回在切片中找到值的第一个匹配项的索引,如果找不到值,则返回-1

函数签名:

go
func IndexOf[T comparable](slice []T, item T) int
func IndexOf[T comparable](slice []T, item T) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LastIndexOf

返回在切片中找到最后一个值的索引,如果找不到该值,则返回-1

函数签名:

go
func LastIndexOf[T comparable](slice []T, item T) int
func LastIndexOf[T comparable](slice []T, item T) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}

Map

对slice中的每个元素执行map函数以创建一个新切片

函数签名:

go
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

FilterMap

返回一个将filter和map操作应用于给定切片的切片。 iteratee回调函数应该返回两个值:1,结果值。2,结果值是否应该被包含在返回的切片中。

函数签名:

go
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}

FlatMap

将切片转换为其它类型切片。

函数签名:

go
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}

Merge

合并多个切片(不会消除重复元素).

函数签名:

go
func Merge[T any](slices ...[]T) []T
func Merge[T any](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}

Reverse

反转切片中的元素顺序

函数签名:

go
func Reverse[T any](slice []T)
func Reverse[T any](slice []T)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}

Reduce

将切片中的元素依次运行iteratee函数,返回运行结果(废弃:建议使用ReduceBy)

函数签名:

go
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

ReduceBy

对切片元素执行reduce操作。

函数签名:

go
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}

ReduceRight

类似ReduceBy操作,迭代切片元素顺序从右至左。

函数签名:

go
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}

Replace

返回切片的副本,其中前n个不重叠的old替换为new

函数签名:

go
func Replace[T comparable](slice []T, old T, new T, n int) []T
func Replace[T comparable](slice []T, old T, new T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}

ReplaceAll

返回切片的副本,将其中old全部替换为new

函数签名:

go
func ReplaceAll[T comparable](slice []T, old T, new T) []T
func ReplaceAll[T comparable](slice []T, old T, new T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}

Repeat

创建一个切片,包含n个传入的item

函数签名:

go
func Repeat[T any](item T, n int) []T
func Repeat[T any](item T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}

Shuffle

随机打乱切片中的元素顺序

函数签名:

go
func Shuffle[T any](slice []T) []T
func Shuffle[T any](slice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}

IsAscending

检查切片元素是否按升序排列。

函数签名:

go
func IsAscending[T constraints.Ordered](slice []T) bool
func IsAscending[T constraints.Ordered](slice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsDescending

检查切片元素是否按降序排列。

函数签名:

go
func IsDescending[T constraints.Ordered](slice []T) bool
func IsDescending[T constraints.Ordered](slice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsSorted

检查切片元素是否是有序的(升序或降序)。

函数签名:

go
func IsSorted[T constraints.Ordered](slice []T) bool
func IsSorted[T constraints.Ordered](slice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsSortedByKey

通过iteratee函数,检查切片元素是否是有序的。

函数签名:

go
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

Sort

对任何有序类型(数字或字符串)的切片进行排序,使用快速排序算法。 默认排序顺序为升序 (asc),如果需要降序,请将参数 `sortOrder` 设置为 `desc`。 Ordered类型:数字(所有整数浮点数)或字符串。

函数签名:

go
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}

SortBy

按照less函数确定的升序规则对切片进行排序。排序不保证稳定性

函数签名:

go
func SortBy[T any](slice []T, less func(a, b T) bool)
func SortBy[T any](slice []T, less func(a, b T) bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}

SortByField (已弃用: 请使用 Sort 或 SortBy 代替该方法)

按字段对结构切片进行排序。slice元素应为struct,字段类型应为int、uint、string或bool。 默认排序类型是升序(asc),如果是降序,设置 sortType 为 desc

函数签名:

go
func SortByField(slice any, field string, sortType ...string) error
func SortByField(slice any, field string, sortType ...string) error

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}

Some

如果列表中的任何值通过谓词函数,则返回true

函数签名:

go
func Some[T any](slice []T, predicate func(index int, item T) bool) bool
func Some[T any](slice []T, predicate func(index int, item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

StringSlice(已弃用: 使用 go1.18+泛型代替)

将接口切片转换为字符串切片

函数签名:

go
func StringSlice(slice any) []string
func StringSlice(slice any) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

SymmetricDifference

返回一个切片,其中的元素存在于参数切片中,但不同时存储在于参数切片中(交集取反)

函数签名:

go
func SymmetricDifference[T comparable](slices ...[]T) []T
func SymmetricDifference[T comparable](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

ToSlice

将可变参数转为切片

函数签名:

go
func ToSlice[T any](items ...T) []T
func ToSlice[T any](items ...T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

ToSlicePointer

将可变参数转为指针切片

函数签名:

go
func ToSlicePointer[T any](items ...T) []*T
func ToSlicePointer[T any](items ...T) []*T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}

Unique

删除切片中的重复元素

函数签名:

go
func Unique[T comparable](slice []T) []T
func Unique[T comparable](slice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}

UniqueBy

对切片的每个元素调用iteratee函数,然后删除重复元素

函数签名:

go
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}

Union

合并多个切片

函数签名:

go
func Union[T comparable](slices ...[]T) []T
func Union[T comparable](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}

UnionBy

对切片的每个元素调用函数后,合并多个切片

函数签名:

go
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}

UpdateAt

更新索引处的切片元素。 如果index < 0或 index <= len(slice),将返回错误

函数签名:

go
func UpdateAt[T any](slice []T, index int, value T) []T
func UpdateAt[T any](slice []T, index int, value T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}

Without

创建一个不包括所有给定值的切片

函数签名:

go
func Without[T comparable](slice []T, items ...T) []T
func Without[T comparable](slice []T, items ...T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

KeyBy

将切片每个元素调用函数后转为map。

函数签名:

go
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}

Join

用指定的分隔符链接切片元素。

函数签名:

go
func Join[T any](s []T, separator string) string
func Join[T any](s []T, separator string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/stream.html b/docs/.vitepress/dist/api/packages/stream.html new file mode 100644 index 0000000..3329d34 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/stream.html @@ -0,0 +1,972 @@ + + + + + + Stream | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Stream

Stream 流,该包仅验证简单 stream 实现,功能有限。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/stream"
+)
import (
+    "github.com/duke-git/lancet/v2/stream"
+)

目录

文档

Of

创建元素为指定值的stream。

函数签名:

go
func Of[T any](elems ...T) stream[T]
func Of[T any](elems ...T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromSlice

从切片创建stream。

函数签名:

go
func FromSlice[T any](source []T) stream[T]
func FromSlice[T any](source []T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromChannel

从通道创建stream。

函数签名:

go
func FromChannel[T any](source <-chan T) stream[T]
func FromChannel[T any](source <-chan T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromRange

指定一个范围创建stream, 范围两端点值都包括在内。

函数签名:

go
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Generate

创建一个stream,其中每个元素都由提供的生成器函数生成

函数签名:

go
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

Concat

创建一个延迟连接stream,其元素是第一个stream的所有元素,后跟第二个stream的全部元素。

函数签名:

go
func Concat[T any](a, b stream[T]) stream[T]
func Concat[T any](a, b stream[T]) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

Distinct

创建并返回一个stream,用于删除重复的项。 支持链式操作

函数签名:

go
func (s stream[T]) Distinct() stream[T]
func (s stream[T]) Distinct() stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}

Filter

返回一个通过判定函数的stream 支持链式操作

函数签名:

go
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}

Map

返回一个stream,该stream由将给定函数应用于源stream元素的元素组成。支持链式操作

函数签名:

go
func (s stream[T]) Map(mapper func(item T) T) stream[T]
func (s stream[T]) Map(mapper func(item T) T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}

Peek

返回一个由源stream的元素组成的stream,并在从生成的stream中消耗元素时对每个元素执行所提供的操作。 支持链式操作

函数签名:

go
func (s stream[T]) Peek(consumer func(item T)) stream[T]
func (s stream[T]) Peek(consumer func(item T)) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}

Skip

在丢弃stream的前n个元素后,返回由源stream的其余元素组成的stream。如果此stream包含的元素少于n个,则将返回一个空stream。支持链式操作

函数签名:

go
func (s stream[T]) Skip(n int) stream[T]
func (s stream[T]) Skip(n int) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}

Limit

返回由源stream的元素组成的stream,该stream被截断为长度不超过maxSize。支持链式操作

函数签名:

go
func (s stream[T]) Limit(maxSize int) stream[T]
func (s stream[T]) Limit(maxSize int) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}

Reverse

返回元素与源stream的顺序相反的stream。支持链式操作

函数签名:

go
func (s stream[T]) Reverse() stream[T]
func (s stream[T]) Reverse() stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}

Range

返回一个stream,该stream的元素在从源stream的开始(包含)到结束(排除)的范围内。支持链式操作

函数签名:

go
func (s stream[T]) Range(start, end int) stream[T]
func (s stream[T]) Range(start, end int) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}

Sorted

返回一个stream,该stream由源stream的元素组成,并根据提供的less函数进行排序。支持链式操作

函数签名:

go
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}

ForEach

对stream的每个元素执行一个操作。

函数签名:

go
func (s stream[T]) ForEach(action func(item T))
func (s stream[T]) ForEach(action func(item T))

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

Reduce

使用关联累加函数对stream的元素执行reduce操作,并reduce操作结果(如果有)。

函数签名:

go
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

FindFirst

返回此stream的第一个元素和true,如果stream为空,则返回零值和false。

函数签名:

go
func (s stream[T]) FindFirst() (T, bool)
func (s stream[T]) FindFirst() (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

FindLast

返回此stream最后一个元素和true,如果stream为空,则返回零值和false。

函数签名:

go
func (s stream[T]) FindLast() (T, bool)
func (s stream[T]) FindLast() (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

Max

根据提供的less函数返回stream的最大元素。less 函数: a > b

函数签名:

go
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Min

根据提供的less函数返回stream的最小元素。less函数: a < b

函数签名:

go
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

AllMatch

判断stream的所有元素是否全部匹配指定判定函数。

函数签名:

go
func (s stream[T]) AllMatch(predicate func(item T) bool) bool
func (s stream[T]) AllMatch(predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

AnyMatch

判断stream是否包含匹配指定判定函数的元素。

函数签名:

go
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NoneMatch

判断stream的元素是否全部不匹配指定的判定函数。

函数签名:

go
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Count

返回stream中元素的数量。

函数签名:

go
func (s stream[T]) Count() int
func (s stream[T]) Count() int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}

ToSlice

返回stream中的元素切片。

函数签名:

go
func (s stream[T]) ToSlice() []T
func (s stream[T]) ToSlice() []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/struct.html b/docs/.vitepress/dist/api/packages/struct.html new file mode 100644 index 0000000..113e64a --- /dev/null +++ b/docs/.vitepress/dist/api/packages/struct.html @@ -0,0 +1,586 @@ + + + + + + Structs | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Structs

structs 包封装了一个抽象的Struct结构体,提供了操作struct的相关函数

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/structs"
+)
import (
+    "github.com/duke-git/lancet/v2/structs"
+)

目录:

API 文档:

New

`Struct`结构体的构造函数

函数签名:

go
func New(value any, tagName ...string) *Struct
func New(value any, tagName ...string) *Struct

示例:

go
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}

ToMap

将一个合法的struct对象转换为map[string]any

函数签名:

go
func (s *Struct) ToMap() (map[string]any, error)
func (s *Struct) ToMap() (map[string]any, error)

除此之外,提供一个便捷的静态方法 ToMap

go
func ToMap(v any) (map[string]any, error)
func ToMap(v any) (map[string]any, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // 如果不需要Struct更多的方法,可以直接使用ToMap
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // 如果不需要Struct更多的方法,可以直接使用ToMap
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}

Fields

获取一个struct对象的属性列表

函数签名:

go
func (s *Struct) Fields() []*Field
func (s *Struct) Fields() []*Field

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}

Field

根据属性名获取一个struct对象的属性

函数签名:

go
func (s *Struct) Field(name string) *Field
func (s *Struct) Field(name string) *Field

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}

IsStruct

判断是否为一个合法的struct对象

函数签名:

go
func (s *Struct) IsStruct() bool
func (s *Struct) IsStruct() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}

Tag

获取`Field`的`Tag`,默认的tag key是json

函数签名:

go
func (f *Field) Tag() *Tag
func (f *Field) Tag() *Tag

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+    
+    // Output:
+    // name
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+    
+    // Output:
+    // name
+}

Value

获取`Field`属性的值

函数签名:

go
func (f *Field) Value() any
func (f *Field) Value() any

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    
+    fmt.Println(n.Value())
+    
+    // Output: 
+    // 111
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    
+    fmt.Println(n.Value())
+    
+    // Output: 
+    // 111
+}

IsEmbedded

判断属性是否为嵌入

函数签名:

go
func (f *Field) IsEmbedded() bool
func (f *Field) IsEmbedded() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+    
+    // Output: 
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+    
+    // Output: 
+    // true
+    // false
+}

IsExported

判断属性是否导出

函数签名:

go
func (f *Field) IsExported() bool
func (f *Field) IsExported() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+    
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+    
+    // Output: 
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+    
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+    
+    // Output: 
+    // true
+    // false
+}

IsZero

判断属性是否为零值

函数签名:

go
func (f *Field) IsZero() bool
func (f *Field) IsZero() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+    
+    // Output: 
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+    
+    // Output: 
+    // true
+    // false
+}

Name

获取属性名

函数签名:

go
func (f *Field) Name() string
func (f *Field) Name() string

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+    
+    // Output: 
+    // Name
+    // Age
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+    
+    // Output: 
+    // Name
+    // Age
+}

Kind

获取属性Kind

函数签名:

go
func (f *Field) Kind() reflect.Kind
func (f *Field) Kind() reflect.Kind

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+    
+    // Output: 
+    // string
+    // int
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+    
+    // Output: 
+    // string
+    // int
+}

IsSlice

判断属性是否是切片

函数签名:

go
func (f *Field) IsSlice() bool
func (f *Field) IsSlice() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+    
+    fmt.Println(a.IsSlice())
+    
+    // Output: 
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+    
+    fmt.Println(a.IsSlice())
+    
+    // Output: 
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/strutil.html b/docs/.vitepress/dist/api/packages/strutil.html new file mode 100644 index 0000000..5021c4b --- /dev/null +++ b/docs/.vitepress/dist/api/packages/strutil.html @@ -0,0 +1,1566 @@ + + + + + + Strutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Strutil

strutil 包含处理字符串的相关函数。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)

目录

文档

After

返回源字符串中特定字符串首次出现时的位置之后的子字符串。

函数签名:

go
func After(s, char string) string
func After(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}

AfterLast

返回源字符串中指定字符串最后一次出现时的位置之后的子字符串。

函数签名:

go
func AfterLast(s, char string) string
func AfterLast(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}

Before

返回源字符串中指定字符串第一次出现时的位置之前的子字符串。

函数签名:

go
func Before(s, char string) string
func Before(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}

BeforeLast

返回源字符串中指定字符串最后一次出现时的位置之前的子字符串。

函数签名:

go
func BeforeLast(s, char string) string
func BeforeLast(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}

CamelCase

将字符串转换为驼峰式字符串, 非字母和数字会被忽略。

函数签名:

go
func CamelCase(s string) string
func CamelCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}

KebabCase

将字符串转换为kebab-case, 非字母和数字会被忽略。

函数签名:

go
func KebabCase(s string) string
func KebabCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}

UpperKebabCase

将字符串转换为大写KEBAB-CASE, 非字母和数字会被忽略。

函数签名:

go
func UpperKebabCase(s string) string
func UpperKebabCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}

Capitalize

将字符串的第一个字符转换为大写。

函数签名:

go
func Capitalize(s string) string
func Capitalize(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}

IsString

判断传入参数的数据类型是否为字符串。

函数签名:

go
func IsString(v any) bool
func IsString(v any) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LowerFirst

将字符串的第一个字符转换为小写。

函数签名:

go
func LowerFirst(s string) string
func LowerFirst(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}

UpperFirst

将字符串的第一个字符转换为大写形式。

函数签名:

go
func UpperFirst(s string) string
func UpperFirst(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}

Pad

如果字符串长度短于size,则在左右两侧填充字符串。

函数签名:

go
func Pad(source string, size int, padStr string) string
func Pad(source string, size int, padStr string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}

PadEnd

如果字符串长度短于size,则在右侧填充字符串。

函数签名:

go
func PadEnd(source string, size int, padStr string) string
func PadEnd(source string, size int, padStr string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}

PadStart

如果字符串长度短于size,则在左侧填充字符串。

函数签名:

go
func PadStart(source string, size int, padStr string) string
func PadStart(source string, size int, padStr string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}

Reverse

返回字符顺序与给定字符串相反的字符串。

函数签名:

go
func Reverse(s string) string
func Reverse(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}

SnakeCase

将字符串转换为snake_case形式, 非字母和数字会被忽略。

函数签名:

go
func SnakeCase(s string) string
func SnakeCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}

UpperSnakeCase

将字符串转换为大写SNAKE_CASE形式, 非字母和数字会被忽略。

函数签名:

go
func UpperSnakeCase(s string) string
func UpperSnakeCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}

SplitEx

分割字符串为切片,removeEmptyString参数指定是否去除空字符串。

函数签名:

go
func SplitEx(s, sep string, removeEmptyString bool) []string
func SplitEx(s, sep string, removeEmptyString bool) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}

Substring

根据指定的位置和长度截取字符串。

函数签名:

go
func Substring(s string, offset int, length uint) string
func Substring(s string, offset int, length uint) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}

Wrap

用另一个字符串包裹一个字符串。

函数签名:

go
func Wrap(str string, wrapWith string) string
func Wrap(str string, wrapWith string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}

Unwrap

用另一个字符串解开包裹一个字符串。

函数签名:

go
func Unwrap(str string, wrapToken string) string
func Unwrap(str string, wrapToken string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}

SplitWords

将字符串拆分为单词,只支持字母字符单词。

函数签名:

go
func SplitWords(s string) []string
func SplitWords(s string) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}

WordCount

返回有意义单词的数量,只支持字母字符单词。

函数签名:

go
func WordCount(s string) int
func WordCount(s string) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}

RemoveNonPrintable

删除字符串中不可打印的字符。

函数签名:

go
func RemoveNonPrintable(str string) string
func RemoveNonPrintable(str string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\u00a0 \u200bworld\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\u00a0 \u200bworld\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}

StringToBytes

在不分配内存的情况下将字符串转换为字节片。

函数签名:

go
func StringToBytes(str string) (b []byte)
func StringToBytes(str string) (b []byte)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    // Output:
+    // [97 98 99]
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    // Output:
+    // [97 98 99]
+    // true
+}

BytesToString

在不分配内存的情况下将字节切片转换为字符串。

函数签名:

go
func BytesToString(bytes []byte) string
func BytesToString(bytes []byte) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

IsBlank

检查字符串是否为空格或空。

函数签名:

go
func IsBlank(str string) bool
func IsBlank(str string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\t\v\f\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\t\v\f\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HasPrefixAny

检查字符串是否以指定字符串数组中的任何一个开头。

函数签名:

go
func HasPrefixAny(str string, prefixes []string) bool
func HasPrefixAny(str string, prefixes []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasSuffixAny

检查字符串是否以指定字符串数组中的任何一个结尾。

函数签名:

go
func HasSuffixAny(str string, suffixes []string) bool
func HasSuffixAny(str string, suffixes []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IndexOffset

将字符串偏移idxFrom后,返回字符串中第一个 substr 实例的索引,如果字符串中不存在 substr,则返回 -1。

函数签名:

go
func IndexOffset(str string, substr string, idxFrom int) int
func IndexOffset(str string, substr string, idxFrom int) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}

ReplaceWithMap

返回`str`的副本,以无序的方式被map替换,区分大小写。

函数签名:

go
func ReplaceWithMap(str string, replaces map[string]string) string
func ReplaceWithMap(str string, replaces map[string]string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}

Trim

从字符串的开头和结尾去除空格(或其他字符)。 可选参数 characterMask 指定额外的剥离字符。

函数签名:

go
func Trim(str string, characterMask ...string) string
func Trim(str string, characterMask ...string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}

SplitAndTrim

将字符串str按字符串delimiter拆分为一个切片,并对该数组的每个元素调用Trim。忽略Trim后为空的元素。

函数签名:

go
func SplitAndTrim(str, delimiter string, characterMask ...string) []string
func SplitAndTrim(str, delimiter string, characterMask ...string) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}

HideString

使用参数`replaceChar`隐藏源字符串中的一些字符。替换范围是 origin[start : end]。

函数签名:

go
func HideString(origin string, start, end int, replaceChar string) string
func HideString(origin string, start, end int, replaceChar string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}

ContainsAll

判断字符串是否包括全部给定的子字符串切片。

函数签名:

go
func ContainsAll(str string, substrs []string) bool
func ContainsAll(str string, substrs []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainsAny

判断字符串是否包括给定的子字符串切片中任意一个子字符串。

函数签名:

go
func ContainsAny(str string, substrs []string) bool
func ContainsAny(str string, substrs []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

RemoveWhiteSpace

删除字符串中的空格,当设置repalceAll为true时,删除全部空格,为false时,替换多个空格为1个空格。

函数签名:

go
func RemoveWhiteSpace(str string, repalceAll bool) string
func RemoveWhiteSpace(str string, repalceAll bool) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \r\n    \t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \r\n    \t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/system.html b/docs/.vitepress/dist/api/packages/system.html new file mode 100644 index 0000000..f9a4157 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/system.html @@ -0,0 +1,284 @@ + + + + + + System | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

System

system 包含 os, runtime, shell command 相关函数。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/system"
+)
import (
+    "github.com/duke-git/lancet/v2/system"
+)

目录

文档

IsWindows

检查当前操作系统是否是windows

函数签名:

go
func IsWindows() bool
func IsWindows() bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}

IsLinux

检查当前操作系统是否是linux

函数签名:运行

go
func IsLinux() bool
func IsLinux() bool

示例:

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}

IsMac

检查当前操作系统是否是macos

函数签名:

go
func IsMac() bool
func IsMac() bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}

GetOsEnv

获取key命名的环境变量的值

函数签名:

go
func GetOsEnv(key string) string
func GetOsEnv(key string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

SetOsEnv

设置由key命名的环境变量的值

函数签名:

go
func SetOsEnv(key, value string) error
func SetOsEnv(key, value string) error

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

RemoveOsEnv

删除单个环境变量

函数签名:

go
func RemoveOsEnv(key string) error
func RemoveOsEnv(key string) error

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}

CompareOsEnv

获取key命名的环境变量值并与compareEnv进行比较

函数签名:

go
func CompareOsEnv(key, comparedEnv string) bool
func CompareOsEnv(key, comparedEnv string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

ExecCommand

执行shell命令,返回命令的stdout和stderr字符串,如果出现错误,则返回错误。参数`command`是一个完整的命令字符串,如ls-a(linux),dir(windows),ping 127.0.0.1。在linux中,使用/bin/bash-c执行命令,在windows中,使用powershell.exe执行命令。

函数签名:

go
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}

GetOsBits

获取当前操作系统位数,返回32或64

函数签名:

go
func GetOsBits() int
func GetOsBits() int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/tuple.html b/docs/.vitepress/dist/api/packages/tuple.html new file mode 100644 index 0000000..88e4bb7 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/tuple.html @@ -0,0 +1,1138 @@ + + + + + + Tuple | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Tuple

tuple包实现一个元组数据类型。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)

目录

文档

Tuple2

2元元组

函数签名:

go
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}

Tuple2_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple2[A, B]) Unbox() (A, B)
func (t Tuple2[A, B]) Unbox() (A, B)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}

Zip2

创建一个Tuple2元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}

Unzip2

根据传入的Tuple2切片,创建一组和Tuple2元素相对应的切片。

函数签名:

go
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}

Tuple3

3元元组。

函数签名:

go
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}

Tuple3_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple3[A, B, C]) Unbox() (A, B, C)
func (t Tuple3[A, B, C]) Unbox() (A, B, C)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}

Zip3

创建一个Tuple3元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}

Unzip3

根据传入的Tuple3切片,创建一组和Tuple3元素相对应的切片。

函数签名:

go
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}

Tuple4

4元元组。

函数签名:

go
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}

Tuple4_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}

Zip4

创建一个Tuple4元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}

Unzip4

根据传入的Tuple4切片,创建一组和Tuple4元素相对应的切片。

函数签名:

go
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}

Tuple5

5元元组。

函数签名:

go
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}

Tuple5_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}

Zip5

创建一个Tuple5元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}

Unzip5

根据传入的Tuple5切片,创建一组和Tuple5元素相对应的切片。

函数签名:

go
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}

Tuple6

6元元组。

函数签名:

go
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Tuple6_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Zip6

创建一个Tuple6元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}

Unzip6

根据传入的Tuple6切片,创建一组和Tuple6元素相对应的切片。

函数签名:

go
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}

Tuple7

7元元组。

函数签名:

go
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Tuple7_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Zip7

创建一个Tuple7元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}

Unzip7

根据传入的Tuple7切片,创建一组和Tuple7元素相对应的切片。

函数签名:

go
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}

Tuple8

8元元组。

函数签名:

go
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Tuple8_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Zip8

创建一个Tuple8元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}

Unzip8

根据传入的Tuple8切片,创建一组和Tuple8元素相对应的切片。

函数签名:

go
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}

Tuple9

9元元组。

函数签名:

go
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Tuple9_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Zip9

创建一个Tuple9元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}

Unzip9

根据传入的Tuple9切片,创建一组和Tuple9元素相对应的切片。

函数签名:

go
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}

Tuple10

10元元组。

函数签名:

go
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Tuple10_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Zip10

创建一个Tuple10元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}

Unzip10

根据传入的Tuple10切片,创建一组和Tuple10元素相对应的切片。

函数签名:

go
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/validator.html b/docs/.vitepress/dist/api/packages/validator.html new file mode 100644 index 0000000..2a4a92f --- /dev/null +++ b/docs/.vitepress/dist/api/packages/validator.html @@ -0,0 +1,1228 @@ + + + + + + Validator | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Validator

validator 验证器包,包含常用字符串格式验证函数。

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/validator"
+)
import (
+    "github.com/duke-git/lancet/v2/validator"
+)

目录:

文档

ContainChinese

验证字符串是否包含中文字符。

函数签名:

go
func ContainChinese(s string) bool
func ContainChinese(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainLetter

验证字符串是否包含至少一个英文字母。

函数签名:

go
func ContainLetter(str string) bool
func ContainLetter(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

ContainLower

验证字符串是否包含至少一个英文小写字母。

函数签名:

go
func ContainLower(str string) bool
func ContainLower(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainUpper

验证字符串是否包含至少一个英文大写字母。

函数签名:

go
func ContainUpper(str string) bool
func ContainUpper(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsAlpha

验证字符串是否只包含英文字母。

函数签名:

go
func IsAlpha(s string) bool
func IsAlpha(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllUpper

验证字符串是否全是大写英文字母。

函数签名:

go
func IsAllUpper(str string) bool
func IsAllUpper(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllLower

验证字符串是否全是小写英文字母。

函数签名:

go
func IsAllLower(str string) bool
func IsAllLower(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsASCII

验证字符串全部为ASCII字符。

函数签名:

go
func IsASCII(str string) bool
func IsASCII(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}

IsBase64

验证字符串是否是base64编码。

函数签名:

go
func IsBase64(base64 string) bool
func IsBase64(base64 string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseMobile

验证字符串是否是中国手机号码。

函数签名:

go
func IsChineseMobile(mobileNum string) bool
func IsChineseMobile(mobileNum string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseIdNum

验证字符串是否是中国身份证号码。

函数签名:

go
func IsChineseIdNum(id string) bool
func IsChineseIdNum(id string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChinesePhone

验证字符串是否是中国电话座机号码。

函数签名:

go
func IsChinesePhone(phone string) bool
func IsChinesePhone(phone string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsCreditCard

验证字符串是否是信用卡号码。

函数签名:

go
func IsCreditCard(creditCart string) bool
func IsCreditCard(creditCart string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsDns

验证字符串是否是有效dns。

函数签名:

go
func IsDns(dns string) bool
func IsDns(dns string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsEmail

验证字符串是否是有效电子邮件地址。

函数签名:

go
func IsEmail(email string) bool
func IsEmail(email string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsEmptyString

验证字符串是否是空字符串。

函数签名:

go
func IsEmptyString(s string) bool
func IsEmptyString(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsInt

验证参数是否是整数(int, unit)。

函数签名:

go
func IsInt(v any) bool
func IsInt(v any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsFloat

验证参数是否是浮点数(float32, float34)。

函数签名:

go
func IsFloat(v any) bool
func IsFloat(v any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsNumber

验证参数是否是数字(integer or float)。

函数签名:

go
func IsNumber(v any) bool
func IsNumber(v any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}

IsIntStr

验证字符串是否是可以转换为整数。

函数签名:

go
func IsIntStr(s string) bool
func IsIntStr(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsFloatStr

验证字符串是否是可以转换为浮点数。

函数签名:

go
func IsFloatStr(s string) bool
func IsFloatStr(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsNumberStr

验证字符串是否是可以转换为数字。

函数签名:

go
func IsNumberStr(s string) bool
func IsNumberStr(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsJSON

验证字符串是否是有效json。

函数签名:

go
func IsJSON(str string) bool
func IsJSON(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\"name\": \"test\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\"name\": \"test\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsRegexMatch

验证字符串是否可以匹配正则表达式。

函数签名:

go
func IsRegexMatch(s, regex string) bool
func IsRegexMatch(s, regex string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", `^[a-zA-Z]+$`)
+    result2 := validator.IsRegexMatch("ab1", `^[a-zA-Z]+$`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", `^[a-zA-Z]+$`)
+    result2 := validator.IsRegexMatch("ab1", `^[a-zA-Z]+$`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIp

验证字符串是否是ip地址。

函数签名:

go
func IsIp(ipstr string) bool
func IsIp(ipstr string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsIpV4

验证字符串是否是ipv4地址。

函数签名:

go
func IsIpV4(ipstr string) bool
func IsIpV4(ipstr string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIpV6

验证字符串是否是ipv6地址。

函数签名:

go
func IsIpV6(ipstr string) bool
func IsIpV6(ipstr string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsStrongPassword

验证字符串是否是强密码:(alpha(lower+upper) + number + special chars(!@#$%^&*()?><))。

函数签名:

go
func IsStrongPassword(password string, length int) bool
func IsStrongPassword(password string, length int) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsUrl

验证字符串是否是url。

函数签名:

go
func IsUrl(str string) bool
func IsUrl(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsWeakPassword

验证字符串是否是弱密码:(only letter or only number or letter + number) 。

函数签名:

go
func IsWeakPassword(password string, length int) bool
func IsWeakPassword(password string, length int) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsZeroValue

判断传入的参数值是否为零值。

函数签名:

go
func IsZeroValue(value any) bool
func IsZeroValue(value any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsGBK

检查数据编码是否为gbk(汉字内部代码扩展规范)。该函数的实现取决于双字节是否在gbk的编码范围内,而utf-8编码格式的每个字节都在gbk编码范围内。因此,应该首先调用utf8.valid检查它是否是utf-8编码,然后调用IsGBK检查gbk编码。如示例所示。

函数签名:

go
func IsGBK(data []byte) bool
func IsGBK(data []byte) bool

示例:Run

go
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

IsPrintable

检查字符串是否全部为可打印字符。

函数签名:

go
func IsPrintable(str string) bool
func IsPrintable(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/api/packages/xerror.html b/docs/.vitepress/dist/api/packages/xerror.html new file mode 100644 index 0000000..d69a9e9 --- /dev/null +++ b/docs/.vitepress/dist/api/packages/xerror.html @@ -0,0 +1,508 @@ + + + + + + Xerror | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

Xerror

xerror 错误处理逻辑封装

源码:

用法:

go
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)

目录

文档

New

创建XError对象实例。

函数签名:

go
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

Wrap

根据error对象创建XError对象实例,可添加message。

函数签名:

go
func Wrap(cause error, message ...any) *XError
func Wrap(cause error, message ...any) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}

Unwrap

从error对象中解构出XError。

函数签名:

go
func Unwrap(err error) *XError
func Unwrap(err error) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}

XError_Wrap

创建新的XError对象并将消息和id复制到新的对象中。

函数签名:

go
func (e *XError) Wrap(cause error) *XError
func (e *XError) Wrap(cause error) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}

XError_Unwrap

解构XEerror为error对象。适配github.com/pkg/errors。

函数签名:

go
func (e *XError) Unwrap() error
func (e *XError) Unwrap() error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}

XError_With

添加与XError对象的键和值。

函数签名:

go
func (e *XError) With(key string, value any) *XError
func (e *XError) With(key string, value any) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_Id

设置XError对象的id。

函数签名:

go
func (e *XError) Id(id string) *XError
func (e *XError) Id(id string) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Is

检查目标error是否为XError,两个错误中的error.id是否匹配。

函数签名:

go
func (e *XError) Is(target error) bool
func (e *XError) Is(target error) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Values

返回由With设置的键和值的映射。将合并所有XError键和值。

函数签名:

go
func (e *XError) Values() map[string]any
func (e *XError) Values() map[string]any

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_StackTrace

返回与pkg/error兼容的堆栈信息。

函数签名:

go
func (e *XError) StackTrace() StackTrace
func (e *XError) StackTrace() StackTrace

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}

XError_Info

返回可打印的XError对象信息。

函数签名:

go
func (e *XError) Info() *errInfo
func (e *XError) Info() *errInfo

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}

XError_Error

实现标准库的error接口。

函数签名:

go
func (e *XError) Error() string
func (e *XError) Error() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

TryUnwrap

检查error, 如果err为nil则展开,则它返回一个有效值,如果err不是nil则TryUnwrap使用err发生panic。

函数签名:

go
func TryUnwrap[T any](val T, err error) T
func TryUnwrap[T any](val T, err error) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/assets/api_overview.md.0734e445.js b/docs/.vitepress/dist/assets/api_overview.md.0734e445.js new file mode 100644 index 0000000..9878e4b --- /dev/null +++ b/docs/.vitepress/dist/assets/api_overview.md.0734e445.js @@ -0,0 +1 @@ +import{_ as a,o as e,c,X as l}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"API概述","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"api/overview.md","filePath":"api/overview.md"}'),i={name:"api/overview.md"},s=l('

API概述

lancet(柳叶刀)是一个功能强大、全面、高效、可复用的go语言工具函数库。包含25个包,超过600个工具函数。功能涵盖字符串处理、切片处理、网络、并发、加解密、文件处理、时间/日期、流处理、迭代器等等。

lancet功能模块

algorithm
compare
concurrency
condition
convertor
cryptor
datastructure
datetime
fileutil
formatter
function
iterator
maputil
mathutil
netutil
pointer
random
retry
slice
stream
structs
strutil
system
tuple
validator
xerror
',3),d=[s];function t(v,r,p,o,n,_){return e(),c("div",null,d)}const m=a(i,[["render",t]]);export{k as __pageData,m as default}; diff --git a/docs/.vitepress/dist/assets/api_overview.md.0734e445.lean.js b/docs/.vitepress/dist/assets/api_overview.md.0734e445.lean.js new file mode 100644 index 0000000..c4f53b6 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_overview.md.0734e445.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c,X as l}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"API概述","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"api/overview.md","filePath":"api/overview.md"}'),i={name:"api/overview.md"},s=l("",3),d=[s];function t(v,r,p,o,n,_){return e(),c("div",null,d)}const m=a(i,[["render",t]]);export{k as __pageData,m as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.js b/docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.js new file mode 100644 index 0000000..dc17f34 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.js @@ -0,0 +1,809 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Algorithm","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/algorithm.md","filePath":"api/packages/algorithm.md"}'),e={name:"api/packages/algorithm.md"},t=s("h1",{id:"Algorithm",tabindex:"-1"},[o("Algorithm "),s("a",{class:"header-anchor",href:"#Algorithm","aria-label":'Permalink to "Algorithm"'},"​")],-1),c=s("p",null,"algorithm 算法包实现一些基本算法,sort,search,lrucache。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n('

源码

',2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n(`

用法

go
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

目录

',2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

文档

BubbleSort

冒泡排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

InsertionSort

插入排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}

SelectionSort

选择排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

ShellSort

希尔排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

QuickSort

快速排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

HeapSort

堆排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

MergeSort

归并排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

CountSort

计数排序,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

BinarySearch

二分递归查找,返回元素索引,未找到元素返回-1,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

BinaryIterativeSearch

二分迭代查找,返回元素索引,未找到元素返回-1,参数comparator需要实现包lancetconstraints.Comparator。

函数签名:

go
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

LinearSearch

基于传入的相等函数线性查找元素,返回元素索引,未找到元素返回-1。

函数签名:

go
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LRUCache

lru算法实现缓存。

函数签名:

go
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}
`,73),d=[t,c,r,y,F,i,A,E,u,m];function g(B,h,C,v,f,b){return l(),p("div",null,d)}const S=a(e,[["render",g]]);export{D as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.lean.js b/docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.lean.js new file mode 100644 index 0000000..2ef91e4 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_algorithm.md.a5fd6586.lean.js @@ -0,0 +1 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Algorithm","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/algorithm.md","filePath":"api/packages/algorithm.md"}'),e={name:"api/packages/algorithm.md"},t=s("h1",{id:"Algorithm",tabindex:"-1"},[o("Algorithm "),s("a",{class:"header-anchor",href:"#Algorithm","aria-label":'Permalink to "Algorithm"'},"​")],-1),c=s("p",null,"algorithm 算法包实现一些基本算法,sort,search,lrucache。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n("",2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",73),d=[t,c,r,y,F,i,A,E,u,m];function g(B,h,C,v,f,b){return l(),p("div",null,d)}const S=a(e,[["render",g]]);export{D as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.js b/docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.js new file mode 100644 index 0000000..0a8ec19 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.js @@ -0,0 +1,455 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Compare","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/compare.md","filePath":"api/packages/compare.md"}'),e={name:"api/packages/compare.md"},t=s("h1",{id:"Compare",tabindex:"-1"},[a("Compare "),s("a",{class:"header-anchor",href:"#Compare","aria-label":'Permalink to "Compare"'},"​")],-1),c=s("p",null,"compare包提供几个轻量级的类型比较函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

',2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n(`

文档

Equal

检查两个值是否相等(检查类型和值)

函数签名:

go
func Equal(left, right any) bool
func Equal(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

EqualValue

检查两个值是否相等(只检查值)

函数签名:

go
func EqualValue(left, right any) bool
func EqualValue(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

LessThan

验证参数\`left\`的值是否小于参数\`right\`的值。

函数签名:

go
func LessThan(left, right any) bool
func LessThan(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterThan

验证参数\`left\`的值是否大于参数\`right\`的值。

函数签名:

go
func GreaterThan(left, right any) bool
func GreaterThan(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LessOrEqual

验证参数\`left\`的值是否小于或等于参数\`right\`的值。

函数签名:

go
func LessOrEqual(left, right any) bool
func LessOrEqual(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterOrEqual

验证参数\`left\`的值是否大于或参数\`right\`的值。

函数签名:

go
func GreaterOrEqual(left, right any) bool
func GreaterOrEqual(left, right any) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

InDelta

检查增量内两个值是否相等。

函数签名:

go
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool

示例: 运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}
`,43),d=[t,c,r,y,F,i,E,A,u,m,B];function f(h,q,g,D,b,v){return p(),o("div",null,d)}const P=l(e,[["render",f]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.lean.js b/docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.lean.js new file mode 100644 index 0000000..1c8d5b9 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_compare.md.046b68ac.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Compare","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/compare.md","filePath":"api/packages/compare.md"}'),e={name:"api/packages/compare.md"},t=s("h1",{id:"Compare",tabindex:"-1"},[a("Compare "),s("a",{class:"header-anchor",href:"#Compare","aria-label":'Permalink to "Compare"'},"​")],-1),c=s("p",null,"compare包提供几个轻量级的类型比较函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n("",43),d=[t,c,r,y,F,i,E,A,u,m,B];function f(h,q,g,D,b,v){return p(),o("div",null,d)}const P=l(e,[["render",f]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.js b/docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.js new file mode 100644 index 0000000..9e6541a --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.js @@ -0,0 +1,509 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Concurrency","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/concurrency.md","filePath":"api/packages/concurrency.md"}'),e={name:"api/packages/concurrency.md"},c=s("h1",{id:"Concurrency",tabindex:"-1"},[a("Concurrency "),s("a",{class:"header-anchor",href:"#Concurrency","aria-label":'Permalink to "Concurrency"'},"​")],-1),t=s("p",null,"并发包包含一些支持并发编程的功能。例如:goroutine, channel 等。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

Channel

',3),d=s("div",{STYLE:"page-break-after: always;"},null,-1),h=n(`

文档

Channel

NewChannel

返回一个Channel指针实例

函数签名:

go
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}

Bridge

将多个channel链接到一个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}

FanIn

将多个channel合并为一个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}

Generate

根据传入的值,生成channel.

函数签名:

go
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

Repeat

返回一个channel,将参数\`values\`重复放入channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}

RepeatFn

返回一个channel,重复执行函数fn,并将结果放入返回的channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+    // Output:
+    // hello
+    // hello
+    // hello
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+    // Output:
+    // hello
+    // hello
+    // hello
+}

Or

将一个或多个channel读取到一个channel中,当任何读取channel关闭时将结束读取。

函数签名:

go
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}

OrDone

将一个channel读入另一个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}

Take

返回一个channel,其值从另一个channel获取,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

Tee

将一个channel分成两个channel,直到取消上下文。

函数签名:

go
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)

示例:运行

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}
`,62),g=[c,t,r,y,F,i,A,E,u,d,h];function C(B,m,f,v,k,b){return p(),o("div",null,g)}const x=l(e,[["render",C]]);export{D as __pageData,x as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.lean.js b/docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.lean.js new file mode 100644 index 0000000..dc35a3b --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_concurrency.md.02593d84.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Concurrency","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/concurrency.md","filePath":"api/packages/concurrency.md"}'),e={name:"api/packages/concurrency.md"},c=s("h1",{id:"Concurrency",tabindex:"-1"},[a("Concurrency "),s("a",{class:"header-anchor",href:"#Concurrency","aria-label":'Permalink to "Concurrency"'},"​")],-1),t=s("p",null,"并发包包含一些支持并发编程的功能。例如:goroutine, channel 等。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",3),d=s("div",{STYLE:"page-break-after: always;"},null,-1),h=n("",62),g=[c,t,r,y,F,i,A,E,u,d,h];function C(B,m,f,v,k,b){return p(),o("div",null,g)}const x=l(e,[["render",C]]);export{D as __pageData,x as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.js b/docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.js new file mode 100644 index 0000000..04b3535 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.js @@ -0,0 +1,289 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Condition","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/condition.md","filePath":"api/packages/condition.md"}'),e={name:"api/packages/condition.md"},t=s("h1",{id:"Condition",tabindex:"-1"},[n("Condition "),s("a",{class:"header-anchor",href:"#Condition","aria-label":'Permalink to "Condition"'},"​")],-1),c=s("p",null,[n("condition包含一些用于条件判断的函数。这个包的实现参考了carlmjohnson的truthy包的实现,更多有用的信息可以在"),s("a",{href:"https://github.com/carlmjohnson/truthy",target:"_blank",rel:"noreferrer"},"truthy"),n("中找到,感谢carlmjohnson。")],-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/condition/condition.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/condition/condition.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
`,2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a('

目录

',2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),B=a(`

文档

Bool

返回传入参数的bool值.
如果出入类型参数含有Bool方法, 会调用该方法并返回
如果传入类型参数有IsZero方法, 返回IsZero方法返回值的取反
slices和map的length大于0时,返回true,否则返回false
其他类型会判断是否是零值

函数签名:

go
func Bool[T any](value T) bool
func Bool[T any](value T) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}

And

逻辑且操作,当切仅当a和b都为true时返回true

函数签名:

go
func And[T, U any](a T, b U) bool
func And[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}

Or

逻辑或操作,当切仅当a和b都为false时返回false

函数签名:

go
func Or[T, U any](a T, b U) bool
func Or[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}

Xor

逻辑异或操作,a和b相同返回false,a和b不相同返回true

函数签名:

go
func Xor[T, U any](a T, b U) bool
func Xor[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}

Nor

异或的取反操作

函数签名:

go
func Nor[T, U any](a T, b U) bool
func Nor[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}

Xnor

如果a和b都是真的或a和b均是假的,则返回true。

函数签名:

go
func Xnor[T, U any](a T, b U) bool
func Xnor[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}

Nand

如果a和b都为真,返回false,否则返回true

函数签名:

go
func Nand[T, U any](a T, b U) bool
func Nand[T, U any](a T, b U) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}

TernaryOperator

三元运算符

函数签名:

go
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}
`,49),f=[t,c,r,y,F,i,A,d,E,u,B];function g(h,m,b,v,q,k){return p(),o("div",null,f)}const P=l(e,[["render",g]]);export{C as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.lean.js b/docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.lean.js new file mode 100644 index 0000000..07a60be --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_condition.md.2519cae3.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Condition","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/condition.md","filePath":"api/packages/condition.md"}'),e={name:"api/packages/condition.md"},t=s("h1",{id:"Condition",tabindex:"-1"},[n("Condition "),s("a",{class:"header-anchor",href:"#Condition","aria-label":'Permalink to "Condition"'},"​")],-1),c=s("p",null,[n("condition包含一些用于条件判断的函数。这个包的实现参考了carlmjohnson的truthy包的实现,更多有用的信息可以在"),s("a",{href:"https://github.com/carlmjohnson/truthy",target:"_blank",rel:"noreferrer"},"truthy"),n("中找到,感谢carlmjohnson。")],-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/condition/condition.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/condition/condition.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),B=a("",49),f=[t,c,r,y,F,i,A,d,E,u,B];function g(h,m,b,v,q,k){return p(),o("div",null,f)}const P=l(e,[["render",g]]);export{C as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.js b/docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.js new file mode 100644 index 0000000..e304300 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.js @@ -0,0 +1,991 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Convertor","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/convertor.md","filePath":"api/packages/convertor.md"}'),e={name:"api/packages/convertor.md"},t=s("h1",{id:"Convertor",tabindex:"-1"},[a("Convertor "),s("a",{class:"header-anchor",href:"#Convertor","aria-label":'Permalink to "Convertor"'},"​")],-1),c=s("p",null,"convertor 转换器包支持一些常见的数据类型转换",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n(`

文档

ColorHexToRGB

颜色值十六进制转rgb。

函数签名:

go
func ColorHexToRGB(colorHex string) (red, green, blue int)
func ColorHexToRGB(colorHex string) (red, green, blue int)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}

ColorRGBToHex

颜色值rgb转十六进制。

函数签名:

go
func ColorRGBToHex(red, green, blue int) string
func ColorRGBToHex(red, green, blue int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}

ToBool

字符串转布尔类型,使用strconv.ParseBool。

函数签名:

go
func ToBool(s string) (bool, error)
func ToBool(s string) (bool, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}

ToBytes

Interface转字节切片。

函数签名:

go
func ToBytes(data any) ([]byte, error)
func ToBytes(data any) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}

ToChar

字符串转字符切片。

函数签名:

go
func ToChar(s string) []string
func ToChar(s string) []string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}

ToChannel

将切片转为只读channel。

函数签名:

go
func ToChannel[T any](array []T) <-chan T
func ToChannel[T any](array []T) <-chan T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

ToFloat

将interface转成float64类型,如果参数无法转换,会返回0和error。

函数签名:

go
func ToFloat(value any) (float64, error)
func ToFloat(value any) (float64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}

ToInt

将interface转成int64类型,如果参数无法转换,会返回0和error。

函数签名:

go
func ToInt(value any) (int64, error)
func ToInt(value any) (int64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}

ToJson

将interface转成json字符串,如果参数无法转换,会返回""和error。

函数签名:

go
func ToJson(value any) (string, error)
func ToJson(value any) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}

ToMap

将切片转为map。

函数签名:

go
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}

ToPointer

返回传入值的指针。

函数签名:

go
func ToPointer[T any](value T) *T
func ToPointer[T any](value T) *T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}

ToString

将值转换为字符串,对于数字、字符串、[]byte,将转换为字符串。 对于其他类型(切片、映射、数组、结构体)将调用 json.Marshal

函数签名:

go
func ToString(value any) string
func ToString(value any) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}

StructToMap

将struct转成map,只会转换struct中可导出的字段。struct中导出字段需要设置json tag标记。

函数签名:

go
func StructToMap(value any) (map[string]any, error)
func StructToMap(value any) (map[string]any, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}

MapToSlice

map中key和value执行函数iteratee后,转为切片。

函数签名:

go
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}

EncodeByte

将data编码成字节切片。

函数签名:

go
func EncodeByte(data any) ([]byte, error)
func EncodeByte(data any) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}

DecodeByte

解码字节切片到目标对象,目标对象需要传入一个指针实例。

函数签名:

go
func DecodeByte(data []byte, target any) error
func DecodeByte(data []byte, target any) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

DeepClone

创建一个传入值的深拷贝, 无法克隆结构体的非导出字段。

函数签名:

go
func DeepClone[T any](src T) T
func DeepClone[T any](src T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}

CopyProperties

拷贝不同结构体之间的同名字段。使用json.Marshal序列化,需要设置dst和src struct字段的json tag。

函数签名:

go
func CopyProperties[T, U any](dst T, src U) (err error)
func CopyProperties[T, U any](dst T, src U) (err error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type DiskVO struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type Indicator struct {
+        Id      string    \`json:"id"\`
+        Ip      string    \`json:"ip"\`
+        UpTime  string    \`json:"upTime"\`
+        LoadAvg string    \`json:"loadAvg"\`
+        Cpu     int       \`json:"cpu"\`
+        Disk    []Disk    \`json:"disk"\`
+        Stop    chan bool \`json:"-"\`
+    }
+
+    type IndicatorVO struct {
+        Id      string   \`json:"id"\`
+        Ip      string   \`json:"ip"\`
+        UpTime  string   \`json:"upTime"\`
+        LoadAvg string   \`json:"loadAvg"\`
+        Cpu     int64    \`json:"cpu"\`
+        Disk    []DiskVO \`json:"disk"\`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type DiskVO struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type Indicator struct {
+        Id      string    \`json:"id"\`
+        Ip      string    \`json:"ip"\`
+        UpTime  string    \`json:"upTime"\`
+        LoadAvg string    \`json:"loadAvg"\`
+        Cpu     int       \`json:"cpu"\`
+        Disk    []Disk    \`json:"disk"\`
+        Stop    chan bool \`json:"-"\`
+    }
+
+    type IndicatorVO struct {
+        Id      string   \`json:"id"\`
+        Ip      string   \`json:"ip"\`
+        UpTime  string   \`json:"upTime"\`
+        LoadAvg string   \`json:"loadAvg"\`
+        Cpu     int64    \`json:"cpu"\`
+        Disk    []DiskVO \`json:"disk"\`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}

ToInterface

将反射值转换成对应的interface类型。

函数签名:

go
func ToInterface(v reflect.Value) (value interface{}, ok bool)
func ToInterface(v reflect.Value) (value interface{}, ok bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\\n", iVal)
+    fmt.Printf("%v\\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\\n", iVal)
+    fmt.Printf("%v\\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true
+}

Utf8ToGbk

utf8编码转GBK编码。

函数签名:

go
func Utf8ToGbk(bs []byte) ([]byte, error)
func Utf8ToGbk(bs []byte) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true
+}

GbkToUtf8

GBK编码转utf8编码。

函数签名:

go
func GbkToUtf8(bs []byte) ([]byte, error)
func GbkToUtf8(bs []byte) ([]byte, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello
+}
`,127),g=[t,c,r,y,F,i,A,E,u,d,B];function q(f,v,h,m,D,b){return p(),o("div",null,g)}const T=l(e,[["render",q]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.lean.js b/docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.lean.js new file mode 100644 index 0000000..eb51728 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_convertor.md.3dc6f3b4.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Convertor","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/convertor.md","filePath":"api/packages/convertor.md"}'),e={name:"api/packages/convertor.md"},t=s("h1",{id:"Convertor",tabindex:"-1"},[a("Convertor "),s("a",{class:"header-anchor",href:"#Convertor","aria-label":'Permalink to "Convertor"'},"​")],-1),c=s("p",null,"convertor 转换器包支持一些常见的数据类型转换",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n("",127),g=[t,c,r,y,F,i,A,E,u,d,B];function q(f,v,h,m,D,b){return p(),o("div",null,g)}const T=l(e,[["render",q]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.js b/docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.js new file mode 100644 index 0000000..337c61d --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.js @@ -0,0 +1,1369 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Cryptor","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/cryptor.md","filePath":"api/packages/cryptor.md"}'),e={name:"api/packages/cryptor.md"},t=s("h1",{id:"Cryptor",tabindex:"-1"},[n("Cryptor "),s("a",{class:"header-anchor",href:"#Cryptor","aria-label":'Permalink to "Cryptor"'},"​")],-1),c=s("p",null,"cryptor包包含数据加密和解密功能。支持 base64, md5, hmac, hash, aes, des, rsa。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a('

目录

',2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),h=a(`

文档

AesEcbEncrypt

使用AES ECB算法模式加密数据. 参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesEcbEncrypt(data, key []byte) []byte
func AesEcbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesEcbDecrypt

使用AES ECB算法模式解密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesEcbDecrypt(encrypted, key []byte) []byte
func AesEcbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcEncrypt

使用AES CBC算法模式加密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesCbcEncrypt(data, key []byte) []byte
func AesCbcEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcDecrypt

使用AES CBC算法模式解密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesCbcDecrypt(encrypted, key []byte) []byte
func AesCbcDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCtrCrypt

使用AES CTR算法模式加密/解密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesCtrCrypt(data, key []byte) []byte
func AesCtrCrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbEncrypt

使用AES CFB算法模式加密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesCfbEncrypt(data, key []byte) []byte
func AesCfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbDecrypt

使用AES CFB算法模式解密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesCfbDecrypt(encrypted, key []byte) []byte
func AesCfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbEncrypt

使用AES OFB算法模式加密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesOfbEncrypt(data, key []byte) []byte
func AesOfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbDecrypt

使用AES OFB算法模式解密数据,参数\`key\`的长度是16, 24 or 32。

函数签名:

go
func AesOfbDecrypt(encrypted, key []byte) []byte
func AesOfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

Base64StdEncode

将字符串base64编码。

函数签名:

go
func Base64StdEncode(s string) string
func Base64StdEncode(s string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}

Base64StdDecode

解码base64字符串。

函数签名:

go
func Base64StdDecode(s string) string
func Base64StdDecode(s string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}

DesEcbEncrypt

使用DES ECB算法模式加密数据,参数\`key\`的长度是8。

函数签名:

go
func DesEcbEncrypt(data, key []byte) []byte
func DesEcbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesEcbDecrypt

使用DES ECB算法模式解决密数据,参数\`key\`的长度是8。

函数签名:

go
func DesEcbDecrypt(encrypted, key []byte) []byte
func DesEcbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcEncrypt

使用DES CBC算法模式加密数据,参数\`key\`的长度是8。

函数签名:

go
func DesCbcEncrypt(data, key []byte) []byte
func DesCbcEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcDecrypt

使用DES CBC算法模式解密数据,参数\`key\`的长度是8。

函数签名:

go
func DesCbcDecrypt(encrypted, key []byte) []byte
func DesCbcDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCtrCrypt

使用DES CTR算法模式加密/解密数据,参数\`key\`的长度是8

函数签名:

go
func DesCtrCrypt(data, key []byte) []byte
func DesCtrCrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbEncrypt

使用DES CFB算法模式加密数据,参数\`key\`的长度是8。

函数签名:

go
func DesCfbEncrypt(data, key []byte) []byte
func DesCfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbDecrypt

使用DES CFB算法模式解决密数据,参数\`key\`的长度是8。

函数签名:

go
func DesCfbDecrypt(encrypted, key []byte) []byte
func DesCfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbEncrypt

使用DES OFB算法模式加密数据,参数\`key\`的长度是8。

函数签名:

go
func DesOfbEncrypt(data, key []byte) []byte
func DesOfbEncrypt(data, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbDecrypt

使用DES OFB算法模式解密数据,参数\`key\`的长度是8。

函数签名:

go
func DesOfbDecrypt(encrypted, key []byte) []byte
func DesOfbDecrypt(encrypted, key []byte) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

HmacMd5

获取字符串md5 hmac值。

函数签名:

go
func HmacMd5(str, key string) string
func HmacMd5(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}

HmacMd5WithBase64

获取字符串md5 hmac base64字符串值。

函数签名:

go
func HmacMd5WithBase64(str, key string) string
func HmacMd5WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}

HmacSha1

获取字符串的sha1 hmac值。

函数签名:

go
func HmacSha1(str, key string) string
func HmacSha1(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}

HmacSha1WithBase64

获取字符串的sha1 base64值。

函数签名:

go
func HmacSha1WithBase64(str, key string) string
func HmacSha1WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}

HmacSha256

获取字符串sha256 hmac值。

函数签名:

go
func HmacSha256(str, key string) string
func HmacSha256(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}

HmacSha256WithBase64

获取字符串sha256 hmac base64值。

函数签名:

go
func HmacSha256WithBase64(str, key string) string
func HmacSha256WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}

HmacSha512

获取字符串sha512 hmac值。

函数签名:

go
func HmacSha512(str, key string) string
func HmacSha512(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}

HmacSha512WithBase64

获取字符串sha512 hmac base64值。

函数签名:

go
func HmacSha512WithBase64(str, key string) string
func HmacSha512WithBase64(str, key string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}

Md5String

获取字符串md5值。

函数签名:

go
func Md5String(str string) string
func Md5String(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}

Md5StringWithBase64

获取字符串md5 base64值。

函数签名:

go
func Md5StringWithBase64(s string) string
func Md5StringWithBase64(s string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5Byte

获取byte slice的md5值。

函数签名:

go
func Md5Byte(data []byte) string
func Md5Byte(data []byte) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}

Md5ByteWithBase64

获取byte slice的md5 base64值。

函数签名:

go
func Md5ByteWithBase64(data []byte) string
func Md5ByteWithBase64(data []byte) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5File

获取文件md5值。

函数签名:

go
func Md5File(filepath string) (string, error)
func Md5File(filepath string) (string, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}

Sha1

获取字符串sha1值。

函数签名:

go
func Sha1(str string) string
func Sha1(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}

Sha1WithBase64

获取字符串sha1 base64值。

函数签名:

go
func Sha1WithBase64(str string) string
func Sha1WithBase64(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}

Sha256

获取字符串sha256值。

函数签名:

go
func Sha256(str string) string
func Sha256(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}

Sha256WithBase64

获取字符串sha256 base64值。

函数签名:

go
func Sha256WithBase64(str string) string
func Sha256WithBase64(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}

Sha512

获取字符串sha512值。

函数签名:

go
func Sha512(str string) string
func Sha512(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}

Sha512WithBase64

获取字符串sha512 base64值。

函数签名:

go
func Sha512WithBase64(str string) string
func Sha512WithBase64(str string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}

GenerateRsaKey

在当前目录下创建rsa私钥文件和公钥文件。

函数签名:

go
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

RsaEncrypt

用公钥文件ras加密数据。

函数签名:

go
func RsaEncrypt(data []byte, pubKeyFileName string) []byte
func RsaEncrypt(data []byte, pubKeyFileName string) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

RsaDecrypt

用私钥文件rsa解密数据。

函数签名:

go
func RsaDecrypt(data []byte, privateKeyFileName string) []byte
func RsaDecrypt(data []byte, privateKeyFileName string) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
`,253),g=[t,c,r,y,i,F,d,E,A,u,h];function b(f,B,m,q,D,k){return l(),o("div",null,g)}const S=p(e,[["render",b]]);export{C as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.lean.js b/docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.lean.js new file mode 100644 index 0000000..f530def --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_cryptor.md.2d4965d7.lean.js @@ -0,0 +1 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Cryptor","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/cryptor.md","filePath":"api/packages/cryptor.md"}'),e={name:"api/packages/cryptor.md"},t=s("h1",{id:"Cryptor",tabindex:"-1"},[n("Cryptor "),s("a",{class:"header-anchor",href:"#Cryptor","aria-label":'Permalink to "Cryptor"'},"​")],-1),c=s("p",null,"cryptor包包含数据加密和解密功能。支持 base64, md5, hmac, hash, aes, des, rsa。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),h=a("",253),g=[t,c,r,y,i,F,d,E,A,u,h];function b(f,B,m,q,D,k){return l(),o("div",null,g)}const S=p(e,[["render",b]]);export{C as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.js b/docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.js new file mode 100644 index 0000000..6d83730 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.js @@ -0,0 +1,359 @@ +import{_ as a,o as n,c as l,X as s,k as p}from"./chunks/framework.6e839c56.js";const g=JSON.parse('{"title":"CopyOnWriteList","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/copyonwritelist.md","filePath":"api/packages/datastructure/copyonwritelist.md"}'),o={name:"api/packages/datastructure/copyonwritelist.md"},e=s(`

CopyOnWriteList

CopyOnWriteList 是一个线程安全的 List 实现,底层使用 go 切片。写入时,会复制一份新的切片,写入完成后,再将新的切片赋值给原来的切片。读取时,直接读取原来的切片。

源码

用法

go
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)
`,6),t=p("div",{STYLE:"page-break-after: always;"},null,-1),c=s(`

目录

文档

NewCopyOnWriteList

返回一个具有空切片的 CopyOnWriteList。

go
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.Locker
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.Locker
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}

Size

返回 CopyOnWriteList 的长度。

go
func (l *CopyOnWriteList[T]) Size() int
func (l *CopyOnWriteList[T]) Size() int

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}

Get

返回列表中指定位置的元素

go
func (c *CopyOnWriteList[T]) Get(index int) *T
func (c *CopyOnWriteList[T]) Get(index int) *T

示例

go
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	fmt.Println(l.Get(2))
+}
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	fmt.Println(l.Get(2))
+}

Set

将此列表中指定位置的元素替换为指定元素。

go
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)

示例

go
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}
package main
+
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}

Remove

IndexOf

返回列表中值的索引,如果没有找到返回-1。

go
func (c *CopyOnWriteList[T]) IndexOf(e T) int
func (c *CopyOnWriteList[T]) IndexOf(e T) int

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}

LastIndexOf

返回指定元素在此列表中最后出现的索引,如果此列表不包含该元素,则返回-1。

go
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3,1})
+	fmt.Println(l.LastIndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3,1})
+	fmt.Println(l.LastIndexOf(1))
+}

IsEmpty

如果此列表不包含任何元素,则返回 true。

go
func (c *CopyOnWriteList[T]) IsEmpty() bool
func (c *CopyOnWriteList[T]) IsEmpty() bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{})
+	fmt.Println(l.IsEmpty())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{})
+	fmt.Println(l.IsEmpty())
+}

Contain

判断 CopyOnWriteList 是否包含某个元素

go
func (c *CopyOnWriteList[T]) Contain(e T) bool
func (c *CopyOnWriteList[T]) Contain(e T) bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Contain(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Contain(1))
+}

ValueOf

返回列表中索引处的值指针

go
func (c *CopyOnWriteList[T]) ValueOf(index int) []T
func (c *CopyOnWriteList[T]) ValueOf(index int) []T

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}

Add

将指定的元素追加到此列表的末尾。

go
func (c *CopyOnWriteList[T]) Add(e T) bool
func (c *CopyOnWriteList[T]) Add(e T) bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}

AddAll

将指定集合中的所有元素追加到此列表的末尾

go
func (c *CopyOnWriteList[T]) AddAll(e []T) bool
func (c *CopyOnWriteList[T]) AddAll(e []T) bool

示例

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}

AddByIndex

将指定元素插入此列表中的指定位置。

go
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.AddByIndex(2, 6)
+	fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.AddByIndex(2, 6)
+	fmt.Println(l.getList())
+}

DeleteAt

移除此列表中指定位置的元素。

go
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.DeleteAt(2)
+	fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	list.DeleteAt(2)
+	fmt.Println(l.getList())
+}

DeleteIf

从此列表中删除第一个出现的指定元素(如果该元素存在)。

go
func (c *CopyOnWriteList[T]) DeleteIf(f func(T) bool) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteIf(f func(T) bool) (oldValue *T, ok bool)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}

DeleteBy

从此列表中删除第一个出现的指定元素(如果该元素存在)。

go
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main()  {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}

DeleteRange

从该列表中删除索引介于 fromIndex(包含)和 toIndex(不包含)之间的所有元素。 (左闭右开)。

go
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}

Equal

如果指定的对象等于此列表,则返回 true。

go
func (c *CopyOnWriteList[T]) Equal(e []T) bool
func (c *CopyOnWriteList[T]) Equal(e []T) bool

示例

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}
`,89),r=[e,t,c];function y(F,i,d,E,A,u){return n(),l("div",null,r)}const f=a(o,[["render",y]]);export{g as __pageData,f as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.lean.js new file mode 100644 index 0000000..d1b1e85 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_copyonwritelist.md.1a351580.lean.js @@ -0,0 +1 @@ +import{_ as a,o as n,c as l,X as s,k as p}from"./chunks/framework.6e839c56.js";const g=JSON.parse('{"title":"CopyOnWriteList","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/copyonwritelist.md","filePath":"api/packages/datastructure/copyonwritelist.md"}'),o={name:"api/packages/datastructure/copyonwritelist.md"},e=s("",6),t=p("div",{STYLE:"page-break-after: always;"},null,-1),c=s("",89),r=[e,t,c];function y(F,i,d,E,A,u){return n(),l("div",null,r)}const f=a(o,[["render",y]]);export{g as __pageData,f as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.js b/docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.js new file mode 100644 index 0000000..1cd63ac --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.js @@ -0,0 +1,247 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"HashMap","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/hashmap.md","filePath":"api/packages/datastructure/hashmap.md"}'),e={name:"api/packages/datastructure/hashmap.md"},t=s("h1",{id:"HashMap",tabindex:"-1"},[n("HashMap "),s("a",{class:"header-anchor",href:"#HashMap","aria-label":'Permalink to "HashMap"'},"​")],-1),c=s("p",null,"HashMap 数据结构实现",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[n("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a(`

用法

go
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
`,2),h=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

API 文档

NewHashMap

新建默认容量(1 << 10)的HashMap指针实例

函数签名:

go
func NewHashMap() *HashMap
func NewHashMap() *HashMap

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}

NewHashMapWithCapacity

新建指定容量和长度的HashMap指针实例.

函数签名:

go
func NewHashMapWithCapacity(size, capacity uint64) *HashMap
func NewHashMapWithCapacity(size, capacity uint64) *HashMap

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}

Get

在hashmap中根据key获取值

函数签名:

go
func (hm *HashMap) Get(key any) any
func (hm *HashMap) Get(key any) any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}

Put

将key-value放入hashmap中

函数签名:

go
func (hm *HashMap) Put(key any, value any) any
func (hm *HashMap) Put(key any, value any) any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}

Delete

将指定的key从hashmap中删除

函数签名:

go
func (hm *HashMap) Delete(key any)
func (hm *HashMap) Delete(key any)

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}

Contains

判断hashmap中是否包含指定的key

函数签名:

go
func (hm *HashMap) Contains(key any) bool
func (hm *HashMap) Contains(key any) bool

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}

Iterate

迭代hashmap,对每个key和value执行iteratee函数

函数签名:

go
func (hm *HashMap) Iterate(iteratee func(key, value any))
func (hm *HashMap) Iterate(iteratee func(key, value any))

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}

Keys

返回hashmap所有key的切片 (随机顺序)

函数签名:

go
func (hm *HashMap) Keys() []any
func (hm *HashMap) Keys() []any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}

Values

返回hashmap所有值的切片 (随机顺序).

函数签名:

go
func (hm *HashMap) Values() []any
func (hm *HashMap) Values() []any

示例:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}
`,55),m=[t,c,r,y,F,i,u,h,E,d,A];function g(q,v,B,f,k,b){return l(),o("div",null,m)}const P=p(e,[["render",g]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.lean.js new file mode 100644 index 0000000..ff88893 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_hashmap.md.310e4711.lean.js @@ -0,0 +1 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"HashMap","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/hashmap.md","filePath":"api/packages/datastructure/hashmap.md"}'),e={name:"api/packages/datastructure/hashmap.md"},t=s("h1",{id:"HashMap",tabindex:"-1"},[n("HashMap "),s("a",{class:"header-anchor",href:"#HashMap","aria-label":'Permalink to "HashMap"'},"​")],-1),c=s("p",null,"HashMap 数据结构实现",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[n("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",2),h=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",55),m=[t,c,r,y,F,i,u,h,E,d,A];function g(q,v,B,f,k,b){return l(),o("div",null,m)}const P=p(e,[["render",g]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.js b/docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.js new file mode 100644 index 0000000..c3cd55c --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.js @@ -0,0 +1,437 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"Heap","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/heap.md","filePath":"api/packages/datastructure/heap.md"}'),e={name:"api/packages/datastructure/heap.md"},t=s("h1",{id:"Heap",tabindex:"-1"},[n("Heap "),s("a",{class:"header-anchor",href:"#Heap","aria-label":'Permalink to "Heap"'},"​")],-1),c=s("p",null,"堆,切片实现的二叉堆数据结构。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[n("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

用法

go
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a('

目录

',2),v=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a(`

API文档

1. MaxHeap

MaxHeap是通过slice实现的二叉堆树,根节点的key既大于等于左子树的key值且大于等于右子树的key值。

NewMaxHeap

返回NewMaxHeap指针实例

函数签名:

go
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}

Push

向堆中插入数据

函数签名:

go
func (h *MaxHeap[T]) Push(value T)
func (h *MaxHeap[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Pop

返回堆中最大值并将其从堆中删除,如果堆为空,返回零值并返回false

函数签名:

go
func (h *MaxHeap[T]) Pop() (T, bool)
func (h *MaxHeap[T]) Pop() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}

Peek

返回堆中最大值,如果堆为空,返回零值并返回false

函数签名:

go
func (h *MaxHeap[T]) Peek() (T, bool)
func (h *MaxHeap[T]) Peek() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}

Data

返回堆中全部元素的切片

函数签名:

go
func (h *MaxHeap[T]) Data() []T
func (h *MaxHeap[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Size

返回堆中元素的数量

函数签名:

go
func (h *MaxHeap[T]) Size() int
func (h *MaxHeap[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}

PrintStructure

打印堆的树形结构

函数签名:

go
func (h *MaxHeap[T]) PrintStructure()
func (h *MaxHeap[T]) PrintStructure()

示例:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}
`,45),C=[t,c,r,y,F,i,A,E,u,v,d];function B(h,m,f,g,k,D){return p(),o("div",null,C)}const x=l(e,[["render",B]]);export{_ as __pageData,x as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.lean.js new file mode 100644 index 0000000..2884b9b --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_heap.md.749f37d9.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"Heap","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/heap.md","filePath":"api/packages/datastructure/heap.md"}'),e={name:"api/packages/datastructure/heap.md"},t=s("h1",{id:"Heap",tabindex:"-1"},[n("Heap "),s("a",{class:"header-anchor",href:"#Heap","aria-label":'Permalink to "Heap"'},"​")],-1),c=s("p",null,"堆,切片实现的二叉堆数据结构。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[n("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",2),v=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a("",45),C=[t,c,r,y,F,i,A,E,u,v,d];function B(h,m,f,g,k,D){return p(),o("div",null,C)}const x=l(e,[["render",B]]);export{_ as __pageData,x as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.js b/docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.js new file mode 100644 index 0000000..9e360ef --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.js @@ -0,0 +1,957 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Linklist","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/link.md","filePath":"api/packages/datastructure/link.md"}'),e={name:"api/packages/datastructure/link.md"},t=s("h1",{id:"Linklist",tabindex:"-1"},[a("Linklist "),s("a",{class:"header-anchor",href:"#Linklist","aria-label":'Permalink to "Linklist"'},"​")],-1),c=s("p",null,"Linklist是链表数据结构,它的节点有一个值和一个指向下一个节点的指针。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法

go
import (
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
import (
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

目录

1. SinglyLink单链表

2. DoublyLink双向链表

',5),k=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

文档

SingleLink是单向链表,它的节点有一个值和一个指向链表的下一个节点的指针。

创建SinglyLink指针实例

函数签名:

go
type LinkNode[T any] struct {
+	Value T
+	Next  *LinkNode[T]
+}
+type SinglyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewSinglyLink[T any]() *SinglyLink[T]
type LinkNode[T any] struct {
+	Value T
+	Next  *LinkNode[T]
+}
+type SinglyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewSinglyLink[T any]() *SinglyLink[T]

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk)
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk)
+}

Values

返回链表中所有节点值的切片

函数签名:

go
func (link *SinglyLink[T]) Values() []T
func (link *SinglyLink[T]) Values() []T

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

InsertAt

将值插入到索引处的链表中,索引应大于或等于0且小于或等于链表节点数

函数签名:

go
func (link *SinglyLink[T]) InsertAt(index int, value T)
func (link *SinglyLink[T]) InsertAt(index int, value T)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}

InsertAtHead

将值插入到链表表头

函数签名:

go
func (link *SinglyLink[T]) InsertAtHead(value T)
func (link *SinglyLink[T]) InsertAtHead(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

InsertAtTail

将值插入到链表末尾

函数签名:

go
func (link *SinglyLink[T]) InsertAtTail(value T)
func (link *SinglyLink[T]) InsertAtTail(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAt

删除特定索引处的值,索引应大于或等于0且小于或等于链接节点数-1

函数签名:

go
func (link *SinglyLink[T]) DeleteAt(index int)
func (link *SinglyLink[T]) DeleteAt(index int)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAtHead

删除链表头节点

函数签名:

go
func (link *SinglyLink[T]) DeleteAtHead()
func (link *SinglyLink[T]) DeleteAtHead()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}

DeleteAtTail

删除链表末尾节点

函数签名:

go
func (link *SinglyLink[T]) DeleteAtTail()
func (link *SinglyLink[T]) DeleteAtTail()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteAtTail()
+    
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteAtTail()
+    
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}

DeleteValue

删除链表中指定的value值

函数签名:

go
func (link *SinglyLink[T]) DeleteValue(value T)
func (link *SinglyLink[T]) DeleteValue(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteValue(2)
+    fmt.Println(lk.Values()) //[]int{1, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteValue(2)
+    fmt.Println(lk.Values()) //[]int{1, 3}
+}

Reverse

反转链表所有节点顺序

函数签名:

go
func (link *SinglyLink[T]) Reverse()
func (link *SinglyLink[T]) Reverse()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

GetMiddleNode

获取链表中部节点

函数签名:

go
func (link *SinglyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]
func (link *SinglyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}

Size

获取链表节点数量

函数签名:

go
func (link *SinglyLink[T]) Size() int
func (link *SinglyLink[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}

IsEmpty

判断链表是否为空

函数签名:

go
func (link *SinglyLink[T]) IsEmpty() bool
func (link *SinglyLink[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}

Clear

清空链表所有节点

函数签名:

go
func (link *SinglyLink[T]) Clear()
func (link *SinglyLink[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}

Print

打印链表结构

函数签名:

go
func (link *SinglyLink[T]) Clear()
func (link *SinglyLink[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //[ &{Value:1 Pre:<nil> Next:0xc0000a4048}, &{Value:2 Pre:<nil> Next:0xc0000a4060}, &{Value:3 Pre:<nil> Next:<nil>} ]
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //[ &{Value:1 Pre:<nil> Next:0xc0000a4048}, &{Value:2 Pre:<nil> Next:0xc0000a4060}, &{Value:3 Pre:<nil> Next:<nil>} ]
+}

DoublyLink是双向链表,它的节点有一个值,next指针指向下一个节点,pre指针指向前一个节点。

创建NewDoublyLink指针实例

函数签名:

go
type LinkNode[T any] struct {
+	Value T
+    Pre   *LinkNode[T]
+	Next  *LinkNode[T]
+}
+type DoublyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewDoublyLink[T any]() *DoublyLink[T]
type LinkNode[T any] struct {
+	Value T
+    Pre   *LinkNode[T]
+	Next  *LinkNode[T]
+}
+type DoublyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewDoublyLink[T any]() *DoublyLink[T]

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk)
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk)
+}

Values

返回链表中所有节点值的切片

函数签名:

go
func (link *DoublyLink[T]) Values() []T
func (link *DoublyLink[T]) Values() []T

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

InsertAt

将值插入到索引处的链表中,索引应大于或等于0且小于或等于链表节点数

函数签名:

go
func (link *DoublyLink[T]) InsertAt(index int, value T)
func (link *DoublyLink[T]) InsertAt(index int, value T)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}

InsertAtHead

将值插入到链表表头

函数签名:

go
func (link *DoublyLink[T]) InsertAtHead(value T)
func (link *DoublyLink[T]) InsertAtHead(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

InsertAtTail

将值插入到链表末尾

函数签名:

go
func (link *DoublyLink[T]) InsertAtTail(value T)
func (link *DoublyLink[T]) InsertAtTail(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAt

删除特定索引处的值,索引应大于或等于0且小于或等于链接节点数-1

函数签名:

go
func (link *DoublyLink[T]) DeleteAt(index int)
func (link *DoublyLink[T]) DeleteAt(index int)

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAtHead

删除链表头节点

函数签名:

go
func (link *DoublyLink[T]) DeleteAtHead()
func (link *DoublyLink[T]) DeleteAtHead()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}

DeleteAtTail

删除链表末尾节点

函数签名:

go
func (link *DoublyLink[T]) DeleteAtTail()
func (link *DoublyLink[T]) DeleteAtTail()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteAtTail()
+    
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteAtTail()
+    
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}

Reverse

反转链表所有节点顺序

函数签名:

go
func (link *DoublyLink[T]) Reverse()
func (link *DoublyLink[T]) Reverse()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

GetMiddleNode

获取链表中部节点

函数签名:

go
func (link *DoublyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]
func (link *DoublyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}

Size

获取链表节点数量

函数签名:

go
func (link *DoublyLink[T]) Size() int
func (link *DoublyLink[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}

IsEmpty

判断链表是否为空

函数签名:

go
func (link *DoublyLink[T]) IsEmpty() bool
func (link *DoublyLink[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}

Clear

清空链表所有节点

函数签名:

go
func (link *DoublyLink[T]) Clear()
func (link *DoublyLink[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}

打印链表结构

函数签名:

go
func (link *DoublyLink[T]) Clear()
func (link *DoublyLink[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //
+}
`,179),g=[t,c,r,y,i,F,A,u,d,k,E];function h(v,b,m,f,B,D){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.lean.js new file mode 100644 index 0000000..4f19c4c --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_link.md.53b556c9.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Linklist","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/link.md","filePath":"api/packages/datastructure/link.md"}'),e={name:"api/packages/datastructure/link.md"},t=s("h1",{id:"Linklist",tabindex:"-1"},[a("Linklist "),s("a",{class:"header-anchor",href:"#Linklist","aria-label":'Permalink to "Linklist"'},"​")],-1),c=s("p",null,"Linklist是链表数据结构,它的节点有一个值和一个指向下一个节点的指针。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",5),k=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",179),g=[t,c,r,y,i,F,A,u,d,k,E];function h(v,b,m,f,B,D){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.js b/docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.js new file mode 100644 index 0000000..aab13e9 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.js @@ -0,0 +1,995 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"List","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/list.md","filePath":"api/packages/datastructure/list.md"}'),e={name:"api/packages/datastructure/list.md"},t=s("h1",{id:"List",tabindex:"-1"},[a("List "),s("a",{class:"header-anchor",href:"#List","aria-label":'Permalink to "List"'},"​")],-1),c=s("p",null,"List是线性表数据结构, 用go切片实现。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法

go
import (
+    "github.com/duke-git/lancet/v2/datastructure"
+)
import (
+    "github.com/duke-git/lancet/v2/datastructure"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

文档

NewList

返回List指针实例

函数签名:

go
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}

Contain

判断列表中是否包含特定值

函数签名:

go
func (l *List[T]) Contain(value T) bool
func (l *List[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}

Data

返回List中所有数据(切片)

函数签名:

go
func (l *List[T]) Data() []T
func (l *List[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}

ValueOf

返回列表中索引处的值指针

函数签名:

go
func (l *List[T]) ValueOf(index int) (*T, bool)
func (l *List[T]) ValueOf(index int) (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}

IndexOf

返回列表中值的索引,如果没有找到返回-1

函数签名:

go
func (l *List[T]) IndexOf(value T) int
func (l *List[T]) IndexOf(value T) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}

LastIndexOf

返回列表中最后一次出现的值的索引。如果未找到,则返回-1

函数签名:

go
func (l *List[T]) LastIndexOf(value T) int
func (l *List[T]) LastIndexOf(value T) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}

IndexOfFunc

返回第一个符合函数条件的元素的索引。如果未找到,则返回-1

函数签名:

go
func (l *List[T]) IndexOfFunc(f func(T) bool) int
func (l *List[T]) IndexOfFunc(f func(T) bool) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

LastIndexOfFunc

返回最后一个符合函数条件的元素的索引。如果未找到,则返回-1

函数签名:

go
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

Push

将值附加到列表末尾

函数签名:

go
func (l *List[T]) Push(value T)
func (l *List[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}

PopFirst

删除列表的第一个值并返回该值

函数签名:

go
func (l *List[T]) PopFirst() (*T, bool)
func (l *List[T]) PopFirst() (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}

PopFirst

删除列表的最后一个值并返回该值

函数签名:

go
func (l *List[T]) PopLast() (*T, bool)
func (l *List[T]) PopLast() (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}

DeleteAt

删除索引处列表的值,如果索引不在0和列表数据长度之间,则不执行任何操作

函数签名:

go
func (l *List[T]) DeleteAt(index int)
func (l *List[T]) DeleteAt(index int)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}

InsertAt

在索引处插入值到列表中,如果索引不在 0 和列表数据长度之间,则不执行任何操作

函数签名:

go
func (l *List[T]) InsertAt(index int, value T)
func (l *List[T]) InsertAt(index int, value T)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}

UpdateAt

更新索引处列表的值,索引应该在0和列表数据长度-1之间

函数签名:

go
func (l *List[T]) UpdateAt(index int, value T)
func (l *List[T]) UpdateAt(index int, value T)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}

Equal

比较一个列表和另一个列表,在每个元素上使用 reflect.DeepEqual

函数签名:

go
func (l *List[T]) Equal(other *List[T]) bool
func (l *List[T]) Equal(other *List[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}

IsEmpty

判断列表是否为空

函数签名:

go
func (l *List[T]) IsEmpty() bool
func (l *List[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}

Clear

清空列表数据

函数签名:

go
func (l *List[T]) Clear()
func (l *List[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}

Clone

返回列表的一个拷贝

函数签名:

go
func (l *List[T]) Clone() *List[T]
func (l *List[T]) Clone() *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}

Merge

合并两个列表,返回新的列表

函数签名:

go
func (l *List[T]) Merge(other *List[T]) *List[T]
func (l *List[T]) Merge(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}

Size

返回列表数据项的数量

函数签名:

go
func (l *List[T]) Size() int
func (l *List[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}

Cap

返回列表数据容量

函数签名:

go
func (l *List[T]) Cap() int
func (l *List[T]) Cap() int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}

Swap

交换列表中两个索引位置的值

函数签名:

go
func (l *List[T]) Swap(i, j int)
func (l *List[T]) Swap(i, j int)

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}

Reverse

反转列表的数据项顺序

函数签名:

go
func (l *List[T]) Reverse()
func (l *List[T]) Reverse()

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}

Unique

列表去除重复数据项

函数签名:

go
func (l *List[T]) Unique()
func (l *List[T]) Unique()

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}

Union

两个列表取并集,去除重复数据项

函数签名:

go
func (l *List[T]) Union(other *List[T]) *List[T]
func (l *List[T]) Union(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}

Intersection

两个列表取交集

函数签名:

go
func (l *List[T]) Intersection(other *List[T]) *List[T]
func (l *List[T]) Intersection(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}

Difference

差集运算。

函数签名:

go
func (l *List[T]) Difference(other *List[T]) *List[T]
func (l *List[T]) Difference(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}

SymmetricDifference

对称差集运算。

函数签名:

go
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}

RetainAll

仅保留列表中包含在给定列表中的元素。

函数签名:

go
func (l *List[T]) RetainAll(list *List[T]) bool
func (l *List[T]) RetainAll(list *List[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}

DeleteAll

从列表中删除给定列表中包含的所有元素。

函数签名:

go
func (l *List[T]) DeleteAll(list *List[T]) bool
func (l *List[T]) DeleteAll(list *List[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}

ForEach

对列表的每个元素执行给定的操作。

函数签名:

go
func (l *List[T]) ForEach(consumer func(T))
func (l *List[T]) ForEach(consumer func(T))

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

Iterator

按顺序返回列表中元素的迭代器。

函数签名:

go
func (l *List[T]) Iterator() iterator.Iterator[T]
func (l *List[T]) Iterator() iterator.Iterator[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

ListToMap

基于iteratee函数将列表转换为映射map。

函数签名:

go
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}

SubList

返回指定的fromIndex(包含)和toIndex(不包含)之间的原始列表的子列表。

函数签名:

go
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}

DeleteIf

删除列表中所有符合函数(调用函数返回true)的元素,返回删除元素的数量

函数签名:

go
func (l *List[T]) DeleteIf(f func(T) bool) int
func (l *List[T]) DeleteIf(f func(T) bool) int

示例:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}
`,211),f=[t,c,r,y,F,i,A,E,u,d,g];function B(h,m,v,C,b,q){return p(),o("div",null,f)}const L=l(e,[["render",B]]);export{D as __pageData,L as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.lean.js new file mode 100644 index 0000000..578a79b --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_list.md.c39c7138.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"List","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/list.md","filePath":"api/packages/datastructure/list.md"}'),e={name:"api/packages/datastructure/list.md"},t=s("h1",{id:"List",tabindex:"-1"},[a("List "),s("a",{class:"header-anchor",href:"#List","aria-label":'Permalink to "List"'},"​")],-1),c=s("p",null,"List是线性表数据结构, 用go切片实现。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",211),f=[t,c,r,y,F,i,A,E,u,d,g];function B(h,m,v,C,b,q){return p(),o("div",null,f)}const L=l(e,[["render",B]]);export{D as __pageData,L as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.js b/docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.js new file mode 100644 index 0000000..3f7a6e2 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.js @@ -0,0 +1,1307 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const b=JSON.parse('{"title":"Queue","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/queue.md","filePath":"api/packages/datastructure/queue.md"}'),e={name:"api/packages/datastructure/queue.md"},t=s("h1",{id:"Queue",tabindex:"-1"},[o("Queue "),s("a",{class:"header-anchor",href:"#Queue","aria-label":'Permalink to "Queue"'},"​")],-1),c=s("p",null,"队列数据结构,包括ArrayQueue, LinkedQueue, CircularQueue, and PriorityQueue。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n('

源码

',2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n(`

用法

go
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

目录

1. ArrayQueue

2. LinkedQueue

3. CircularQueue

4. PriorityQueue

',9),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

文档

1. ArrayQueue

切片实现普通队列数据结构

NewArrayQueue

返回具有特定容量的ArrayQueue指针

函数签名:

go
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *ArrayQueue[T]) Data() []T
func (q *ArrayQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *ArrayQueue[T]) Enqueue(item T) bool
func (q *ArrayQueue[T]) Enqueue(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *ArrayQueue[T]) Dequeue() (T, bool)
func (q *ArrayQueue[T]) Dequeue() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

获取对列头部元素

函数签名:

go
func (q *ArrayQueue[T]) Front() T
func (q *ArrayQueue[T]) Front() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

获取对列尾部元素

函数签名:

go
func (q *ArrayQueue[T]) Back() T
func (q *ArrayQueue[T]) Back() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

获取队列元素的数量

函数签名:

go
func (q *ArrayQueue[T]) Size() int
func (q *ArrayQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *ArrayQueue[T]) IsEmpty() bool
func (q *ArrayQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

判断对了是否为满

函数签名:

go
func (q *ArrayQueue[T]) IsFull() bool
func (q *ArrayQueue[T]) IsFull() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

清空队列元素

函数签名:

go
func (q *ArrayQueue[T]) Clear()
func (q *ArrayQueue[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

判断队列是否包含某个值

函数签名:

go
func (q *ArrayQueue[T]) Contain(value T) bool
func (q *ArrayQueue[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

2. LinkedQueue

链表实现普通队列数据结构

NewLinkedQueue

返回LinkedQueue指针

函数签名:

go
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *LinkedQueue[T]) Data() []T
func (q *LinkedQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *LinkedQueue[T]) Enqueue(value T)
func (q *LinkedQueue[T]) Enqueue(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *LinkedQueue[T]) Dequeue() (T, error)
func (q *LinkedQueue[T]) Dequeue() (T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

获取对列头部元素

函数签名:

go
func (q *LinkedQueue[T]) Front() (*T, error)
func (q *LinkedQueue[T]) Front() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

获取对列尾部元素

函数签名:

go
func (q *LinkedQueue[T]) Back() (*T, error)
func (q *LinkedQueue[T]) Back() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

获取队列元素的数量

函数签名:

go
func (q *LinkedQueue[T]) Size() int
func (q *LinkedQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *LinkedQueue[T]) IsEmpty() bool
func (q *LinkedQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

Clear

清空队列元素

函数签名:

go
func (q *LinkedQueue[T]) Clear()
func (q *LinkedQueue[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

判断队列是否包含某个值

函数签名:

go
func (q *LinkedQueue[T]) Contain(value T) bool
func (q *LinkedQueue[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

3. CircularQueue

切片实现的循环队列.

NewCircularQueue

返回具有特定容量的CircularQueue指针

函数签名:

go
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *CircularQueue[T]) Data() []T
func (q *CircularQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *CircularQueue[T]) Enqueue(value T) error
func (q *CircularQueue[T]) Enqueue(value T) error

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *CircularQueue[T]) Dequeue() (*T, bool)
func (q *CircularQueue[T]) Dequeue() (*T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

获取对列头部元素

函数签名:

go
func (q *CircularQueue[T]) Front() T
func (q *CircularQueue[T]) Front() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

获取对列尾部元素

函数签名:

go
func (q *CircularQueue[T]) Back() T
func (q *CircularQueue[T]) Back() T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

获取队列元素的数量

函数签名:

go
func (q *CircularQueue[T]) Size() int
func (q *CircularQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *CircularQueue[T]) IsEmpty() bool
func (q *CircularQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

判断对了是否为满

函数签名:

go
func (q *CircularQueue[T]) IsFull() bool
func (q *CircularQueue[T]) IsFull() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

清空队列元素

函数签名:

go
func (q *CircularQueue[T]) Clear()
func (q *CircularQueue[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

判断队列是否包含某个值

函数签名:

go
func (q *CircularQueue[T]) Contain(value T) bool
func (q *CircularQueue[T]) Contain(value T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

4. PriorityQueue

切片实现的额优先级队列。

NewPriorityQueue

返回一个具有特定容量的PriorityQueue指针,参数 \`comarator\` 用于比较队列中T类型的值。

函数签名:

go
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Data

获取队列所有元素的切片

函数签名:

go
func (q *PriorityQueue[T]) Data() []T
func (q *PriorityQueue[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Enqueue

元素入队列

函数签名:

go
func (q *PriorityQueue[T]) Enqueue(item T) bool
func (q *PriorityQueue[T]) Enqueue(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}

Dequeue

移除队列的头元素并返回

函数签名:

go
func (q *PriorityQueue[T]) Dequeue() (T, bool)
func (q *PriorityQueue[T]) Dequeue() (T, bool)

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}

IsEmpty

判断对了是否为空

函数签名:

go
func (q *PriorityQueue[T]) IsEmpty() bool
func (q *PriorityQueue[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

判断对了是否为满

函数签名:

go
func (q *PriorityQueue[T]) IsFull() bool
func (q *PriorityQueue[T]) IsFull() bool

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}

Size

获取队列元素的数量

函数签名:

go
func (q *PriorityQueue[T]) Size() int
func (q *PriorityQueue[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}
`,243),q=[t,c,r,y,F,i,u,A,E,d];function g(m,h,v,C,f,B){return l(),p("div",null,q)}const D=a(e,[["render",g]]);export{b as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.lean.js new file mode 100644 index 0000000..c0e1068 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_queue.md.55dce1c4.lean.js @@ -0,0 +1 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const b=JSON.parse('{"title":"Queue","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/queue.md","filePath":"api/packages/datastructure/queue.md"}'),e={name:"api/packages/datastructure/queue.md"},t=s("h1",{id:"Queue",tabindex:"-1"},[o("Queue "),s("a",{class:"header-anchor",href:"#Queue","aria-label":'Permalink to "Queue"'},"​")],-1),c=s("p",null,"队列数据结构,包括ArrayQueue, LinkedQueue, CircularQueue, and PriorityQueue。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n("",2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",9),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",243),q=[t,c,r,y,F,i,u,A,E,d];function g(m,h,v,C,f,B){return l(),p("div",null,q)}const D=a(e,[["render",g]]);export{b as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.js b/docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.js new file mode 100644 index 0000000..08d3507 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.js @@ -0,0 +1,571 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const S=JSON.parse('{"title":"Set","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/set.md","filePath":"api/packages/datastructure/set.md"}'),e={name:"api/packages/datastructure/set.md"},t=s("h1",{id:"Set",tabindex:"-1"},[a("Set "),s("a",{class:"header-anchor",href:"#Set","aria-label":'Permalink to "Set"'},"​")],-1),c=s("p",null,"Set 集合数据结构,类似列表。Set 中元素不重复。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法

go
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

目录

',2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

文档

NewSet

返回Set结构体对象

函数签名:

go
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

NewSetFromSlice

基于切片创建集合

函数签名:

go
func NewSetFromSlice[T comparable](items []T) Set[T]
func NewSetFromSlice[T comparable](items []T) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}

Values

获取集合中所有元素的切片

函数签名:

go
func (s Set[T]) Values() []T
func (s Set[T]) Values() []T

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

Add

向集合中添加元素

函数签名:

go
func (s Set[T]) Add(items ...T)
func (s Set[T]) Add(items ...T)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}

AddIfNotExist

如果集合中不存在元素,则添加该元素返回true, 如果集合中存在元素, 不做任何操作,返回false

函数签名:

go
func (s Set[T]) AddIfNotExist(item T) bool
func (s Set[T]) AddIfNotExist(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}

AddIfNotExistBy

根据checker函数判断元素是否在集合中,如果集合中不存在元素且checker返回true,则添加该元素返回true, 否则不做任何操作,返回false

函数签名:

go
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}

Delete

删除集合中元素

函数签名:

go
func (s Set[T]) Delete(items ...T)
func (s Set[T]) Delete(items ...T)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}

Contain

判断集合是否包含某个值

函数签名:

go
func (s Set[T]) Contain(item T) bool
func (s Set[T]) Contain(item T) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}

ContainAll

判断集合是否包含另一个集合

函数签名:

go
func (s Set[T]) ContainAll(other Set[T]) bool
func (s Set[T]) ContainAll(other Set[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}

Size

获取集合中元素的个数

函数签名:

go
func (s Set[T]) Size() int
func (s Set[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}

Clone

克隆一个集合

函数签名:

go
func (s Set[T]) Clone() Set[T]
func (s Set[T]) Clone() Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}

Equal

比较两个集合是否相等,包含相同元素为相等

函数签名:

go
func (s Set[T]) Equal(other Set[T]) bool
func (s Set[T]) Equal(other Set[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}

Iterate

迭代结合,在每个元素上调用函数

函数签名:

go
func (s Set[T]) Iterate(fn func(item T))
func (s Set[T]) Iterate(fn func(item T))

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}

EachWithBreak

遍历集合的元素并为每个元素调用iteratee函数,当iteratee函数返回false时,终止遍历。

函数签名:

go
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}

IsEmpty

判断集合是否为空

函数签名:

go
func (s Set[T]) IsEmpty() bool
func (s Set[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}

Union

求两个集合的并集

函数签名:

go
func (s Set[T]) Union(other Set[T]) Set[T]
func (s Set[T]) Union(other Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}

Intersection

求两个集合的交集

函数签名:

go
func (s Set[T]) Intersection(other Set[T]) Set[T]
func (s Set[T]) Intersection(other Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}

SymmetricDifference

返回一个集合,其中元素在第一个集合或第二个集合中,且不同时存在于两个集合中

函数签名:

go
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}

Minus

创建一个集合,其元素在原始集中但不在比较集中

函数签名:

go
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}

Pop

删除并返回集合中的顶部元素

函数签名:

go
func (s Set[T]) Pop() (v T, ok bool)
func (s Set[T]) Pop() (v T, ok bool)

示例:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}
`,121),h=[t,c,r,y,F,i,A,E,d,u,g];function m(f,B,v,b,C,k){return p(),o("div",null,h)}const D=l(e,[["render",m]]);export{S as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.lean.js new file mode 100644 index 0000000..dd57921 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_set.md.8bd77304.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const S=JSON.parse('{"title":"Set","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/set.md","filePath":"api/packages/datastructure/set.md"}'),e={name:"api/packages/datastructure/set.md"},t=s("h1",{id:"Set",tabindex:"-1"},[a("Set "),s("a",{class:"header-anchor",href:"#Set","aria-label":'Permalink to "Set"'},"​")],-1),c=s("p",null,"Set 集合数据结构,类似列表。Set 中元素不重复。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",121),h=[t,c,r,y,F,i,A,E,d,u,g];function m(f,B,v,b,C,k){return p(),o("div",null,h)}const D=l(e,[["render",m]]);export{S as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.js b/docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.js new file mode 100644 index 0000000..577c27d --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.js @@ -0,0 +1,545 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const q=JSON.parse('{"title":"Stack","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/stack.md","filePath":"api/packages/datastructure/stack.md"}'),e={name:"api/packages/datastructure/stack.md"},t=s("h1",{id:"Stack",tabindex:"-1"},[n("Stack "),s("a",{class:"header-anchor",href:"#Stack","aria-label":'Permalink to "Stack"'},"​")],-1),c=s("p",null,"栈数据结构,包括ArrayStack(数组栈)和LinkedStack(链表栈)。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[n("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

用法

go
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
`,2),k=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a('

目录

1. ArrayStack(数组栈)

2. LinkedStack(链表栈)

',5),d=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a(`

文档

1. ArrayStack

用切片实现栈结构

NewArrayStack

返回ArrayStack指针实例

函数签名:

go
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}

Push

将元素加入数组栈

函数签名:

go
func (s *ArrayStack[T]) Push(value T)
func (s *ArrayStack[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

删除栈顶元素并返回该元素指针

函数签名:

go
func (s *ArrayStack[T]) Pop() (*T, error)
func (s *ArrayStack[T]) Pop() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

返回栈顶元素指针

函数签名:

go
func (s *ArrayStack[T]) Peak() (*T, error)
func (s *ArrayStack[T]) Peak() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

返回栈中所有元素组成的切片

函数签名:

go
func (s *ArrayStack[T]) Data() []T
func (s *ArrayStack[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

返回栈中元素的数量

函数签名:

go
func (s *ArrayStack[T]) Size() int
func (s *ArrayStack[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

判断栈是否为空

函数签名:

go
func (s *ArrayStack[T]) IsEmpty() bool
func (s *ArrayStack[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

清空栈元素,使栈为空

函数签名:

go
func (s *ArrayStack[T]) Clear()
func (s *ArrayStack[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

2. LinkedStack

链表实现的栈结构。

NewLinkedStack

返回LinkedStack指针实例

函数签名:

go
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}

Push

将元素加入链表栈

函数签名:

go
func (s *LinkedStack[T]) Push(value T)
func (s *LinkedStack[T]) Push(value T)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

删除栈顶元素并返回该元素指针

函数签名:

go
func (s *LinkedStack[T]) Pop() (*T, error)
func (s *LinkedStack[T]) Pop() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

返回栈顶元素指针

函数签名:

go
func (s *LinkedStack[T]) Peak() (*T, error)
func (s *LinkedStack[T]) Peak() (*T, error)

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

返回栈中所有元素组成的切片

函数签名:

go
func (s *LinkedStack[T]) Data() []T
func (s *LinkedStack[T]) Data() []T

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

返回栈中元素的数量

函数签名:

go
func (s *LinkedStack[T]) Size() int
func (s *LinkedStack[T]) Size() int

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

判断栈是否为空

函数签名:

go
func (s *LinkedStack[T]) IsEmpty() bool
func (s *LinkedStack[T]) IsEmpty() bool

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

清空栈元素,使栈为空

函数签名:

go
func (s *LinkedStack[T]) Clear()
func (s *LinkedStack[T]) Clear()

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

Print

打印链表栈结构

函数签名:

go
func (s *LinkedStack[T]) Print()
func (s *LinkedStack[T]) Print()

示例:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}
`,107),h=[t,c,r,y,F,i,A,k,u,d,E];function g(m,v,f,P,b,B){return p(),o("div",null,h)}const S=l(e,[["render",g]]);export{q as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.lean.js new file mode 100644 index 0000000..e5f5d44 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_stack.md.9d7b51a7.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const q=JSON.parse('{"title":"Stack","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/stack.md","filePath":"api/packages/datastructure/stack.md"}'),e={name:"api/packages/datastructure/stack.md"},t=s("h1",{id:"Stack",tabindex:"-1"},[n("Stack "),s("a",{class:"header-anchor",href:"#Stack","aria-label":'Permalink to "Stack"'},"​")],-1),c=s("p",null,"栈数据结构,包括ArrayStack(数组栈)和LinkedStack(链表栈)。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[n("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),k=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",5),d=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a("",107),h=[t,c,r,y,F,i,A,k,u,d,E];function g(m,v,f,P,b,B){return p(),o("div",null,h)}const S=l(e,[["render",g]]);export{q as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.js b/docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.js new file mode 100644 index 0000000..8f7423c --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.js @@ -0,0 +1,635 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"Tree","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/tree.md","filePath":"api/packages/datastructure/tree.md"}'),e={name:"api/packages/datastructure/tree.md"},t=s("h1",{id:"Tree",tabindex:"-1"},[a("Tree "),s("a",{class:"header-anchor",href:"#Tree","aria-label":'Permalink to "Tree"'},"​")],-1),r=s("p",null,"树是树节点的集合。 每个树节点都有一个值,一个指向左节点的左指针和一个指向右节点的右指针。",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法

go
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

1. BSTree

',3),d=s("div",{STYLE:"page-break-after: always;"},null,-1),v=n(`

文档

1. BSTree

BSTree是一种二叉搜索树数据结构,其中每个节点有两个孩子,分别称为左孩子和右孩子。 在 BSTree 中:leftNode < rootNode < rightNode。 T类型应该实现lancetconstraints.Comparator。

NewBSTree

返回BSTree指针实例

函数签名:

go
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}

Insert

将值插入二叉搜索树

函数签名:

go
func (t *BSTree[T]) Insert(data T)
func (t *BSTree[T]) Insert(data T)

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

Delete

删除插入二叉搜索树中指定的值

函数签名:

go
func (t *BSTree[T]) Delete(data T)
func (t *BSTree[T]) Delete(data T)

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}

PreOrderTraverse

按前序遍历树节点

函数签名:

go
func (t *BSTree[T]) PreOrderTraverse() []T
func (t *BSTree[T]) PreOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

InOrderTraverse

按中序遍历树节点

函数签名:

go
func (t *BSTree[T]) InOrderTraverse() []T
func (t *BSTree[T]) InOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}

PostOrderTraverse

按后序遍历树节点

函数签名:

go
func (t *BSTree[T]) PostOrderTraverse() []T
func (t *BSTree[T]) PostOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}

LevelOrderTraverse

按节点层次遍历树节点

函数签名:

go
func (t *BSTree[T]) LevelOrderTraverse() []T
func (t *BSTree[T]) LevelOrderTraverse() []T

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}

Depth

获取树的深度

函数签名:

go
func (t *BSTree[T]) Depth() int
func (t *BSTree[T]) Depth() int

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}

HasSubTree

判断给定树是否是子树

函数签名:

go
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}

Print

打印树结构

函数签名:

go
func (t *BSTree[T]) Print()
func (t *BSTree[T]) Print()

示例:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \\
+//      /   \\
+//     /     \\
+//    /       \\
+//    5       7
+//   /
+//  /
+//  2
+//   \\
+//    4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \\
+//      /   \\
+//     /     \\
+//    /       \\
+//    5       7
+//   /
+//  /
+//  2
+//   \\
+//    4
+}
`,63),B=[t,r,c,y,F,i,A,E,u,d,v];function C(m,b,T,g,h,f){return p(),o("div",null,B)}const k=l(e,[["render",C]]);export{_ as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.lean.js b/docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.lean.js new file mode 100644 index 0000000..6da99c4 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datastructure_tree.md.1eeacf87.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"Tree","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datastructure/tree.md","filePath":"api/packages/datastructure/tree.md"}'),e={name:"api/packages/datastructure/tree.md"},t=s("h1",{id:"Tree",tabindex:"-1"},[a("Tree "),s("a",{class:"header-anchor",href:"#Tree","aria-label":'Permalink to "Tree"'},"​")],-1),r=s("p",null,"树是树节点的集合。 每个树节点都有一个值,一个指向左节点的左指针和一个指向右节点的右指针。",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码",tabindex:"-1"},[a("源码 "),s("a",{class:"header-anchor",href:"#源码","aria-label":'Permalink to "源码"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",3),d=s("div",{STYLE:"page-break-after: always;"},null,-1),v=n("",63),B=[t,r,c,y,F,i,A,E,u,d,v];function C(m,b,T,g,h,f){return p(),o("div",null,B)}const k=l(e,[["render",C]]);export{_ as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.js b/docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.js new file mode 100644 index 0000000..a2fe047 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.js @@ -0,0 +1,1399 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Datetime","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datetime.md","filePath":"api/packages/datetime.md"}'),e={name:"api/packages/datetime.md"},t=s("h1",{id:"Datetime",tabindex:"-1"},[a("Datetime "),s("a",{class:"header-anchor",href:"#Datetime","aria-label":'Permalink to "Datetime"'},"​")],-1),c=s("p",null,"datetime 日期时间处理包,格式化日期,比较日期。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

文档

注:

  1. 函数中format参数值需要传以下值之一 (忽略大小写):

AddDay

将日期加/减天数。

函数签名:

go
func AddDay(t time.Time, day int64) time.Time
func AddDay(t time.Time, day int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}

AddHour

将日期加/减小时数。

函数签名:

go
func AddHour(t time.Time, hour int64) time.Time
func AddHour(t time.Time, hour int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}

AddMinute

将日期加/减分钟数。

函数签名:

go
func AddMinute(t time.Time, minute int64) time.Time
func AddMinute(t time.Time, minute int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}

AddYear

将日期加/减年数。

函数签名:

go
func AddYear(t time.Time, year int64) time.Time
func AddYear(t time.Time, year int64) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}

BeginOfMinute

返回指定时间的分钟开始时间。

函数签名:

go
func BeginOfMinute(t time.Time) time.Time
func BeginOfMinute(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}

BeginOfHour

返回指定时间的小时开始时间。

函数签名:

go
func BeginOfHour(t time.Time) time.Time
func BeginOfHour(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}

BeginOfDay

返回指定时间的当天开始时间。

函数签名:

go
func BeginOfDay(t time.Time) time.Time
func BeginOfDay(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfWeek

返回指定时间的每周开始时间,默认开始时间星期日。

函数签名:

go
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfMonth

返回指定时间的当月开始时间。

函数签名:

go
func BeginOfMonth(t time.Time) time.Time
func BeginOfMonth(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

BeginOfYear

返回指定时间的当年开始时间

函数签名:

go
func BeginOfYear(t time.Time) time.Time
func BeginOfYear(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

EndOfMinute

返回指定时间的分钟结束时间。

函数签名:

go
func EndOfMinute(t time.Time) time.Time
func EndOfMinute(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}

EndOfHour

返回指定时间的小时结束时间。

函数签名:

go
func EndOfHour(t time.Time) time.Time
func EndOfHour(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}

EndOfDay

返回指定时间的当天结束时间。

函数签名:

go
func EndOfDay(t time.Time) time.Time
func EndOfDay(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}

EndOfWeek

返回指定时间的星期结束时间,默认结束时间星期六。

函数签名:

go
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}

EndOfMonth

返回指定时间的当月结束时间。

函数签名:

go
func EndOfMonth(t time.Time) time.Time
func EndOfMonth(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}

EndOfYear

返回指定时间的当年结束时间。

函数签名:

go
func EndOfYear(t time.Time) time.Time
func EndOfYear(t time.Time) time.Time

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}

GetNowDate

获取当天日期,返回格式:yyyy-mm-dd。

函数签名:

go
func GetNowDate() string
func GetNowDate() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}

GetNowTime

获取当时时间,返回格式:hh:mm:ss

函数签名:

go
func GetNowTime() string
func GetNowTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime)
+
+    // Output:
+    // 15:57:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime)
+
+    // Output:
+    // 15:57:33
+}

GetNowDateTime

获取当时日期和时间,返回格式:yyyy-mm-dd hh:mm:ss。

函数签名:

go
func GetNowDateTime() string
func GetNowDateTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}

GetTodayStartTime

返回当天开始时间, 格式: yyyy-mm-dd 00:00:00。

函数签名:

go
func GetTodayStartTime() string
func GetTodayStartTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}

GetTodayEndTime

返回当天结束时间,格式: yyyy-mm-dd 23:59:59。

函数签名:

go
func GetTodayEndTime() string
func GetTodayEndTime() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}

GetZeroHourTimestamp

获取零点时间戳(timestamp of 00:00)

函数签名:

go
func GetZeroHourTimestamp() int64
func GetZeroHourTimestamp() int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}

GetNightTimestamp

获取午夜时间戳(timestamp of 23:59)。

函数签名:

go
func GetNightTimestamp() int64
func GetNightTimestamp() int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}

FormatTimeToStr

将日期格式化成字符串,\`format\` 参数格式参考注1。

函数签名:

go
func FormatTimeToStr(t time.Time, format string, timezone ...string) string
func FormatTimeToStr(t time.Time, format string, timezone ...string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}

FormatStrToTime

将字符串格式化成时间,\`format\` 参数格式参考注1。

函数签名:

go
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}

NewUnixNow

创建一个当前时间的unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewUnix

创建一个unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewFormat

创建一个yyyy-mm-dd hh:mm:ss格式时间字符串的unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}

NewISO8601

创建一个iso8601格式时间字符串的unix时间戳。

函数签名:

go
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}

ToUnix

返回unix时间戳。

函数签名:

go
func (t *theTime) ToUnix() int64
func (t *theTime) ToUnix() int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}

ToFormat

返回格式'yyyy-mm-dd hh:mm:ss'的日期字符串。

函数签名:

go
func (t *theTime) ToFormat() string
func (t *theTime) ToFormat() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}

ToFormatForTpl

返回tpl格式指定的日期字符串。

函数签名:

go
func (t *theTime) ToFormatForTpl(tpl string) string
func (t *theTime) ToFormatForTpl(tpl string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}

ToIso8601

返回iso8601日期字符串。

函数签名:

go
func (t *theTime) ToIso8601() string
func (t *theTime) ToIso8601() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}

IsLeapYear

验证是否是闰年。

函数签名:

go
func IsLeapYear(year int) bool
func IsLeapYear(year int) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

BetweenSeconds

返回两个时间的间隔秒数。

函数签名:

go
func BetweenSeconds(t1 time.Time, t2 time.Time) int64
func BetweenSeconds(t1 time.Time, t2 time.Time) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}

DayOfYear

返回参数日期是一年中的第几天。

函数签名:

go
func DayOfYear(t time.Time) int
func DayOfYear(t time.Time) int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}

IsWeekend(已废弃, 使用 '== Weekday')

判断日期是否是周末。

函数签名:

go
func IsWeekend(t time.Time) bool
func IsWeekend(t time.Time) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

NowDateOrTime

根据指定的格式和时区返回当前时间字符串。

函数签名:

go
func NowDateOrTime(format string, timezone ...string) string
func NowDateOrTime(format string, timezone ...string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}

Timestamp

返回当前秒级时间戳。

函数签名:

go
func Timestamp(timezone ...string) int64
func Timestamp(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}

TimestampMilli

返回当前毫秒级时间戳。

函数签名:

go
func TimestampMilli(timezone ...string) int64
func TimestampMilli(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}

TimestampMicro

返回当前微秒级时间戳。

函数签名:

go
func TimestampMicro(timezone ...string) int64
func TimestampMicro(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}

TimestampNano

返回当前纳秒级时间戳。

函数签名:

go
func TimestampNano(timezone ...string) int64
func TimestampNano(timezone ...string) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}
`,256),g=[t,c,r,y,i,F,d,A,u,E,m];function h(f,B,v,q,b,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.lean.js b/docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.lean.js new file mode 100644 index 0000000..b6c5610 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_datetime.md.53f898b5.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Datetime","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/datetime.md","filePath":"api/packages/datetime.md"}'),e={name:"api/packages/datetime.md"},t=s("h1",{id:"Datetime",tabindex:"-1"},[a("Datetime "),s("a",{class:"header-anchor",href:"#Datetime","aria-label":'Permalink to "Datetime"'},"​")],-1),c=s("p",null,"datetime 日期时间处理包,格式化日期,比较日期。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",256),g=[t,c,r,y,i,F,d,A,u,E,m];function h(f,B,v,q,b,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.js b/docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.js new file mode 100644 index 0000000..5ed09c6 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.js @@ -0,0 +1,781 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Fileutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/fileutil.md","filePath":"api/packages/fileutil.md"}'),e={name:"api/packages/fileutil.md"},t=s("h1",{id:"Fileutil",tabindex:"-1"},[a("Fileutil "),s("a",{class:"header-anchor",href:"#Fileutil","aria-label":'Permalink to "Fileutil"'},"​")],-1),c=s("p",null,"fileutil 包支持文件基本操作。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/fileutil/file.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/fileutil/file.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

目录

',2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n(`

文档

ClearFile

清空文件内容

函数签名:

go
func ClearFile(path string) error
func ClearFile(path string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CreateFile

创建文件,创建成功返回true, 否则返回false

函数签名:

go
func CreateFile(path string) bool
func CreateFile(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}

CreateDir

使用绝对路径创建嵌套目录,例如/a/, /a/b

函数签名:

go
func CreateDir(absPath string) error
func CreateDir(absPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}

CopyFile

拷贝文件,会覆盖原有的文件

函数签名:

go
func CopyFile(srcPath string, dstPath string) error
func CopyFile(srcPath string, dstPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CurrentPath

返回当前位置的绝对路径。

函数签名:

go
func CurrentPath() string
func CurrentPath() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}

FileMode

获取文件mode信息

函数签名:

go
func FileMode(path string) (fs.FileMode, error)
func FileMode(path string) (fs.FileMode, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}

MiMeType

获取文件mime类型, 'file'参数的类型必须是string或者*os.File

函数签名:

go
func MiMeType(file any) string
func MiMeType(file any) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}

IsExist

判断文件或目录是否存在

函数签名:

go
func IsExist(path string) bool
func IsExist(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}

判断文件是否是符号链接

函数签名:

go
func IsLink(path string) bool
func IsLink(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}

IsDir

判断参数是否是目录

函数签名:

go
func IsDir(path string) bool
func IsDir(path string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}

ListFileNames

返回目录下所有文件名

函数签名:

go
func ListFileNames(path string) ([]string, error)
func ListFileNames(path string) ([]string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}

RemoveFile

删除文件

函数签名:

go
func RemoveFile(path string) error
func RemoveFile(path string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ReadFileToString

读取文件内容并返回字符串

函数签名:

go
func ReadFileToString(path string) (string, error)
func ReadFileToString(path string) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}

ReadFileByLine

按行读取文件内容,返回字符串切片包含每一行

函数签名:

go
func ReadFileByLine(path string)([]string, error)
func ReadFileByLine(path string)([]string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}

Zip

zip压缩文件, fpath参数可以是文件或目录

函数签名:

go
func Zip(fpath string, destPath string) error
func Zip(fpath string, destPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ZipAppendEntry

通过将单个文件或目录追加到现有的zip文件

函数签名:

go
func ZipAppendEntry(fpath string, destPath string) error
func ZipAppendEntry(fpath string, destPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

UnZip

zip解压缩文件并保存在目录中

函数签名:

go
func UnZip(zipFile string, destPath string) error
func UnZip(zipFile string, destPath string) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

IsZipFile

判断文件是否是zip压缩文件。

函数签名:

go
func IsZipFile(filepath string) bool
func IsZipFile(filepath string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}

FileSize

返回文件字节大小。

函数签名:

go
func FileSize(path string) (int64, error)
func FileSize(path string) (int64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}

MTime

返回文件修改时间(unix timestamp).

函数签名:

go
func MTime(filepath string) (int64, error)
func MTime(filepath string) (int64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}

Sha

返回文件sha值,参数\`shaType\` 应传值为: 1, 256,512.

函数签名:

go
func Sha(filepath string, shaType ...int) (string, error)
func Sha(filepath string, shaType ...int) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}

ReadCsvFile

读取csv文件内容到切片

函数签名:

go
func ReadCsvFile(filepath string) ([][]string, error)
func ReadCsvFile(filepath string) ([][]string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}

WriteCsvFile

向csv文件写入内容。

函数签名:

go
func WriteCsvFile(filepath string, records [][]string, append bool) error
func WriteCsvFile(filepath string, records [][]string, append bool) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}

WriteBytesToFile

将bytes写入文件。

函数签名:

go
func WriteBytesToFile(filepath string, content []byte) error
func WriteBytesToFile(filepath string, content []byte) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}

WriteStringToFile

将字符串写入文件。

函数签名:

go
func WriteStringToFile(filepath string, content string, append bool) error
func WriteStringToFile(filepath string, content string, append bool) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
`,151),g=[t,c,r,y,i,F,u,E,d,A,f];function h(q,B,m,v,b,C){return p(),o("div",null,g)}const P=l(e,[["render",h]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.lean.js b/docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.lean.js new file mode 100644 index 0000000..f5a57d5 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_fileutil.md.94d3797c.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Fileutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/fileutil.md","filePath":"api/packages/fileutil.md"}'),e={name:"api/packages/fileutil.md"},t=s("h1",{id:"Fileutil",tabindex:"-1"},[a("Fileutil "),s("a",{class:"header-anchor",href:"#Fileutil","aria-label":'Permalink to "Fileutil"'},"​")],-1),c=s("p",null,"fileutil 包支持文件基本操作。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/fileutil/file.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/fileutil/file.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n("",151),g=[t,c,r,y,i,F,u,E,d,A,f];function h(q,B,m,v,b,C){return p(),o("div",null,g)}const P=l(e,[["render",h]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.js b/docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.js new file mode 100644 index 0000000..334e995 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.js @@ -0,0 +1,329 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Formatter","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/formatter.md","filePath":"api/packages/formatter.md"}'),e={name:"api/packages/formatter.md"},t=s("h1",{id:"Formatter",tabindex:"-1"},[a("Formatter "),s("a",{class:"header-anchor",href:"#Formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),c=s("p",null,"formatter 格式化器包含一些数据格式化处理方法。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/byte.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/byte.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

目录

',2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

文档

Comma

用逗号每隔3位分割数字/字符串,支持前缀添加符号。参数value必须是数字或者可以转为数字的字符串, 否则返回空字符串

函数签名:

go
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}

Pretty

返回pretty JSON字符串.

函数签名:

go
func Pretty(v any) (string, error)
func Pretty(v any) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}

PrettyToWriter

Pretty encode数据到writer。

函数签名:

go
func PrettyToWriter(v any, out io.Writer) error
func PrettyToWriter(v any, out io.Writer) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string \`json:"name"\`
+        Aage uint   \`json:"age"\`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string \`json:"name"\`
+        Aage uint   \`json:"age"\`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}

DecimalBytes

返回十进制标准(以1000为基数)下的可读字节单位字符串。precision参数指定小数点后的位数,默认为4。

函数签名:

go
func DecimalBytes(size float64, precision ...int) string
func DecimalBytes(size float64, precision ...int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}

BinaryBytes

返回binary标准(以1024为基数)下的可读字节单位字符串。precision参数指定小数点后的位数,默认为4。

函数签名:

go
func BinaryBytes(size float64, precision ...int) string
func BinaryBytes(size float64, precision ...int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}

ParseDecimalBytes

将字节单位字符串转换成其所表示的字节数(以1000为基数)。

函数签名:

go
func ParseDecimalBytes(size string) (uint64, error)
func ParseDecimalBytes(size string) (uint64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}

ParseBinaryBytes

将字节单位字符串转换成其所表示的字节数(以1024为基数)。

函数签名:

go
func ParseBinaryBytes(size string) (uint64, error)
func ParseBinaryBytes(size string) (uint64, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}
`,43),d=[t,c,r,y,F,i,u,A,E,B,m];function f(g,h,q,D,b,v){return p(),o("div",null,d)}const C=l(e,[["render",f]]);export{k as __pageData,C as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.lean.js b/docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.lean.js new file mode 100644 index 0000000..cb25566 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_formatter.md.8820c0cf.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Formatter","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/formatter.md","filePath":"api/packages/formatter.md"}'),e={name:"api/packages/formatter.md"},t=s("h1",{id:"Formatter",tabindex:"-1"},[a("Formatter "),s("a",{class:"header-anchor",href:"#Formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),c=s("p",null,"formatter 格式化器包含一些数据格式化处理方法。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/byte.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/byte.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",43),d=[t,c,r,y,F,i,u,A,E,B,m];function f(g,h,q,D,b,v){return p(),o("div",null,d)}const C=l(e,[["render",f]]);export{k as __pageData,C as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.js b/docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.js new file mode 100644 index 0000000..c4fb4cc --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.js @@ -0,0 +1,449 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Function","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/function.md","filePath":"api/packages/function.md"}'),e={name:"api/packages/function.md"},c=s("h1",{id:"Function",tabindex:"-1"},[a("Function "),s("a",{class:"header-anchor",href:"#Function","aria-label":'Permalink to "Function"'},"​")],-1),t=s("p",null,"function 函数包控制函数执行流程,包含部分函数式编程。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/function.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/function.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/watcher.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/watcher.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/function"
+)
import (
+    "github.com/duke-git/lancet/v2/function"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

目录

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n(`

文档

After

创建一个函数,当他被调用n或更多次之后将马上触发fn

函数签名:

go
func After(n int, fn any) func(args ...any) []reflect.Value
func After(n int, fn any) func(args ...any) []reflect.Value

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}

Before

创建一个函数,调用次数不超过n次,之后再调用这个函数,将返回一次最后调用fn的结果

函数签名:

go
func Before(n int, fn any) func(args ...any) []reflect.Value
func Before(n int, fn any) func(args ...any) []reflect.Value

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}

CurryFn

创建柯里化函数

函数签名:

go
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}

Compose

从右至左组合函数列表fnList,返回组合后的函数

函数签名:

go
func Compose[T any](fnList ...func(...T) T) func(...T) T
func Compose[T any](fnList ...func(...T) T) func(...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}

Debounced

创建一个debounced函数,该函数延迟调用fn直到自上次调用debounced函数后等待持续时间过去。

函数签名:

go
func Debounced(fn func(), duration time.Duration) func()
func Debounced(fn func(), duration time.Duration) func()

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}

Delay

延迟delay时间后调用函数

函数签名:

go
func Delay(delay time.Duration, fn any, args ...any)
func Delay(delay time.Duration, fn any, args ...any)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}

Schedule

每次持续时间调用函数,直到关闭返回的 bool chan

函数签名:

go
func Schedule(d time.Duration, fn any, args ...any) chan bool
func Schedule(d time.Duration, fn any, args ...any) chan bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}

Pipeline

执行函数pipeline.

函数签名:

go
func Pipeline[T any](funcs ...func(T) T) func(T) T
func Pipeline[T any](funcs ...func(T) T) func(T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}

Watcher

Watcher用于记录代码执行时间。可以启动/停止/重置手表定时器。获取函数执行的时间。

函数签名:

go
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start()
+func (w *Watcher) Stop()
+func (w *Watcher) Reset()
+func (w *Watcher) GetElapsedTime() time.Duration
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start()
+func (w *Watcher) Stop()
+func (w *Watcher) Reset()
+func (w *Watcher) GetElapsedTime() time.Duration

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}
`,55),h=[c,t,r,y,F,i,A,u,d,E,f];function g(m,C,B,b,v,k){return p(),o("div",null,h)}const _=l(e,[["render",g]]);export{D as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.lean.js b/docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.lean.js new file mode 100644 index 0000000..cf8f517 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_function.md.5cbb4c31.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Function","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/function.md","filePath":"api/packages/function.md"}'),e={name:"api/packages/function.md"},c=s("h1",{id:"Function",tabindex:"-1"},[a("Function "),s("a",{class:"header-anchor",href:"#Function","aria-label":'Permalink to "Function"'},"​")],-1),t=s("p",null,"function 函数包控制函数执行流程,包含部分函数式编程。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/function.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/function.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/watcher.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/watcher.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n("",55),h=[c,t,r,y,F,i,A,u,d,E,f];function g(m,C,B,b,v,k){return p(),o("div",null,h)}const _=l(e,[["render",g]]);export{D as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.js b/docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.js new file mode 100644 index 0000000..f601a85 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.js @@ -0,0 +1,1631 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Maputil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/maputil.md","filePath":"api/packages/maputil.md"}'),e={name:"api/packages/maputil.md"},t=s("h1",{id:"Maputil",tabindex:"-1"},[a("Maputil "),s("a",{class:"header-anchor",href:"#Maputil","aria-label":'Permalink to "Maputil"'},"​")],-1),c=s("p",null,"maputil 包包括一些操作 map 的函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/maputil/map.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/maputil/map.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录:

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n(`

API 文档:

MapTo

快速将map或者其他类型映射到结构体或者指定类型。

函数签名:

go
func MapTo(src any, dst any) error
func MapTo(src any, dst any) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  \`json:"name"\`
+            Age   int     \`json:"age"\`
+            Phone string  \`json:"phone"\`
+            Addr  Address \`json:"address"\`
+        }
+
+        Address struct {
+            Street string \`json:"street"\`
+            Number int    \`json:"number"\`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  \`json:"name"\`
+            Age   int     \`json:"age"\`
+            Phone string  \`json:"phone"\`
+            Addr  Address \`json:"address"\`
+        }
+
+        Address struct {
+            Street string \`json:"street"\`
+            Number int    \`json:"number"\`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}

ForEach

对map中的每对key和value执行iteratee函数

函数签名:

go
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}

Filter

迭代map中的每对key和value, 返回符合predicate函数的key, value。

函数签名:

go
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}

FilterByKeys

迭代map, 返回一个新map,其key都是给定的key值。

函数签名:

go
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}

FilterByValues

迭代map, 返回一个新map,其value都是给定的value值。

函数签名:

go
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}

OmitBy

Filter的反向操作, 迭代map中的每对key和value, 删除符合predicate函数的key, value, 返回新map。

函数签名:

go
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}

OmitByKeys

FilterByKeys的反向操作, 迭代map, 返回一个新map,其key不包括给定的key值。

函数签名:

go
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}

OmitByValues

FilterByValues的反向操作, 迭代map, 返回一个新map,其value不包括给定的value值。

函数签名:

go
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Intersect

多个map的交集操作

函数签名:

go
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}

Keys

返回map中所有key的切片

函数签名:

go
func Keys[K comparable, V any](m map[K]V) []K
func Keys[K comparable, V any](m map[K]V) []K

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Merge

合并多个maps, 相同的key会被后来的key覆盖

函数签名:

go
func Merge[K comparable, V any](maps ...map[K]V) map[K]V
func Merge[K comparable, V any](maps ...map[K]V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}

Minus

返回一个map,其中的key存在于mapA,不存在于mapB.

函数签名:

go
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}

Values

返回map中所有value的切片

函数签名:

go
func Values[K comparable, V any](m map[K]V) []V
func Values[K comparable, V any](m map[K]V) []V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    // Output:
+    // [a a b c d]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    // Output:
+    // [a a b c d]
+}

KeysBy

创建一个切片,其元素是每个map的key调用mapper函数的结果。

函数签名:

go
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}

ValuesBy

创建一个切片,其元素是每个map的value调用mapper函数的结果。

函数签名:

go
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}

MapKeys

操作map的每个key,然后转为新的map。

函数签名:

go
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}

MapValues

操作map的每个value,然后转为新的map。

函数签名:

go
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}

Entry

将map转换为键/值对切片。

函数签名:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}

FromEntries

基于键/值对的切片创建map。

函数签名:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Transform

将map转换为其他类型的map。

函数签名:

go
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2

示例:运行

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

IsDisjoint

验证两个map是否具有不同的key

函数签名:

go
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasKey

检查map是否包含某个key。用于代替以下样板代码:

go
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}

函数签名:

go
func HasKey[K comparable, V any](m map[K]V, key K) bool
func HasKey[K comparable, V any](m map[K]V, key K) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NewConcurrentMap

ConcurrentMap协程安全的map结构。

函数签名:

go
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}

ConcurrentMap_Set

在map中设置key和value。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Set(key K, value V)
func (cm *ConcurrentMap[K, V]) Set(key K, value V)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_Get

根据key获取value, 如果不存在key,返回零值。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok)
+			wg2.Done()
+        }(j)
+    }
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_GetOrSet

返回键的现有值(如果存在),否则,设置key并返回给定值。

函数签名:

go
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}

ConcurrentMap_Delete

删除key。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Delete(key K)
func (cm *ConcurrentMap[K, V]) Delete(key K)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(i)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(i)
+    }
+    wg2.Wait()
+}

ConcurrentMap_GetAndDelete

获取key,然后删除。

函数签名:

go
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}

ConcurrentMap_Has

验证是否包含key。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Has(key K) bool
func (cm *ConcurrentMap[K, V]) Has(key K) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}

ConcurrentMap_Range

为map中每个键和值顺序调用迭代器。 如果iterator返回false,则停止迭代。

函数签名:

go
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}
`,182),m=[t,c,r,y,F,i,E,A,u,d,B];function g(q,f,h,v,D,C){return p(),o("div",null,m)}const K=l(e,[["render",g]]);export{k as __pageData,K as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.lean.js b/docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.lean.js new file mode 100644 index 0000000..d5da597 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_maputil.md.68434477.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Maputil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/maputil.md","filePath":"api/packages/maputil.md"}'),e={name:"api/packages/maputil.md"},t=s("h1",{id:"Maputil",tabindex:"-1"},[a("Maputil "),s("a",{class:"header-anchor",href:"#Maputil","aria-label":'Permalink to "Maputil"'},"​")],-1),c=s("p",null,"maputil 包包括一些操作 map 的函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/maputil/map.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/maputil/map.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n("",182),m=[t,c,r,y,F,i,E,A,u,d,B];function g(q,f,h,v,D,C){return p(),o("div",null,m)}const K=l(e,[["render",g]]);export{k as __pageData,K as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.js b/docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.js new file mode 100644 index 0000000..7ebc6c0 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.js @@ -0,0 +1,1059 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Mathutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/mathutil.md","filePath":"api/packages/mathutil.md"}'),e={name:"api/packages/mathutil.md"},t=s("h1",{id:"Mathutil",tabindex:"-1"},[a("Mathutil "),s("a",{class:"header-anchor",href:"#Mathutil","aria-label":'Permalink to "Mathutil"'},"​")],-1),c=s("p",null,"mathutil 包实现了一些数学计算的函数.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),h=n(`

文档

Average

计算平均数. 可能需要对结果调用RoundToFloat方法四舍五入

函数签名:

go
func Average[T constraints.Integer | constraints.Float](numbers ...T) T
func Average[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}

Exponent

指数计算(x的n次方)

函数签名:

go
func Exponent(x, n int64) int64
func Exponent(x, n int64) int64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}

Fibonacci

计算斐波那契数列的第n个数

函数签名:

go
func Fibonacci(first, second, n int) int
func Fibonacci(first, second, n int) int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}

Factorial

计算阶乘

函数签名:

go
func Factorial(x uint) uint
func Factorial(x uint) uint

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}

Max

返回参数中的最大数

函数签名:

go
func Max[T constraints.Integer | constraints.Float](numbers ...T) T
func Max[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}

MaxBy

使用给定的比较器函数返回切片的最大值

函数签名:

go
func MaxBy[T any](slice []T, comparator func(T, T) bool) T
func MaxBy[T any](slice []T, comparator func(T, T) bool) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}

Min

返回参数中的最小数

函数签名:

go
func Min[T constraints.Integer | constraints.Float](numbers ...T) T
func Min[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}

MinBy

使用给定的比较器函数返回切片的最小值

函数签名:

go
func MinBy[T any](slice []T, comparator func(T, T) bool) T
func MinBy[T any](slice []T, comparator func(T, T) bool) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}

Percent

计算百分比,保留n位小数

函数签名:

go
func Percent(val, total float64, n int) float64
func Percent(val, total float64, n int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}

RoundToFloat

四舍五入,保留n位小数

函数签名:

go
func RoundToFloat(x float64, n int) float64
func RoundToFloat(x float64, n int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

RoundToString

四舍五入,保留n位小数,返回字符串

函数签名:

go
func RoundToString(x float64, n int) string
func RoundToString(x float64, n int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

TruncRound

截短n位小数(不进行四舍五入)

函数签名:

go
func TruncRound(x float64, n int) float64
func TruncRound(x float64, n int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}

Range

根据指定的起始值和数量,创建一个数字切片。

函数签名:

go
func Range[T constraints.Integer | constraints.Float](start T, count int) []T
func Range[T constraints.Integer | constraints.Float](start T, count int) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}

RangeWithStep

根据指定的起始值,结束值,步长,创建一个数字切片。

函数签名:

go
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}

AngleToRadian

将角度值转为弧度值

函数签名:

go
func AngleToRadian(angle float64) float64
func AngleToRadian(angle float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}

RadianToAngle

将弧度值转为角度值

函数签名:

go
func RadianToAngle(radian float64) float64
func RadianToAngle(radian float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}

PointDistance

计算两个坐标点的距离

函数签名:

go
func PointDistance(x1, y1, x2, y2 float64) float64
func PointDistance(x1, y1, x2, y2 float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}

IsPrime

判断质数。

函数签名:

go
func IsPrime(n int) bool
func IsPrime(n int) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

GCD

计算最大公约数。

函数签名:

go
func GCD[T constraints.Integer](integers ...T) T
func GCD[T constraints.Integer](integers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}

LCM

计算最小公倍数。

函数签名:

go
func LCM[T constraints.Integer](integers ...T) T
func LCM[T constraints.Integer](integers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}

Cos

计算弧度的余弦值

函数签名:

go
func Cos(radian float64, precision ...int) float64
func Cos(radian float64, precision ...int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}

Sin

计算弧度的正弦值

函数签名:

go
func Sin(radian float64, precision ...int) float64
func Sin(radian float64, precision ...int) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}

Log

计算以base为底n的对数。

函数签名:

go
func Log(n, base float64) float64
func Log(n, base float64) float64

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}

Sum

求传入参数之和。

函数签名:

go
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}

Abs

求绝对值。

函数签名:

go
func Abs[T constraints.Integer | constraints.Float](x T) T
func Abs[T constraints.Integer | constraints.Float](x T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}
`,151),g=[t,c,r,y,F,i,A,u,E,d,h];function m(B,f,v,b,C,q){return p(),o("div",null,g)}const P=l(e,[["render",m]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.lean.js b/docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.lean.js new file mode 100644 index 0000000..45bfc42 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_mathutil.md.274658f0.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Mathutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/mathutil.md","filePath":"api/packages/mathutil.md"}'),e={name:"api/packages/mathutil.md"},t=s("h1",{id:"Mathutil",tabindex:"-1"},[a("Mathutil "),s("a",{class:"header-anchor",href:"#Mathutil","aria-label":'Permalink to "Mathutil"'},"​")],-1),c=s("p",null,"mathutil 包实现了一些数学计算的函数.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),h=n("",151),g=[t,c,r,y,F,i,A,u,E,d,h];function m(B,f,v,b,C,q){return p(),o("div",null,g)}const P=l(e,[["render",m]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.js b/docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.js new file mode 100644 index 0000000..a371028 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.js @@ -0,0 +1,1173 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Netutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/netutil.md","filePath":"api/packages/netutil.md"}'),e={name:"api/packages/netutil.md"},t=s("h1",{id:"Netutil",tabindex:"-1"},[a("Netutil "),s("a",{class:"header-anchor",href:"#Netutil","aria-label":'Permalink to "Netutil"'},"​")],-1),c=s("p",null,"netutil 网络包支持获取 ip 地址,发送 http 请求。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/net.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/net.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/http.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/http.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),q=n(`

文档

ConvertMapToQueryString

将map转换成http查询字符串.

函数签名:

go
func ConvertMapToQueryString(param map[string]any) string
func ConvertMapToQueryString(param map[string]any) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    fmt.Println(qs)
+
+    // Output:
+    // a=1&b=2&c=3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    fmt.Println(qs)
+
+    // Output:
+    // a=1&b=2&c=3
+}

EncodeUrl

编码url query string的值

函数签名:

go
func EncodeUrl(urlStr string) (string, error)
func EncodeUrl(urlStr string) (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}

GetInternalIp

获取内部ip

函数签名:

go
func GetInternalIp() string
func GetInternalIp() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}

GetIps

获取ipv4地址列表

函数签名:

go
func GetIps() []string
func GetIps() []string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}

GetMacAddrs

获取mac地址列

函数签名:

go
func GetMacAddrs() []string {
func GetMacAddrs() []string {

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}

GetPublicIpInfo

获取公网ip信息

函数签名:

go
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  \`json:"status"\`
+    Country     string  \`json:"country"\`
+    CountryCode string  \`json:"countryCode"\`
+    Region      string  \`json:"region"\`
+    RegionName  string  \`json:"regionName"\`
+    City        string  \`json:"city"\`
+    Lat         float64 \`json:"lat"\`
+    Lon         float64 \`json:"lon"\`
+    Isp         string  \`json:"isp"\`
+    Org         string  \`json:"org"\`
+    As          string  \`json:"as"\`
+    Ip          string  \`json:"query"\`
+}
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  \`json:"status"\`
+    Country     string  \`json:"country"\`
+    CountryCode string  \`json:"countryCode"\`
+    Region      string  \`json:"region"\`
+    RegionName  string  \`json:"regionName"\`
+    City        string  \`json:"city"\`
+    Lat         float64 \`json:"lat"\`
+    Lon         float64 \`json:"lon"\`
+    Isp         string  \`json:"isp"\`
+    Org         string  \`json:"org"\`
+    As          string  \`json:"as"\`
+    Ip          string  \`json:"query"\`
+}

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}

GetRequestPublicIp

获取http请求ip

函数签名:

go
func GetRequestPublicIp(req *http.Request) string
func GetRequestPublicIp(req *http.Request) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}

IsPublicIP

判断ip是否是公共ip

函数签名:

go
func IsPublicIP(IP net.IP) bool
func IsPublicIP(IP net.IP) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

IsInternalIP

判断ip是否是局域网ip.

函数签名:

go
func IsInternalIP(IP net.IP) bool
func IsInternalIP(IP net.IP) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HttpRequest

HttpRequest用于抽象HTTP请求实体的结构

函数签名:

go
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}

HttpClient

HttpClient是用于发送HTTP请求的结构体。它可以用一些配置参数或无配置实例化.

函数签名:

go
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}

SendRequest

HttpClient发送http请求

函数签名:

go
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

DecodeResponse

解析http响应体到目标结构体

函数签名:

go
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

StructToUrlValues

将结构体转为url values, 仅转化结构体导出字段并且包含\`json\` tag

函数签名:

go
func StructToUrlValues(targetStruct any) url.Values
func StructToUrlValues(targetStruct any) url.Values

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Name   string \`json:"name,omitempty"\`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Name   string \`json:"name,omitempty"\`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}

HttpGet

发送http get请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpGet(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpGet(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPost

发送http post请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPost(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPost(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPut

发送http put请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPut(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPut(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpDelete

发送http delete请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpDelete(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpDelete(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPatch

发送http patch请求。(已废弃:使用SendRequest)

函数签名:

go
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPatch(url string, params ...any) (*http.Response, error)
// params[0] http请求header,类型必须是http.Header或者map[string]string
+// params[1] http查询字符串,类型必须是url.Values或者map[string]string
+// params[2] post请求体,类型必须是[]byte
+// params[3] http client,类型必须是http.Client
+func HttpPatch(url string, params ...any) (*http.Response, error)

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

ParseHttpResponse

将http请求响应解码成特定struct值

函数签名:

go
func ParseHttpResponse(resp *http.Response, obj any) error
func ParseHttpResponse(resp *http.Response, obj any) error

示例:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    \`json:"id"\`
+        UserId    int    \`json:"userId"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    \`json:"id"\`
+        UserId    int    \`json:"userId"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}

DownloadFile

从指定的server地址下载文件。

函数签名:

go
func DownloadFile(filepath string, url string) error
func DownloadFile(filepath string, url string) error

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}

UploadFile

将文件上传指定的server地址。

函数签名:

go
func UploadFile(filepath string, server string) (bool, error)
func UploadFile(filepath string, server string) (bool, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}

IsPingConnected

检查能否ping通主机。

函数签名:

go
func IsPingConnected(host string) bool
func IsPingConnected(host string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsTelnetConnected

检查能否telnet到主机。

函数签名:

go
func IsTelnetConnected(host string, port string) bool
func IsTelnetConnected(host string, port string) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
`,145),g=[t,c,r,y,F,i,u,E,A,d,q];function B(h,m,f,D,C,b){return p(),o("div",null,g)}const P=l(e,[["render",B]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.lean.js b/docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.lean.js new file mode 100644 index 0000000..5da6d4c --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_netutil.md.d9f6ee6d.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Netutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/netutil.md","filePath":"api/packages/netutil.md"}'),e={name:"api/packages/netutil.md"},t=s("h1",{id:"Netutil",tabindex:"-1"},[a("Netutil "),s("a",{class:"header-anchor",href:"#Netutil","aria-label":'Permalink to "Netutil"'},"​")],-1),c=s("p",null,"netutil 网络包支持获取 ip 地址,发送 http 请求。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/net.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/net.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/http.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/http.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),q=n("",145),g=[t,c,r,y,F,i,u,E,A,d,q];function B(h,m,f,D,C,b){return p(),o("div",null,g)}const P=l(e,[["render",B]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.js b/docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.js new file mode 100644 index 0000000..e9e0161 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.js @@ -0,0 +1,233 @@ +import{_ as p,o as l,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Pointer","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/pointer.md","filePath":"api/packages/pointer.md"}'),e={name:"api/packages/pointer.md"},t=s("h1",{id:"Pointer",tabindex:"-1"},[a("Pointer "),s("a",{class:"header-anchor",href:"#Pointer","aria-label":'Permalink to "Pointer"'},"​")],-1),c=s("p",null,"pointer 包支持一些指针类型的操作。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

目录

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

文档

Of

返回传入参数的指针值。

函数签名:

go
func Of[T any](v T) *T
func Of[T any](v T) *T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}

Unwrap

返回传入指针指向的值。

函数签名:

go
func Unwrap[T any](p *T) T
func Unwrap[T any](p *T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}

ExtractPointer

返回传入interface的底层值。

函数签名:

go
func ExtractPointer(value any) any
func ExtractPointer(value any) any

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}

UnwarpOr

返回指针的值,如果指针为零值,则返回fallback。

函数签名:

go
UnwarpOr[T any](p *T, fallback T) T
UnwarpOr[T any](p *T, fallback T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}

UnwarpOrDefault

返回指针的值,如果指针为零值,则返回相应零值。

函数签名:

go
UnwarpOrDefault[T any](p *T) T
UnwarpOrDefault[T any](p *T) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}
`,31),h=[t,c,r,y,F,i,A,u,d,E,g];function f(m,B,b,v,D,C){return l(),o("div",null,h)}const _=p(e,[["render",f]]);export{k as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.lean.js b/docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.lean.js new file mode 100644 index 0000000..f0cbbfb --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_pointer.md.3465a655.lean.js @@ -0,0 +1 @@ +import{_ as p,o as l,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Pointer","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/pointer.md","filePath":"api/packages/pointer.md"}'),e={name:"api/packages/pointer.md"},t=s("h1",{id:"Pointer",tabindex:"-1"},[a("Pointer "),s("a",{class:"header-anchor",href:"#Pointer","aria-label":'Permalink to "Pointer"'},"​")],-1),c=s("p",null,"pointer 包支持一些指针类型的操作。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",31),h=[t,c,r,y,F,i,A,u,d,E,g];function f(m,B,b,v,D,C){return l(),o("div",null,h)}const _=p(e,[["render",f]]);export{k as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.js b/docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.js new file mode 100644 index 0000000..1224721 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.js @@ -0,0 +1,191 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Random","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/random.md","filePath":"api/packages/random.md"}'),e={name:"api/packages/random.md"},t=s("h1",{id:"Random",tabindex:"-1"},[n("Random "),s("a",{class:"header-anchor",href:"#Random","aria-label":'Permalink to "Random"'},"​")],-1),c=s("p",null,"random 随机数生成器包,可以生成随机[]bytes, int, string。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/random/random.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/random/random.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/random"
+)
import (
+    "github.com/duke-git/lancet/v2/random"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=a('

目录

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

文档

RandBytes

生成随机字节切片

函数签名:

go
func RandBytes(length int) []byte
func RandBytes(length int) []byte

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}

RandInt

生成随机int, 范围[min, max)

函数签名:

go
func RandInt(min, max int) int
func RandInt(min, max int) int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}

RandString

生成给定长度的随机字符串,只包含字母(a-zA-Z)

函数签名:

go
func RandString(length int) string
func RandString(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}

RandUpper

生成给定长度的随机大写字母字符串

函数签名:

go
func RandUpper(length int) string
func RandUpper(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}

RandLower

生成给定长度的随机小写字母字符串

函数签名:

go
func RandLower(length int) string
func RandLower(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}

RandNumeral

生成给定长度的随机数字字符串

函数签名:

go
func RandNumeral(length int) string
func RandNumeral(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}

RandNumeralOrLetter

生成给定长度的随机字符串(数字+字母)

函数签名:

go
func RandNumeralOrLetter(length int) string
func RandNumeralOrLetter(length int) string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}

UUIdV4

生成UUID v4字符串

函数签名:

go
func UUIdV4() (string, error)
func UUIdV4() (string, error)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}

RandUniqueIntSlice

生成一个不重复的长度为n的随机int切片。

函数签名:

go
func RandUniqueIntSlice(n, min, max int) []int
func RandUniqueIntSlice(n, min, max int) []int

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}
`,55),m=[t,c,r,y,i,F,d,u,g,E,A];function h(v,f,b,k,q,B){return p(),o("div",null,m)}const _=l(e,[["render",h]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.lean.js b/docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.lean.js new file mode 100644 index 0000000..da2bb76 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_random.md.c5785d61.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Random","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/random.md","filePath":"api/packages/random.md"}'),e={name:"api/packages/random.md"},t=s("h1",{id:"Random",tabindex:"-1"},[n("Random "),s("a",{class:"header-anchor",href:"#Random","aria-label":'Permalink to "Random"'},"​")],-1),c=s("p",null,"random 随机数生成器包,可以生成随机[]bytes, int, string。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/random/random.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/random/random.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=a("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",55),m=[t,c,r,y,i,F,d,u,g,E,A];function h(v,f,b,k,q,B){return p(),o("div",null,m)}const _=l(e,[["render",h]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.js b/docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.js new file mode 100644 index 0000000..6062fb8 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.js @@ -0,0 +1,301 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Retry","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/retry.md","filePath":"api/packages/retry.md"}'),e={name:"api/packages/retry.md"},t=s("h1",{id:"Retry",tabindex:"-1"},[a("Retry "),s("a",{class:"header-anchor",href:"#Retry","aria-label":'Permalink to "Retry"'},"​")],-1),r=s("p",null,"retry 重试执行函数直到函数运行成功或被 context cancel。",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/retry/retry.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/retry/retry.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/retry"
+)
import (
+    "github.com/duke-git/lancet/v2/retry"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

文档

Context

设置重试context参数

函数签名:

go
func Context(ctx context.Context)
func Context(ctx context.Context)

示例:运行

go
import (
+    "context"
+    "errors"
+    "fmt"
+    "lancet-demo/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}
import (
+    "context"
+    "errors"
+    "fmt"
+    "lancet-demo/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}

RetryFunc

被重试执行的函数

函数签名:

go
type RetryFunc func() error
type RetryFunc func() error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

RetryTimes

设置重试次数,默认5

函数签名:

go
func RetryTimes(n uint)
func RetryTimes(n uint)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}

RetryDuration

设置重试间隔时间,默认3秒

函数签名:

go
func RetryDuration(d time.Duration)
func RetryDuration(d time.Duration)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

Retry

重试执行函数retryFunc,直到函数运行成功,或被context停止

函数签名:

go
func Retry(retryFunc RetryFunc, opts ...Option) error
func Retry(retryFunc RetryFunc, opts ...Option) error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
`,31),g=[t,r,c,y,F,i,u,A,E,d,m];function h(B,b,f,q,C,D){return p(),o("div",null,g)}const _=l(e,[["render",h]]);export{k as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.lean.js b/docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.lean.js new file mode 100644 index 0000000..700cde5 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_retry.md.746cf8ed.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Retry","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/retry.md","filePath":"api/packages/retry.md"}'),e={name:"api/packages/retry.md"},t=s("h1",{id:"Retry",tabindex:"-1"},[a("Retry "),s("a",{class:"header-anchor",href:"#Retry","aria-label":'Permalink to "Retry"'},"​")],-1),r=s("p",null,"retry 重试执行函数直到函数运行成功或被 context cancel。",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/retry/retry.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/retry/retry.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",31),g=[t,r,c,y,F,i,u,A,E,d,m];function h(B,b,f,q,C,D){return p(),o("div",null,g)}const _=l(e,[["render",h]]);export{k as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.js b/docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.js new file mode 100644 index 0000000..b6a1429 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.js @@ -0,0 +1,2509 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Slice","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/slice.md","filePath":"api/packages/slice.md"}'),e={name:"api/packages/slice.md"},t=s("h1",{id:"Slice",tabindex:"-1"},[a("Slice "),s("a",{class:"header-anchor",href:"#Slice","aria-label":'Permalink to "Slice"'},"​")],-1),c=s("p",null,"slice 包包含操作切片的方法集合。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/slice/slice.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/slice/slice.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/slice"
+)
import (
+    "github.com/duke-git/lancet/v2/slice"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n(`

文档

AppendIfAbsent

当前切片中不包含值时,将该值追加到切片中

函数签名:

go
func AppendIfAbsent[T comparable](slice []T, item T) []T
func AppendIfAbsent[T comparable](slice []T, item T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}

Contain

判断slice是否包含value

函数签名:

go
func Contain[T comparable](slice []T, target T) bool
func Contain[T comparable](slice []T, target T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainBy

根据predicate函数判断切片是否包含某个值。

函数签名:

go
func ContainBy[T any](slice []T, predicate func(item T) bool) bool
func ContainBy[T any](slice []T, predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}

ContainSubSlice

判断slice是否包含subslice

函数签名:

go
func ContainSubSlice[T comparable](slice, subSlice []T) bool
func ContainSubSlice[T comparable](slice, subSlice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Chunk

按照size参数均分slice

函数签名:

go
func Chunk[T any](slice []T, size int) [][]T
func Chunk[T any](slice []T, size int) [][]T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}

Compact

去除slice中的假值(false values are false, nil, 0, "")

函数签名:

go
func Compact[T comparable](slice []T) []T
func Compact[T comparable](slice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}

Concat

合并多个slices到slice中

函数签名:

go
func Concat[T any](slice []T, slices ...[]T) []T
func Concat[T any](slice []T, slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}

Count

返回切片中指定元素的个数

函数签名:

go
func Count[T comparable](slice []T, item T) int
func Count[T comparable](slice []T, item T) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}

CountBy

遍历切片,对每个元素执行函数predicate. 返回符合函数返回值为true的元素的个数.

函数签名:

go
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}

Difference

创建一个切片,其元素不包含在另一个给定切片中

函数签名:

go
func Difference[T comparable](slice, comparedSlice []T) []T
func Difference[T comparable](slice, comparedSlice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

DifferenceBy

将两个slice中的每个元素调用iteratee函数,并比较它们的返回值,如果不相等返回在slice中对应的值

函数签名:

go
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}

DifferenceWith

接受比较器函数,该比较器被调用以将切片的元素与值进行比较。 结果值的顺序和引用由第一个切片确定

函数签名:

go
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}

DeleteAt

删除切片中指定开始索引到结束索引的元素

函数签名:

go
func DeleteAt[T any](slice []T, start int, end ...int)
func DeleteAt[T any](slice []T, start int, end ...int)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+
+}

Drop

从切片的头部删除n个元素。

函数签名:

go
func Drop[T any](slice []T, n int) []T
func Drop[T any](slice []T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}

DropRight

从切片的尾部删除n个元素。

函数签名:

go
func DropRight[T any](slice []T, n int) []T
func DropRight[T any](slice []T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}

DropWhile

从切片的头部删除n个元素,这个n个元素满足predicate函数返回true。

函数签名:

go
func DropWhile[T any](slice []T, predicate func(item T) bool) []T
func DropWhile[T any](slice []T, predicate func(item T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}

DropRightWhile

从切片的尾部删除n个元素,这个n个元素满足predicate函数返回true。

函数签名:

go
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}

Every

如果切片中的所有值都通过谓词函数,则返回true。 函数签名应该是func(index int, value any) bool

函数签名:

go
func Every[T any](slice []T, predicate func(index int, item T) bool) bool
func Every[T any](slice []T, predicate func(index int, item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}

Equal

检查两个切片是否相等,相等条件:切片长度相同,元素顺序和值都相同

函数签名:

go
func Equal[T comparable](slice1, slice2 []T) bool
func Equal[T comparable](slice1, slice2 []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

EqualWith

检查两个切片是否相等,相等条件:对两个切片的元素调用比较函数comparator,返回true

函数签名:

go
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

Filter

返回切片中通过predicate函数真值测试的所有元素

函数签名:

go
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}

Find (废弃:使用 FindBy)

遍历slice的元素,返回第一个通过predicate函数真值测试的元素

函数签名:

go
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindBy

遍历slice的元素,返回第一个通过predicate函数真值测试的元素

函数签名:

go
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindLast(废弃:使用 FindLastBy)

遍历slice的元素,返回最后一个通过predicate函数真值测试的元素。

函数签名:

go
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

FindLastBy

从遍历slice的元素,返回最后一个通过predicate函数真值测试的元素。

函数签名:

go
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Flatten

将切片压平一层

函数签名:

go
func Flatten(slice any) any
func Flatten(slice any) any

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}

FlattenDeep

flattens slice recursive.

函数签名:

go
func FlattenDeep(slice any) any
func FlattenDeep(slice any) any

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}

ForEach

遍历切片的元素并为每个元素调用iteratee函数

函数签名:

go
func ForEach[T any](slice []T, iteratee func(index int, item T))
func ForEach[T any](slice []T, iteratee func(index int, item T))

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

ForEachWithBreak

遍历切片的元素并为每个元素调用iteratee函数,当iteratee函数返回false时,终止遍历。

函数签名:

go
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}

GroupBy

迭代切片的元素,每个元素将按条件分组,返回两个切片

函数签名:

go
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}

GroupWith

创建一个map,key是iteratee遍历slice中的每个元素返回的结果。 分组值的顺序是由他们出现在slice中的顺序确定的。每个键对应的值负责生成key的元素组成的数组。iteratee调用1个参数: (value)

函数签名:

go
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}

IntSlice (已弃用: 使用 go1.18+泛型代替)

将接口切片转换为int切片

函数签名:

go
func IntSlice(slice any) []int
func IntSlice(slice any) []int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

InterfaceSlice(已弃用: 使用 go1.18+泛型代替)

将值转换为接口切片

函数签名:

go
func InterfaceSlice(slice any) []any
func InterfaceSlice(slice any) []any

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

Intersection

多个切片的交集

函数签名:

go
func Intersection[T comparable](slices ...[]T) []T
func Intersection[T comparable](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}

InsertAt

将元素插入到索引处的切片中

函数签名:

go
func InsertAt[T any](slice []T, index int, value any) []T
func InsertAt[T any](slice []T, index int, value any) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}

IndexOf

返回在切片中找到值的第一个匹配项的索引,如果找不到值,则返回-1

函数签名:

go
func IndexOf[T comparable](slice []T, item T) int
func IndexOf[T comparable](slice []T, item T) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LastIndexOf

返回在切片中找到最后一个值的索引,如果找不到该值,则返回-1

函数签名:

go
func LastIndexOf[T comparable](slice []T, item T) int
func LastIndexOf[T comparable](slice []T, item T) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}

Map

对slice中的每个元素执行map函数以创建一个新切片

函数签名:

go
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

FilterMap

返回一个将filter和map操作应用于给定切片的切片。 iteratee回调函数应该返回两个值:1,结果值。2,结果值是否应该被包含在返回的切片中。

函数签名:

go
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}

FlatMap

将切片转换为其它类型切片。

函数签名:

go
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}

Merge

合并多个切片(不会消除重复元素).

函数签名:

go
func Merge[T any](slices ...[]T) []T
func Merge[T any](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}

Reverse

反转切片中的元素顺序

函数签名:

go
func Reverse[T any](slice []T)
func Reverse[T any](slice []T)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}

Reduce

将切片中的元素依次运行iteratee函数,返回运行结果(废弃:建议使用ReduceBy)

函数签名:

go
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

ReduceBy

对切片元素执行reduce操作。

函数签名:

go
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}

ReduceRight

类似ReduceBy操作,迭代切片元素顺序从右至左。

函数签名:

go
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}

Replace

返回切片的副本,其中前n个不重叠的old替换为new

函数签名:

go
func Replace[T comparable](slice []T, old T, new T, n int) []T
func Replace[T comparable](slice []T, old T, new T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}

ReplaceAll

返回切片的副本,将其中old全部替换为new

函数签名:

go
func ReplaceAll[T comparable](slice []T, old T, new T) []T
func ReplaceAll[T comparable](slice []T, old T, new T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}

Repeat

创建一个切片,包含n个传入的item

函数签名:

go
func Repeat[T any](item T, n int) []T
func Repeat[T any](item T, n int) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}

Shuffle

随机打乱切片中的元素顺序

函数签名:

go
func Shuffle[T any](slice []T) []T
func Shuffle[T any](slice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}

IsAscending

检查切片元素是否按升序排列。

函数签名:

go
func IsAscending[T constraints.Ordered](slice []T) bool
func IsAscending[T constraints.Ordered](slice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsDescending

检查切片元素是否按降序排列。

函数签名:

go
func IsDescending[T constraints.Ordered](slice []T) bool
func IsDescending[T constraints.Ordered](slice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsSorted

检查切片元素是否是有序的(升序或降序)。

函数签名:

go
func IsSorted[T constraints.Ordered](slice []T) bool
func IsSorted[T constraints.Ordered](slice []T) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsSortedByKey

通过iteratee函数,检查切片元素是否是有序的。

函数签名:

go
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

Sort

对任何有序类型(数字或字符串)的切片进行排序,使用快速排序算法。 默认排序顺序为升序 (asc),如果需要降序,请将参数 \`sortOrder\` 设置为 \`desc\`。 Ordered类型:数字(所有整数浮点数)或字符串。

函数签名:

go
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}

SortBy

按照less函数确定的升序规则对切片进行排序。排序不保证稳定性

函数签名:

go
func SortBy[T any](slice []T, less func(a, b T) bool)
func SortBy[T any](slice []T, less func(a, b T) bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}

SortByField (已弃用: 请使用 Sort 或 SortBy 代替该方法)

按字段对结构切片进行排序。slice元素应为struct,字段类型应为int、uint、string或bool。 默认排序类型是升序(asc),如果是降序,设置 sortType 为 desc

函数签名:

go
func SortByField(slice any, field string, sortType ...string) error
func SortByField(slice any, field string, sortType ...string) error

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}

Some

如果列表中的任何值通过谓词函数,则返回true

函数签名:

go
func Some[T any](slice []T, predicate func(index int, item T) bool) bool
func Some[T any](slice []T, predicate func(index int, item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

StringSlice(已弃用: 使用 go1.18+泛型代替)

将接口切片转换为字符串切片

函数签名:

go
func StringSlice(slice any) []string
func StringSlice(slice any) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

SymmetricDifference

返回一个切片,其中的元素存在于参数切片中,但不同时存储在于参数切片中(交集取反)

函数签名:

go
func SymmetricDifference[T comparable](slices ...[]T) []T
func SymmetricDifference[T comparable](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

ToSlice

将可变参数转为切片

函数签名:

go
func ToSlice[T any](items ...T) []T
func ToSlice[T any](items ...T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

ToSlicePointer

将可变参数转为指针切片

函数签名:

go
func ToSlicePointer[T any](items ...T) []*T
func ToSlicePointer[T any](items ...T) []*T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}

Unique

删除切片中的重复元素

函数签名:

go
func Unique[T comparable](slice []T) []T
func Unique[T comparable](slice []T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}

UniqueBy

对切片的每个元素调用iteratee函数,然后删除重复元素

函数签名:

go
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}

Union

合并多个切片

函数签名:

go
func Union[T comparable](slices ...[]T) []T
func Union[T comparable](slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}

UnionBy

对切片的每个元素调用函数后,合并多个切片

函数签名:

go
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}

UpdateAt

更新索引处的切片元素。 如果index < 0或 index <= len(slice),将返回错误

函数签名:

go
func UpdateAt[T any](slice []T, index int, value T) []T
func UpdateAt[T any](slice []T, index int, value T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}

Without

创建一个不包括所有给定值的切片

函数签名:

go
func Without[T comparable](slice []T, items ...T) []T
func Without[T comparable](slice []T, items ...T) []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

KeyBy

将切片每个元素调用函数后转为map。

函数签名:

go
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}

Join

用指定的分隔符链接切片元素。

函数签名:

go
func Join[T any](s []T, separator string) string
func Join[T any](s []T, separator string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}
`,415),g=[t,c,r,y,F,i,E,A,u,d,B];function f(q,h,m,b,v,D){return p(),o("div",null,g)}const T=l(e,[["render",f]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.lean.js b/docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.lean.js new file mode 100644 index 0000000..af25c35 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_slice.md.f48c775b.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Slice","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/slice.md","filePath":"api/packages/slice.md"}'),e={name:"api/packages/slice.md"},t=s("h1",{id:"Slice",tabindex:"-1"},[a("Slice "),s("a",{class:"header-anchor",href:"#Slice","aria-label":'Permalink to "Slice"'},"​")],-1),c=s("p",null,"slice 包包含操作切片的方法集合。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/slice/slice.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/slice/slice.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n("",415),g=[t,c,r,y,F,i,E,A,u,d,B];function f(q,h,m,b,v,D){return p(),o("div",null,g)}const T=l(e,[["render",f]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.js b/docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.js new file mode 100644 index 0000000..972f8c2 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.js @@ -0,0 +1,945 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Stream","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/stream.md","filePath":"api/packages/stream.md"}'),e={name:"api/packages/stream.md"},t=s("h1",{id:"Stream",tabindex:"-1"},[a("Stream "),s("a",{class:"header-anchor",href:"#Stream","aria-label":'Permalink to "Stream"'},"​")],-1),c=s("p",null,"Stream 流,该包仅验证简单 stream 实现,功能有限。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/stream/stream.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/stream/stream.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/stream"
+)
import (
+    "github.com/duke-git/lancet/v2/stream"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

文档

Of

创建元素为指定值的stream。

函数签名:

go
func Of[T any](elems ...T) stream[T]
func Of[T any](elems ...T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromSlice

从切片创建stream。

函数签名:

go
func FromSlice[T any](source []T) stream[T]
func FromSlice[T any](source []T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromChannel

从通道创建stream。

函数签名:

go
func FromChannel[T any](source <-chan T) stream[T]
func FromChannel[T any](source <-chan T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromRange

指定一个范围创建stream, 范围两端点值都包括在内。

函数签名:

go
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Generate

创建一个stream,其中每个元素都由提供的生成器函数生成

函数签名:

go
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

Concat

创建一个延迟连接stream,其元素是第一个stream的所有元素,后跟第二个stream的全部元素。

函数签名:

go
func Concat[T any](a, b stream[T]) stream[T]
func Concat[T any](a, b stream[T]) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

Distinct

创建并返回一个stream,用于删除重复的项。 支持链式操作

函数签名:

go
func (s stream[T]) Distinct() stream[T]
func (s stream[T]) Distinct() stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}

Filter

返回一个通过判定函数的stream 支持链式操作

函数签名:

go
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}

Map

返回一个stream,该stream由将给定函数应用于源stream元素的元素组成。支持链式操作

函数签名:

go
func (s stream[T]) Map(mapper func(item T) T) stream[T]
func (s stream[T]) Map(mapper func(item T) T) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}

Peek

返回一个由源stream的元素组成的stream,并在从生成的stream中消耗元素时对每个元素执行所提供的操作。 支持链式操作

函数签名:

go
func (s stream[T]) Peek(consumer func(item T)) stream[T]
func (s stream[T]) Peek(consumer func(item T)) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}

Skip

在丢弃stream的前n个元素后,返回由源stream的其余元素组成的stream。如果此stream包含的元素少于n个,则将返回一个空stream。支持链式操作

函数签名:

go
func (s stream[T]) Skip(n int) stream[T]
func (s stream[T]) Skip(n int) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}

Limit

返回由源stream的元素组成的stream,该stream被截断为长度不超过maxSize。支持链式操作

函数签名:

go
func (s stream[T]) Limit(maxSize int) stream[T]
func (s stream[T]) Limit(maxSize int) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}

Reverse

返回元素与源stream的顺序相反的stream。支持链式操作

函数签名:

go
func (s stream[T]) Reverse() stream[T]
func (s stream[T]) Reverse() stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}

Range

返回一个stream,该stream的元素在从源stream的开始(包含)到结束(排除)的范围内。支持链式操作

函数签名:

go
func (s stream[T]) Range(start, end int) stream[T]
func (s stream[T]) Range(start, end int) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}

Sorted

返回一个stream,该stream由源stream的元素组成,并根据提供的less函数进行排序。支持链式操作

函数签名:

go
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}

ForEach

对stream的每个元素执行一个操作。

函数签名:

go
func (s stream[T]) ForEach(action func(item T))
func (s stream[T]) ForEach(action func(item T))

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

Reduce

使用关联累加函数对stream的元素执行reduce操作,并reduce操作结果(如果有)。

函数签名:

go
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

FindFirst

返回此stream的第一个元素和true,如果stream为空,则返回零值和false。

函数签名:

go
func (s stream[T]) FindFirst() (T, bool)
func (s stream[T]) FindFirst() (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

FindLast

返回此stream最后一个元素和true,如果stream为空,则返回零值和false。

函数签名:

go
func (s stream[T]) FindLast() (T, bool)
func (s stream[T]) FindLast() (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

Max

根据提供的less函数返回stream的最大元素。less 函数: a > b

函数签名:

go
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Min

根据提供的less函数返回stream的最小元素。less函数: a < b

函数签名:

go
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

AllMatch

判断stream的所有元素是否全部匹配指定判定函数。

函数签名:

go
func (s stream[T]) AllMatch(predicate func(item T) bool) bool
func (s stream[T]) AllMatch(predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

AnyMatch

判断stream是否包含匹配指定判定函数的元素。

函数签名:

go
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NoneMatch

判断stream的元素是否全部不匹配指定的判定函数。

函数签名:

go
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Count

返回stream中元素的数量。

函数签名:

go
func (s stream[T]) Count() int
func (s stream[T]) Count() int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}

ToSlice

返回stream中的元素切片。

函数签名:

go
func (s stream[T]) ToSlice() []T
func (s stream[T]) ToSlice() []T

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
`,157),g=[t,c,r,y,F,i,A,E,u,d,m];function h(f,B,b,v,C,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{D as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.lean.js b/docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.lean.js new file mode 100644 index 0000000..775e26f --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_stream.md.f8a1897d.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Stream","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/stream.md","filePath":"api/packages/stream.md"}'),e={name:"api/packages/stream.md"},t=s("h1",{id:"Stream",tabindex:"-1"},[a("Stream "),s("a",{class:"header-anchor",href:"#Stream","aria-label":'Permalink to "Stream"'},"​")],-1),c=s("p",null,"Stream 流,该包仅验证简单 stream 实现,功能有限。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/stream/stream.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/stream/stream.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",157),g=[t,c,r,y,F,i,A,E,u,d,m];function h(f,B,b,v,C,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{D as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.js b/docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.js new file mode 100644 index 0000000..7ef11c1 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.js @@ -0,0 +1,559 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Structs","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/struct.md","filePath":"api/packages/struct.md"}'),e={name:"api/packages/struct.md"},t=s("h1",{id:"Structs",tabindex:"-1"},[n("Structs "),s("a",{class:"header-anchor",href:"#Structs","aria-label":'Permalink to "Structs"'},"​")],-1),c=s("p",null,[n("structs 包封装了一个抽象的"),s("code",null,"Struct"),n("结构体,提供了操作"),s("code",null,"struct"),n("的相关函数")],-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/struct.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/struct.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/field.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/field.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/structs"
+)
import (
+    "github.com/duke-git/lancet/v2/structs"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a('

目录:

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=a(`

API 文档:

New

\`Struct\`结构体的构造函数

函数签名:

go
func New(value any, tagName ...string) *Struct
func New(value any, tagName ...string) *Struct

示例:

go
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}

ToMap

将一个合法的struct对象转换为map[string]any

函数签名:

go
func (s *Struct) ToMap() (map[string]any, error)
func (s *Struct) ToMap() (map[string]any, error)

除此之外,提供一个便捷的静态方法 ToMap

go
func ToMap(v any) (map[string]any, error)
func ToMap(v any) (map[string]any, error)

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // 如果不需要Struct更多的方法,可以直接使用ToMap
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // 如果不需要Struct更多的方法,可以直接使用ToMap
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}

Fields

获取一个struct对象的属性列表

函数签名:

go
func (s *Struct) Fields() []*Field
func (s *Struct) Fields() []*Field

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}

Field

根据属性名获取一个struct对象的属性

函数签名:

go
func (s *Struct) Field(name string) *Field
func (s *Struct) Field(name string) *Field

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}

IsStruct

判断是否为一个合法的struct对象

函数签名:

go
func (s *Struct) IsStruct() bool
func (s *Struct) IsStruct() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}

Tag

获取\`Field\`的\`Tag\`,默认的tag key是json

函数签名:

go
func (f *Field) Tag() *Tag
func (f *Field) Tag() *Tag

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+    
+    // Output:
+    // name
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+    
+    // Output:
+    // name
+}

Value

获取\`Field\`属性的值

函数签名:

go
func (f *Field) Value() any
func (f *Field) Value() any

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    
+    fmt.Println(n.Value())
+    
+    // Output: 
+    // 111
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    
+    fmt.Println(n.Value())
+    
+    // Output: 
+    // 111
+}

IsEmbedded

判断属性是否为嵌入

函数签名:

go
func (f *Field) IsEmbedded() bool
func (f *Field) IsEmbedded() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+    
+    // Output: 
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+    
+    // Output: 
+    // true
+    // false
+}

IsExported

判断属性是否导出

函数签名:

go
func (f *Field) IsExported() bool
func (f *Field) IsExported() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+    
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+    
+    // Output: 
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+    
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+    
+    // Output: 
+    // true
+    // false
+}

IsZero

判断属性是否为零值

函数签名:

go
func (f *Field) IsZero() bool
func (f *Field) IsZero() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+    
+    // Output: 
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+    
+    // Output: 
+    // true
+    // false
+}

Name

获取属性名

函数签名:

go
func (f *Field) Name() string
func (f *Field) Name() string

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+    
+    // Output: 
+    // Name
+    // Age
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+    
+    // Output: 
+    // Name
+    // Age
+}

Kind

获取属性Kind

函数签名:

go
func (f *Field) Kind() reflect.Kind
func (f *Field) Kind() reflect.Kind

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+    
+    // Output: 
+    // string
+    // int
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+    
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+    
+    // Output: 
+    // string
+    // int
+}

IsSlice

判断属性是否是切片

函数签名:

go
func (f *Field) IsSlice() bool
func (f *Field) IsSlice() bool

示例:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+    
+    fmt.Println(a.IsSlice())
+    
+    // Output: 
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+    
+    fmt.Println(a.IsSlice())
+    
+    // Output: 
+    // true
+}
`,81),m=[t,c,r,y,F,i,A,u,E,d,g];function B(h,q,f,v,C,b){return p(),o("div",null,m)}const N=l(e,[["render",B]]);export{k as __pageData,N as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.lean.js b/docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.lean.js new file mode 100644 index 0000000..9efb178 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_struct.md.bdd9b8b9.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Structs","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/struct.md","filePath":"api/packages/struct.md"}'),e={name:"api/packages/struct.md"},t=s("h1",{id:"Structs",tabindex:"-1"},[n("Structs "),s("a",{class:"header-anchor",href:"#Structs","aria-label":'Permalink to "Structs"'},"​")],-1),c=s("p",null,[n("structs 包封装了一个抽象的"),s("code",null,"Struct"),n("结构体,提供了操作"),s("code",null,"struct"),n("的相关函数")],-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[n("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/struct.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/struct.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/field.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/field.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=a("",81),m=[t,c,r,y,F,i,A,u,E,d,g];function B(h,q,f,v,C,b){return p(),o("div",null,m)}const N=l(e,[["render",B]]);export{k as __pageData,N as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.js b/docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.js new file mode 100644 index 0000000..f24b2c4 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.js @@ -0,0 +1,1539 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Strutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/strutil.md","filePath":"api/packages/strutil.md"}'),t={name:"api/packages/strutil.md"},e=s("h1",{id:"Strutil",tabindex:"-1"},[a("Strutil "),s("a",{class:"header-anchor",href:"#Strutil","aria-label":'Permalink to "Strutil"'},"​")],-1),c=s("p",null,"strutil 包含处理字符串的相关函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/strutil/string.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/strutil/string.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

目录

',2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

文档

After

返回源字符串中特定字符串首次出现时的位置之后的子字符串。

函数签名:

go
func After(s, char string) string
func After(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}

AfterLast

返回源字符串中指定字符串最后一次出现时的位置之后的子字符串。

函数签名:

go
func AfterLast(s, char string) string
func AfterLast(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}

Before

返回源字符串中指定字符串第一次出现时的位置之前的子字符串。

函数签名:

go
func Before(s, char string) string
func Before(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}

BeforeLast

返回源字符串中指定字符串最后一次出现时的位置之前的子字符串。

函数签名:

go
func BeforeLast(s, char string) string
func BeforeLast(s, char string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}

CamelCase

将字符串转换为驼峰式字符串, 非字母和数字会被忽略。

函数签名:

go
func CamelCase(s string) string
func CamelCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}

KebabCase

将字符串转换为kebab-case, 非字母和数字会被忽略。

函数签名:

go
func KebabCase(s string) string
func KebabCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}

UpperKebabCase

将字符串转换为大写KEBAB-CASE, 非字母和数字会被忽略。

函数签名:

go
func UpperKebabCase(s string) string
func UpperKebabCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}

Capitalize

将字符串的第一个字符转换为大写。

函数签名:

go
func Capitalize(s string) string
func Capitalize(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}

IsString

判断传入参数的数据类型是否为字符串。

函数签名:

go
func IsString(v any) bool
func IsString(v any) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LowerFirst

将字符串的第一个字符转换为小写。

函数签名:

go
func LowerFirst(s string) string
func LowerFirst(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}

UpperFirst

将字符串的第一个字符转换为大写形式。

函数签名:

go
func UpperFirst(s string) string
func UpperFirst(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}

Pad

如果字符串长度短于size,则在左右两侧填充字符串。

函数签名:

go
func Pad(source string, size int, padStr string) string
func Pad(source string, size int, padStr string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}

PadEnd

如果字符串长度短于size,则在右侧填充字符串。

函数签名:

go
func PadEnd(source string, size int, padStr string) string
func PadEnd(source string, size int, padStr string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}

PadStart

如果字符串长度短于size,则在左侧填充字符串。

函数签名:

go
func PadStart(source string, size int, padStr string) string
func PadStart(source string, size int, padStr string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}

Reverse

返回字符顺序与给定字符串相反的字符串。

函数签名:

go
func Reverse(s string) string
func Reverse(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}

SnakeCase

将字符串转换为snake_case形式, 非字母和数字会被忽略。

函数签名:

go
func SnakeCase(s string) string
func SnakeCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}

UpperSnakeCase

将字符串转换为大写SNAKE_CASE形式, 非字母和数字会被忽略。

函数签名:

go
func UpperSnakeCase(s string) string
func UpperSnakeCase(s string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}

SplitEx

分割字符串为切片,removeEmptyString参数指定是否去除空字符串。

函数签名:

go
func SplitEx(s, sep string, removeEmptyString bool) []string
func SplitEx(s, sep string, removeEmptyString bool) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}

Substring

根据指定的位置和长度截取字符串。

函数签名:

go
func Substring(s string, offset int, length uint) string
func Substring(s string, offset int, length uint) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}

Wrap

用另一个字符串包裹一个字符串。

函数签名:

go
func Wrap(str string, wrapWith string) string
func Wrap(str string, wrapWith string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}

Unwrap

用另一个字符串解开包裹一个字符串。

函数签名:

go
func Unwrap(str string, wrapToken string) string
func Unwrap(str string, wrapToken string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}

SplitWords

将字符串拆分为单词,只支持字母字符单词。

函数签名:

go
func SplitWords(s string) []string
func SplitWords(s string) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}

WordCount

返回有意义单词的数量,只支持字母字符单词。

函数签名:

go
func WordCount(s string) int
func WordCount(s string) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}

RemoveNonPrintable

删除字符串中不可打印的字符。

函数签名:

go
func RemoveNonPrintable(str string) string
func RemoveNonPrintable(str string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\\u00a0 \\u200bworld\\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\\u00a0 \\u200bworld\\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}

StringToBytes

在不分配内存的情况下将字符串转换为字节片。

函数签名:

go
func StringToBytes(str string) (b []byte)
func StringToBytes(str string) (b []byte)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    // Output:
+    // [97 98 99]
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    // Output:
+    // [97 98 99]
+    // true
+}

BytesToString

在不分配内存的情况下将字节切片转换为字符串。

函数签名:

go
func BytesToString(bytes []byte) string
func BytesToString(bytes []byte) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

IsBlank

检查字符串是否为空格或空。

函数签名:

go
func IsBlank(str string) bool
func IsBlank(str string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\\t\\v\\f\\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\\t\\v\\f\\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HasPrefixAny

检查字符串是否以指定字符串数组中的任何一个开头。

函数签名:

go
func HasPrefixAny(str string, prefixes []string) bool
func HasPrefixAny(str string, prefixes []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasSuffixAny

检查字符串是否以指定字符串数组中的任何一个结尾。

函数签名:

go
func HasSuffixAny(str string, suffixes []string) bool
func HasSuffixAny(str string, suffixes []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IndexOffset

将字符串偏移idxFrom后,返回字符串中第一个 substr 实例的索引,如果字符串中不存在 substr,则返回 -1。

函数签名:

go
func IndexOffset(str string, substr string, idxFrom int) int
func IndexOffset(str string, substr string, idxFrom int) int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}

ReplaceWithMap

返回\`str\`的副本,以无序的方式被map替换,区分大小写。

函数签名:

go
func ReplaceWithMap(str string, replaces map[string]string) string
func ReplaceWithMap(str string, replaces map[string]string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}

Trim

从字符串的开头和结尾去除空格(或其他字符)。 可选参数 characterMask 指定额外的剥离字符。

函数签名:

go
func Trim(str string, characterMask ...string) string
func Trim(str string, characterMask ...string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}

SplitAndTrim

将字符串str按字符串delimiter拆分为一个切片,并对该数组的每个元素调用Trim。忽略Trim后为空的元素。

函数签名:

go
func SplitAndTrim(str, delimiter string, characterMask ...string) []string
func SplitAndTrim(str, delimiter string, characterMask ...string) []string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}

HideString

使用参数\`replaceChar\`隐藏源字符串中的一些字符。替换范围是 origin[start : end]。

函数签名:

go
func HideString(origin string, start, end int, replaceChar string) string
func HideString(origin string, start, end int, replaceChar string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}

ContainsAll

判断字符串是否包括全部给定的子字符串切片。

函数签名:

go
func ContainsAll(str string, substrs []string) bool
func ContainsAll(str string, substrs []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainsAny

判断字符串是否包括给定的子字符串切片中任意一个子字符串。

函数签名:

go
func ContainsAny(str string, substrs []string) bool
func ContainsAny(str string, substrs []string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

RemoveWhiteSpace

删除字符串中的空格,当设置repalceAll为true时,删除全部空格,为false时,替换多个空格为1个空格。

函数签名:

go
func RemoveWhiteSpace(str string, repalceAll bool) string
func RemoveWhiteSpace(str string, repalceAll bool) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \\r\\n    \\t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \\r\\n    \\t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}
`,223),q=[e,c,r,y,F,i,u,E,A,B,d];function f(g,b,D,h,m,v){return p(),o("div",null,q)}const P=l(t,[["render",f]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.lean.js b/docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.lean.js new file mode 100644 index 0000000..03989b9 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_strutil.md.2574c069.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Strutil","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/strutil.md","filePath":"api/packages/strutil.md"}'),t={name:"api/packages/strutil.md"},e=s("h1",{id:"Strutil",tabindex:"-1"},[a("Strutil "),s("a",{class:"header-anchor",href:"#Strutil","aria-label":'Permalink to "Strutil"'},"​")],-1),c=s("p",null,"strutil 包含处理字符串的相关函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/strutil/string.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/strutil/string.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",223),q=[e,c,r,y,F,i,u,E,A,B,d];function f(g,b,D,h,m,v){return p(),o("div",null,q)}const P=l(t,[["render",f]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.js b/docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.js new file mode 100644 index 0000000..88236f2 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.js @@ -0,0 +1,257 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"System","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/system.md","filePath":"api/packages/system.md"}'),e={name:"api/packages/system.md"},t=s("h1",{id:"System",tabindex:"-1"},[a("System "),s("a",{class:"header-anchor",href:"#System","aria-label":'Permalink to "System"'},"​")],-1),c=s("p",null,"system 包含 os, runtime, shell command 相关函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/system/os.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/system/os.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/system"
+)
import (
+    "github.com/duke-git/lancet/v2/system"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

目录

',2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

文档

IsWindows

检查当前操作系统是否是windows

函数签名:

go
func IsWindows() bool
func IsWindows() bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}

IsLinux

检查当前操作系统是否是linux

函数签名:运行

go
func IsLinux() bool
func IsLinux() bool

示例:

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}

IsMac

检查当前操作系统是否是macos

函数签名:

go
func IsMac() bool
func IsMac() bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}

GetOsEnv

获取key命名的环境变量的值

函数签名:

go
func GetOsEnv(key string) string
func GetOsEnv(key string) string

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

SetOsEnv

设置由key命名的环境变量的值

函数签名:

go
func SetOsEnv(key, value string) error
func SetOsEnv(key, value string) error

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

RemoveOsEnv

删除单个环境变量

函数签名:

go
func RemoveOsEnv(key string) error
func RemoveOsEnv(key string) error

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}

CompareOsEnv

获取key命名的环境变量值并与compareEnv进行比较

函数签名:

go
func CompareOsEnv(key, comparedEnv string) bool
func CompareOsEnv(key, comparedEnv string) bool

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

ExecCommand

执行shell命令,返回命令的stdout和stderr字符串,如果出现错误,则返回错误。参数\`command\`是一个完整的命令字符串,如ls-a(linux),dir(windows),ping 127.0.0.1。在linux中,使用/bin/bash-c执行命令,在windows中,使用powershell.exe执行命令。

函数签名:

go
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}

GetOsBits

获取当前操作系统位数,返回32或64

函数签名:

go
func GetOsBits() int
func GetOsBits() int

示例:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}
`,55),g=[t,c,r,y,i,F,E,u,d,A,m];function v(h,f,q,B,b,D){return p(),o("div",null,g)}const O=l(e,[["render",v]]);export{C as __pageData,O as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.lean.js b/docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.lean.js new file mode 100644 index 0000000..fd9bc63 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_system.md.3c9cc0ec.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"System","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/system.md","filePath":"api/packages/system.md"}'),e={name:"api/packages/system.md"},t=s("h1",{id:"System",tabindex:"-1"},[a("System "),s("a",{class:"header-anchor",href:"#System","aria-label":'Permalink to "System"'},"​")],-1),c=s("p",null,"system 包含 os, runtime, shell command 相关函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/system/os.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/system/os.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",55),g=[t,c,r,y,i,F,E,u,d,A,m];function v(h,f,q,B,b,D){return p(),o("div",null,g)}const O=l(e,[["render",v]]);export{C as __pageData,O as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.js b/docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.js new file mode 100644 index 0000000..fc7521d --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.js @@ -0,0 +1,1111 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Tuple","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/tuple.md","filePath":"api/packages/tuple.md"}'),e={name:"api/packages/tuple.md"},t=s("h1",{id:"Tuple",tabindex:"-1"},[a("Tuple "),s("a",{class:"header-anchor",href:"#Tuple","aria-label":'Permalink to "Tuple"'},"​")],-1),c=s("p",null,"tuple包实现一个元组数据类型。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

目录

',2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

文档

Tuple2

2元元组

函数签名:

go
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}

Tuple2_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple2[A, B]) Unbox() (A, B)
func (t Tuple2[A, B]) Unbox() (A, B)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}

Zip2

创建一个Tuple2元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}

Unzip2

根据传入的Tuple2切片,创建一组和Tuple2元素相对应的切片。

函数签名:

go
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}

Tuple3

3元元组。

函数签名:

go
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}

Tuple3_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple3[A, B, C]) Unbox() (A, B, C)
func (t Tuple3[A, B, C]) Unbox() (A, B, C)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}

Zip3

创建一个Tuple3元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}

Unzip3

根据传入的Tuple3切片,创建一组和Tuple3元素相对应的切片。

函数签名:

go
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}

Tuple4

4元元组。

函数签名:

go
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}

Tuple4_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}

Zip4

创建一个Tuple4元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}

Unzip4

根据传入的Tuple4切片,创建一组和Tuple4元素相对应的切片。

函数签名:

go
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}

Tuple5

5元元组。

函数签名:

go
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}

Tuple5_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}

Zip5

创建一个Tuple5元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}

Unzip5

根据传入的Tuple5切片,创建一组和Tuple5元素相对应的切片。

函数签名:

go
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}

Tuple6

6元元组。

函数签名:

go
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Tuple6_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Zip6

创建一个Tuple6元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}

Unzip6

根据传入的Tuple6切片,创建一组和Tuple6元素相对应的切片。

函数签名:

go
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}

Tuple7

7元元组。

函数签名:

go
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Tuple7_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Zip7

创建一个Tuple7元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}

Unzip7

根据传入的Tuple7切片,创建一组和Tuple7元素相对应的切片。

函数签名:

go
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}

Tuple8

8元元组。

函数签名:

go
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Tuple8_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Zip8

创建一个Tuple8元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}

Unzip8

根据传入的Tuple8切片,创建一组和Tuple8元素相对应的切片。

函数签名:

go
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}

Tuple9

9元元组。

函数签名:

go
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Tuple9_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Zip9

创建一个Tuple9元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}

Unzip9

根据传入的Tuple9切片,创建一组和Tuple9元素相对应的切片。

函数签名:

go
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}

Tuple10

10元元组。

函数签名:

go
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Tuple10_Unbox

返回元组的字段值。

函数签名:

go
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Zip10

创建一个Tuple10元组切片, 其中元组的元素和传入切片元素相对应。

函数签名:

go
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}

Unzip10

根据传入的Tuple10切片,创建一组和Tuple10元素相对应的切片。

函数签名:

go
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}
`,217),v=[t,c,r,y,F,i,E,A,u,B,d];function g(f,h,q,b,D,C){return p(),o("div",null,v)}const T=l(e,[["render",g]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.lean.js b/docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.lean.js new file mode 100644 index 0000000..353c014 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_tuple.md.04b31a3e.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Tuple","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/tuple.md","filePath":"api/packages/tuple.md"}'),e={name:"api/packages/tuple.md"},t=s("h1",{id:"Tuple",tabindex:"-1"},[a("Tuple "),s("a",{class:"header-anchor",href:"#Tuple","aria-label":'Permalink to "Tuple"'},"​")],-1),c=s("p",null,"tuple包实现一个元组数据类型。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",217),v=[t,c,r,y,F,i,E,A,u,B,d];function g(f,h,q,b,D,C){return p(),o("div",null,v)}const T=l(e,[["render",g]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.js b/docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.js new file mode 100644 index 0000000..0ed4645 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.js @@ -0,0 +1,1201 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Validator","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/validator.md","filePath":"api/packages/validator.md"}'),e={name:"api/packages/validator.md"},t=s("h1",{id:"Validator",tabindex:"-1"},[a("Validator "),s("a",{class:"header-anchor",href:"#Validator","aria-label":'Permalink to "Validator"'},"​")],-1),c=s("p",null,"validator 验证器包,包含常用字符串格式验证函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/validator/validator.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/validator/validator.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/validator"
+)
import (
+    "github.com/duke-git/lancet/v2/validator"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

目录:

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

文档

ContainChinese

验证字符串是否包含中文字符。

函数签名:

go
func ContainChinese(s string) bool
func ContainChinese(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainLetter

验证字符串是否包含至少一个英文字母。

函数签名:

go
func ContainLetter(str string) bool
func ContainLetter(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

ContainLower

验证字符串是否包含至少一个英文小写字母。

函数签名:

go
func ContainLower(str string) bool
func ContainLower(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainUpper

验证字符串是否包含至少一个英文大写字母。

函数签名:

go
func ContainUpper(str string) bool
func ContainUpper(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsAlpha

验证字符串是否只包含英文字母。

函数签名:

go
func IsAlpha(s string) bool
func IsAlpha(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllUpper

验证字符串是否全是大写英文字母。

函数签名:

go
func IsAllUpper(str string) bool
func IsAllUpper(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllLower

验证字符串是否全是小写英文字母。

函数签名:

go
func IsAllLower(str string) bool
func IsAllLower(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsASCII

验证字符串全部为ASCII字符。

函数签名:

go
func IsASCII(str string) bool
func IsASCII(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}

IsBase64

验证字符串是否是base64编码。

函数签名:

go
func IsBase64(base64 string) bool
func IsBase64(base64 string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseMobile

验证字符串是否是中国手机号码。

函数签名:

go
func IsChineseMobile(mobileNum string) bool
func IsChineseMobile(mobileNum string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseIdNum

验证字符串是否是中国身份证号码。

函数签名:

go
func IsChineseIdNum(id string) bool
func IsChineseIdNum(id string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChinesePhone

验证字符串是否是中国电话座机号码。

函数签名:

go
func IsChinesePhone(phone string) bool
func IsChinesePhone(phone string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsCreditCard

验证字符串是否是信用卡号码。

函数签名:

go
func IsCreditCard(creditCart string) bool
func IsCreditCard(creditCart string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsDns

验证字符串是否是有效dns。

函数签名:

go
func IsDns(dns string) bool
func IsDns(dns string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsEmail

验证字符串是否是有效电子邮件地址。

函数签名:

go
func IsEmail(email string) bool
func IsEmail(email string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsEmptyString

验证字符串是否是空字符串。

函数签名:

go
func IsEmptyString(s string) bool
func IsEmptyString(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsInt

验证参数是否是整数(int, unit)。

函数签名:

go
func IsInt(v any) bool
func IsInt(v any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsFloat

验证参数是否是浮点数(float32, float34)。

函数签名:

go
func IsFloat(v any) bool
func IsFloat(v any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsNumber

验证参数是否是数字(integer or float)。

函数签名:

go
func IsNumber(v any) bool
func IsNumber(v any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}

IsIntStr

验证字符串是否是可以转换为整数。

函数签名:

go
func IsIntStr(s string) bool
func IsIntStr(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsFloatStr

验证字符串是否是可以转换为浮点数。

函数签名:

go
func IsFloatStr(s string) bool
func IsFloatStr(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsNumberStr

验证字符串是否是可以转换为数字。

函数签名:

go
func IsNumberStr(s string) bool
func IsNumberStr(s string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsJSON

验证字符串是否是有效json。

函数签名:

go
func IsJSON(str string) bool
func IsJSON(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\\"name\\": \\"test\\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\\"name\\": \\"test\\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsRegexMatch

验证字符串是否可以匹配正则表达式。

函数签名:

go
func IsRegexMatch(s, regex string) bool
func IsRegexMatch(s, regex string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", \`^[a-zA-Z]+$\`)
+    result2 := validator.IsRegexMatch("ab1", \`^[a-zA-Z]+$\`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", \`^[a-zA-Z]+$\`)
+    result2 := validator.IsRegexMatch("ab1", \`^[a-zA-Z]+$\`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIp

验证字符串是否是ip地址。

函数签名:

go
func IsIp(ipstr string) bool
func IsIp(ipstr string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsIpV4

验证字符串是否是ipv4地址。

函数签名:

go
func IsIpV4(ipstr string) bool
func IsIpV4(ipstr string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIpV6

验证字符串是否是ipv6地址。

函数签名:

go
func IsIpV6(ipstr string) bool
func IsIpV6(ipstr string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsStrongPassword

验证字符串是否是强密码:(alpha(lower+upper) + number + special chars(!@#$%^&*()?><))。

函数签名:

go
func IsStrongPassword(password string, length int) bool
func IsStrongPassword(password string, length int) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsUrl

验证字符串是否是url。

函数签名:

go
func IsUrl(str string) bool
func IsUrl(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsWeakPassword

验证字符串是否是弱密码:(only letter or only number or letter + number) 。

函数签名:

go
func IsWeakPassword(password string, length int) bool
func IsWeakPassword(password string, length int) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsZeroValue

判断传入的参数值是否为零值。

函数签名:

go
func IsZeroValue(value any) bool
func IsZeroValue(value any) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsGBK

检查数据编码是否为gbk(汉字内部代码扩展规范)。该函数的实现取决于双字节是否在gbk的编码范围内,而utf-8编码格式的每个字节都在gbk编码范围内。因此,应该首先调用utf8.valid检查它是否是utf-8编码,然后调用IsGBK检查gbk编码。如示例所示。

函数签名:

go
func IsGBK(data []byte) bool
func IsGBK(data []byte) bool

示例:Run

go
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

IsPrintable

检查字符串是否全部为可打印字符。

函数签名:

go
func IsPrintable(str string) bool
func IsPrintable(str string) bool

示例:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}
`,199),B=[t,c,r,y,F,i,u,A,E,d,g];function h(v,f,q,b,m,I){return p(),o("div",null,B)}const k=l(e,[["render",h]]);export{C as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.lean.js b/docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.lean.js new file mode 100644 index 0000000..15e2cb0 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_validator.md.1f431893.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Validator","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/validator.md","filePath":"api/packages/validator.md"}'),e={name:"api/packages/validator.md"},t=s("h1",{id:"Validator",tabindex:"-1"},[a("Validator "),s("a",{class:"header-anchor",href:"#Validator","aria-label":'Permalink to "Validator"'},"​")],-1),c=s("p",null,"validator 验证器包,包含常用字符串格式验证函数。",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/validator/validator.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/validator/validator.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",199),B=[t,c,r,y,F,i,u,A,E,d,g];function h(v,f,q,b,m,I){return p(),o("div",null,B)}const k=l(e,[["render",h]]);export{C as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.js b/docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.js new file mode 100644 index 0000000..b0d477f --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.js @@ -0,0 +1,481 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Xerror","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/xerror.md","filePath":"api/packages/xerror.md"}'),e={name:"api/packages/xerror.md"},r=s("h1",{id:"Xerror",tabindex:"-1"},[a("Xerror "),s("a",{class:"header-anchor",href:"#Xerror","aria-label":'Permalink to "Xerror"'},"​")],-1),t=s("p",null,"xerror 错误处理逻辑封装",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

用法:

go
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

目录

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

文档

New

创建XError对象实例。

函数签名:

go
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

Wrap

根据error对象创建XError对象实例,可添加message。

函数签名:

go
func Wrap(cause error, message ...any) *XError
func Wrap(cause error, message ...any) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}

Unwrap

从error对象中解构出XError。

函数签名:

go
func Unwrap(err error) *XError
func Unwrap(err error) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}

XError_Wrap

创建新的XError对象并将消息和id复制到新的对象中。

函数签名:

go
func (e *XError) Wrap(cause error) *XError
func (e *XError) Wrap(cause error) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}

XError_Unwrap

解构XEerror为error对象。适配github.com/pkg/errors。

函数签名:

go
func (e *XError) Unwrap() error
func (e *XError) Unwrap() error

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}

XError_With

添加与XError对象的键和值。

函数签名:

go
func (e *XError) With(key string, value any) *XError
func (e *XError) With(key string, value any) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_Id

设置XError对象的id。

函数签名:

go
func (e *XError) Id(id string) *XError
func (e *XError) Id(id string) *XError

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Is

检查目标error是否为XError,两个错误中的error.id是否匹配。

函数签名:

go
func (e *XError) Is(target error) bool
func (e *XError) Is(target error) bool

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Values

返回由With设置的键和值的映射。将合并所有XError键和值。

函数签名:

go
func (e *XError) Values() map[string]any
func (e *XError) Values() map[string]any

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_StackTrace

返回与pkg/error兼容的堆栈信息。

函数签名:

go
func (e *XError) StackTrace() StackTrace
func (e *XError) StackTrace() StackTrace

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}

XError_Info

返回可打印的XError对象信息。

函数签名:

go
func (e *XError) Info() *errInfo
func (e *XError) Info() *errInfo

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}

XError_Error

实现标准库的error接口。

函数签名:

go
func (e *XError) Error() string
func (e *XError) Error() string

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

TryUnwrap

检查error, 如果err为nil则展开,则它返回一个有效值,如果err不是nil则TryUnwrap使用err发生panic。

函数签名:

go
func TryUnwrap[T any](val T, err error) T
func TryUnwrap[T any](val T, err error) T

示例:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}
`,79),h=[r,t,c,y,F,i,E,u,A,d,g];function q(B,v,f,m,D,k){return p(),o("div",null,h)}const _=l(e,[["render",q]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.lean.js b/docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.lean.js new file mode 100644 index 0000000..f30fed6 --- /dev/null +++ b/docs/.vitepress/dist/assets/api_packages_xerror.md.b2d37d2c.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Xerror","description":"","frontmatter":{},"headers":[],"relativePath":"api/packages/xerror.md","filePath":"api/packages/xerror.md"}'),e={name:"api/packages/xerror.md"},r=s("h1",{id:"Xerror",tabindex:"-1"},[a("Xerror "),s("a",{class:"header-anchor",href:"#Xerror","aria-label":'Permalink to "Xerror"'},"​")],-1),t=s("p",null,"xerror 错误处理逻辑封装",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"源码-",tabindex:"-1"},[a("源码: "),s("a",{class:"header-anchor",href:"#源码-","aria-label":'Permalink to "源码:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",79),h=[r,t,c,y,F,i,E,u,A,d,g];function q(B,v,f,m,D,k){return p(),o("div",null,h)}const _=l(e,[["render",q]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/app.531ff9c7.js b/docs/.vitepress/dist/assets/app.531ff9c7.js new file mode 100644 index 0000000..75adc72 --- /dev/null +++ b/docs/.vitepress/dist/assets/app.531ff9c7.js @@ -0,0 +1 @@ +import{G as s,a5 as i,a6 as p,a7 as u,a8 as c,a9 as l,aa as f,ab as d,ac as m,ad as h,ae as A,$ as g,d as P,u as v,j as y,A as C,af as w,ag as _,ah as b,ai as E}from"./chunks/framework.6e839c56.js";import{t as R}from"./chunks/theme.4451c782.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const o=r(R),D=P({name:"VitePressApp",setup(){const{site:e}=v();return y(()=>{C(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),w(),_(),b(),o.setup&&o.setup(),()=>E(o.Layout)}});async function j(){const e=S(),a=O();a.provide(p,e);const t=u(e.route);return a.provide(c,t),a.component("Content",l),a.component("ClientOnly",f),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:a,router:e,siteData:d}),{app:a,router:e,data:t}}function O(){return m(D)}function S(){let e=s,a;return h(t=>{let n=A(t);return n?(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),s&&(e=!1),g(()=>import(n),[])):null},o.NotFound)}s&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{j as createApp}; diff --git a/docs/.vitepress/dist/assets/chunks/@localSearchIndexen.3dcccaf9.js b/docs/.vitepress/dist/assets/chunks/@localSearchIndexen.3dcccaf9.js new file mode 100644 index 0000000..574962b --- /dev/null +++ b/docs/.vitepress/dist/assets/chunks/@localSearchIndexen.3dcccaf9.js @@ -0,0 +1 @@ +const t='{"documentCount":912,"nextId":912,"documentIds":{"0":"/en/api/overview.html#API-Overview","1":"/en/api/packages/algorithm.html#Algorithm","2":"/en/api/packages/algorithm.html#Source","3":"/en/api/packages/algorithm.html#Usage","4":"/en/api/packages/algorithm.html#Index","5":"/en/api/packages/algorithm.html#Documentation","6":"/en/api/packages/algorithm.html#BubbleSort","7":"/en/api/packages/algorithm.html#InsertionSort","8":"/en/api/packages/algorithm.html#SelectionSort","9":"/en/api/packages/algorithm.html#ShellSort","10":"/en/api/packages/algorithm.html#QuickSort","11":"/en/api/packages/algorithm.html#HeapSort","12":"/en/api/packages/algorithm.html#MergeSort","13":"/en/api/packages/algorithm.html#CountSort","14":"/en/api/packages/algorithm.html#BinarySearch","15":"/en/api/packages/algorithm.html#BinaryIterativeSearch","16":"/en/api/packages/algorithm.html#LinearSearch","17":"/en/api/packages/algorithm.html#LRUCache","18":"/en/api/packages/compare.html#Compare","19":"/en/api/packages/compare.html#Source-","20":"/en/api/packages/compare.html#Usage-","21":"/en/api/packages/compare.html#Index","22":"/en/api/packages/compare.html#Documentation","23":"/en/api/packages/compare.html#Equal","24":"/en/api/packages/compare.html#EqualValue","25":"/en/api/packages/compare.html#LessThan","26":"/en/api/packages/compare.html#GreaterThan","27":"/en/api/packages/compare.html#LessOrEqual","28":"/en/api/packages/compare.html#GreaterOrEqual","29":"/en/api/packages/compare.html#InDelta","30":"/en/api/packages/concurrency.html#Concurrency","31":"/en/api/packages/concurrency.html#Source-","32":"/en/api/packages/concurrency.html#Usage-","33":"/en/api/packages/concurrency.html#Index","34":"/en/api/packages/concurrency.html#Channel","35":"/en/api/packages/concurrency.html#Documentation","36":"/en/api/packages/concurrency.html#Channel-1","37":"/en/api/packages/concurrency.html#NewChannel","38":"/en/api/packages/concurrency.html#Bridge","39":"/en/api/packages/concurrency.html#FanIn","40":"/en/api/packages/concurrency.html#Repeat","41":"/en/api/packages/concurrency.html#Generate","42":"/en/api/packages/concurrency.html#RepeatFn","43":"/en/api/packages/concurrency.html#Or","44":"/en/api/packages/concurrency.html#OrDone","45":"/en/api/packages/concurrency.html#Take","46":"/en/api/packages/concurrency.html#Tee","47":"/en/api/packages/condition.html#Condition","48":"/en/api/packages/condition.html#Source-","49":"/en/api/packages/condition.html#Usage-","50":"/en/api/packages/condition.html#Index","51":"/en/api/packages/condition.html#Documentation","52":"/en/api/packages/condition.html#Bool","53":"/en/api/packages/condition.html#And","54":"/en/api/packages/condition.html#Or","55":"/en/api/packages/condition.html#Xor","56":"/en/api/packages/condition.html#Nor","57":"/en/api/packages/condition.html#Xnor","58":"/en/api/packages/condition.html#Nand","59":"/en/api/packages/condition.html#TernaryOperator","60":"/en/api/packages/convertor.html#Convertor","61":"/en/api/packages/convertor.html#Source-","62":"/en/api/packages/convertor.html#Usage-","63":"/en/api/packages/convertor.html#Index","64":"/en/api/packages/convertor.html#Documentation","65":"/en/api/packages/convertor.html#ColorHexToRGB","66":"/en/api/packages/convertor.html#ColorRGBToHex","67":"/en/api/packages/convertor.html#ToBool","68":"/en/api/packages/convertor.html#ToBytes","69":"/en/api/packages/convertor.html#ToChar","70":"/en/api/packages/convertor.html#ToChannel","71":"/en/api/packages/convertor.html#ToFloat","72":"/en/api/packages/convertor.html#ToInt","73":"/en/api/packages/convertor.html#ToJson","74":"/en/api/packages/convertor.html#ToMap","75":"/en/api/packages/convertor.html#ToPointer","76":"/en/api/packages/convertor.html#ToString","77":"/en/api/packages/convertor.html#StructToMap","78":"/en/api/packages/convertor.html#MapToSlice","79":"/en/api/packages/convertor.html#EncodeByte","80":"/en/api/packages/convertor.html#DecodeByte","81":"/en/api/packages/convertor.html#DeepClone","82":"/en/api/packages/convertor.html#CopyProperties","83":"/en/api/packages/convertor.html#ToInterface","84":"/en/api/packages/convertor.html#Utf8ToGbk","85":"/en/api/packages/convertor.html#GbkToUtf8","86":"/en/api/packages/cryptor.html#Cryptor","87":"/en/api/packages/cryptor.html#Source-","88":"/en/api/packages/cryptor.html#Usage-","89":"/en/api/packages/cryptor.html#Index","90":"/en/api/packages/cryptor.html#Documentation","91":"/en/api/packages/cryptor.html#AesEcbEncrypt","92":"/en/api/packages/cryptor.html#AesEcbDecrypt","93":"/en/api/packages/cryptor.html#AesCbcEncrypt","94":"/en/api/packages/cryptor.html#AesCbcDecrypt","95":"/en/api/packages/cryptor.html#AesCtrCrypt","96":"/en/api/packages/cryptor.html#AesCfbEncrypt","97":"/en/api/packages/cryptor.html#AesCfbDecrypt","98":"/en/api/packages/cryptor.html#AesOfbEncrypt","99":"/en/api/packages/cryptor.html#AesOfbDecrypt","100":"/en/api/packages/cryptor.html#Base64StdEncode","101":"/en/api/packages/cryptor.html#Base64StdDecode","102":"/en/api/packages/cryptor.html#DesEcbEncrypt","103":"/en/api/packages/cryptor.html#DesEcbDecrypt","104":"/en/api/packages/cryptor.html#DesCbcEncrypt","105":"/en/api/packages/cryptor.html#DesCbcDecrypt","106":"/en/api/packages/cryptor.html#DesCtrCrypt","107":"/en/api/packages/cryptor.html#DesCfbEncrypt","108":"/en/api/packages/cryptor.html#DesCfbDecrypt","109":"/en/api/packages/cryptor.html#DesOfbEncrypt","110":"/en/api/packages/cryptor.html#DesOfbDecrypt","111":"/en/api/packages/cryptor.html#HmacMd5","112":"/en/api/packages/cryptor.html#HmacMd5WithBase64","113":"/en/api/packages/cryptor.html#HmacSha1","114":"/en/api/packages/cryptor.html#HmacSha1WithBase64","115":"/en/api/packages/cryptor.html#HmacSha256","116":"/en/api/packages/cryptor.html#HmacSha256WithBase64","117":"/en/api/packages/cryptor.html#HmacSha512","118":"/en/api/packages/cryptor.html#HmacSha512WithBase64","119":"/en/api/packages/cryptor.html#Md5String","120":"/en/api/packages/cryptor.html#Md5StringWithBase64","121":"/en/api/packages/cryptor.html#Md5Byte","122":"/en/api/packages/cryptor.html#Md5ByteWithBase64","123":"/en/api/packages/cryptor.html#Md5File","124":"/en/api/packages/cryptor.html#Sha1","125":"/en/api/packages/cryptor.html#Sha1WithBase64","126":"/en/api/packages/cryptor.html#Sha256","127":"/en/api/packages/cryptor.html#Sha256WithBase64","128":"/en/api/packages/cryptor.html#Sha512","129":"/en/api/packages/cryptor.html#Sha512WithBase64","130":"/en/api/packages/cryptor.html#GenerateRsaKey","131":"/en/api/packages/cryptor.html#RsaEncrypt","132":"/en/api/packages/cryptor.html#RsaDecrypt","133":"/en/api/packages/datastructure/copyonwritelist.html#CopyOnWriteList","134":"/en/api/packages/datastructure/copyonwritelist.html#源码","135":"/en/api/packages/datastructure/copyonwritelist.html#用法","136":"/en/api/packages/datastructure/copyonwritelist.html#目录","137":"/en/api/packages/datastructure/copyonwritelist.html#Documentation","138":"/en/api/packages/datastructure/copyonwritelist.html#NewCopyOnWriteList","139":"/en/api/packages/datastructure/copyonwritelist.html#Example","140":"/en/api/packages/datastructure/copyonwritelist.html#Size","141":"/en/api/packages/datastructure/copyonwritelist.html#Example-1","142":"/en/api/packages/datastructure/copyonwritelist.html#Get","143":"/en/api/packages/datastructure/copyonwritelist.html#Example-2","144":"/en/api/packages/datastructure/copyonwritelist.html#Set","145":"/en/api/packages/datastructure/copyonwritelist.html#Example-3","146":"/en/api/packages/datastructure/copyonwritelist.html#Remove","147":"/en/api/packages/datastructure/copyonwritelist.html#IndexOf","148":"/en/api/packages/datastructure/copyonwritelist.html#Example-4","149":"/en/api/packages/datastructure/copyonwritelist.html#LastIndexOf","150":"/en/api/packages/datastructure/copyonwritelist.html#Example-5","151":"/en/api/packages/datastructure/copyonwritelist.html#IsEmpty","152":"/en/api/packages/datastructure/copyonwritelist.html#Example-6","153":"/en/api/packages/datastructure/copyonwritelist.html#Contain","154":"/en/api/packages/datastructure/copyonwritelist.html#Example-7","155":"/en/api/packages/datastructure/copyonwritelist.html#ValueOf","156":"/en/api/packages/datastructure/copyonwritelist.html#Example-8","157":"/en/api/packages/datastructure/copyonwritelist.html#Add","158":"/en/api/packages/datastructure/copyonwritelist.html#Example-9","159":"/en/api/packages/datastructure/copyonwritelist.html#AddAll","160":"/en/api/packages/datastructure/copyonwritelist.html#Example-10","161":"/en/api/packages/datastructure/copyonwritelist.html#AddByIndex","162":"/en/api/packages/datastructure/copyonwritelist.html#Example-11","163":"/en/api/packages/datastructure/copyonwritelist.html#DeleteAt","164":"/en/api/packages/datastructure/copyonwritelist.html#Example-12","165":"/en/api/packages/datastructure/copyonwritelist.html#DeleteIf","166":"/en/api/packages/datastructure/copyonwritelist.html#Example-13","167":"/en/api/packages/datastructure/copyonwritelist.html#DeleteBy","168":"/en/api/packages/datastructure/copyonwritelist.html#Example-14","169":"/en/api/packages/datastructure/copyonwritelist.html#DeleteRange","170":"/en/api/packages/datastructure/copyonwritelist.html#Example-15","171":"/en/api/packages/datastructure/copyonwritelist.html#Equal","172":"/en/api/packages/datastructure/copyonwritelist.html#Example-16","173":"/en/api/packages/datastructure/hashmap.html#HashMap","174":"/en/api/packages/datastructure/hashmap.html#Source","175":"/en/api/packages/datastructure/hashmap.html#Usage","176":"/en/api/packages/datastructure/hashmap.html#Index","177":"/en/api/packages/datastructure/hashmap.html#Documentation","178":"/en/api/packages/datastructure/hashmap.html#NewHashMap","179":"/en/api/packages/datastructure/hashmap.html#NewHashMap-1","180":"/en/api/packages/datastructure/hashmap.html#Get","181":"/en/api/packages/datastructure/hashmap.html#Put","182":"/en/api/packages/datastructure/hashmap.html#Delete","183":"/en/api/packages/datastructure/hashmap.html#Contains","184":"/en/api/packages/datastructure/hashmap.html#Iterate","185":"/en/api/packages/datastructure/hashmap.html#Keys","186":"/en/api/packages/datastructure/hashmap.html#Values","187":"/en/api/packages/datastructure/heap.html#Heap","188":"/en/api/packages/datastructure/heap.html#Source","189":"/en/api/packages/datastructure/heap.html#Usage","190":"/en/api/packages/datastructure/heap.html#Index","191":"/en/api/packages/datastructure/heap.html#Documentation","192":"/en/api/packages/datastructure/heap.html#_1-MaxHeap","193":"/en/api/packages/datastructure/heap.html#NewMaxHeap","194":"/en/api/packages/datastructure/heap.html#Push","195":"/en/api/packages/datastructure/heap.html#Pop","196":"/en/api/packages/datastructure/heap.html#Peek","197":"/en/api/packages/datastructure/heap.html#Data","198":"/en/api/packages/datastructure/heap.html#Size","199":"/en/api/packages/datastructure/heap.html#PrintStructure","200":"/en/api/packages/datastructure/link.html#Linklist","201":"/en/api/packages/datastructure/link.html#Source","202":"/en/api/packages/datastructure/link.html#Usage","203":"/en/api/packages/datastructure/link.html#Index","204":"/en/api/packages/datastructure/link.html#_1-SinglyLink","205":"/en/api/packages/datastructure/link.html#_2-DoublyLink","206":"/en/api/packages/datastructure/link.html#Documentation","207":"/en/api/packages/datastructure/link.html#_1-SinglyLink-1","208":"/en/api/packages/datastructure/link.html#NewSinglyLink","209":"/en/api/packages/datastructure/link.html#Values","210":"/en/api/packages/datastructure/link.html#InsertAt","211":"/en/api/packages/datastructure/link.html#InsertAtHead","212":"/en/api/packages/datastructure/link.html#InsertAtTail","213":"/en/api/packages/datastructure/link.html#DeleteAt","214":"/en/api/packages/datastructure/link.html#DeleteAtHead","215":"/en/api/packages/datastructure/link.html#DeleteAtTail","216":"/en/api/packages/datastructure/link.html#DeleteValue","217":"/en/api/packages/datastructure/link.html#Reverse","218":"/en/api/packages/datastructure/link.html#GetMiddleNode","219":"/en/api/packages/datastructure/link.html#Size","220":"/en/api/packages/datastructure/link.html#IsEmpty","221":"/en/api/packages/datastructure/link.html#Clear","222":"/en/api/packages/datastructure/link.html#Print","223":"/en/api/packages/datastructure/link.html#_2-DoublyLink-1","224":"/en/api/packages/datastructure/link.html#NewDoublyLink","225":"/en/api/packages/datastructure/link.html#Values-1","226":"/en/api/packages/datastructure/link.html#InsertAt-1","227":"/en/api/packages/datastructure/link.html#InsertAtHead-1","228":"/en/api/packages/datastructure/link.html#InsertAtTail-1","229":"/en/api/packages/datastructure/link.html#DeleteAt-1","230":"/en/api/packages/datastructure/link.html#DeleteAtHead-1","231":"/en/api/packages/datastructure/link.html#DeleteAtTail-1","232":"/en/api/packages/datastructure/link.html#Reverse-1","233":"/en/api/packages/datastructure/link.html#GetMiddleNode-1","234":"/en/api/packages/datastructure/link.html#Size-1","235":"/en/api/packages/datastructure/link.html#IsEmpty-1","236":"/en/api/packages/datastructure/link.html#Clear-1","237":"/en/api/packages/datastructure/link.html#Print-1","238":"/en/api/packages/datastructure/list.html#List","239":"/en/api/packages/datastructure/list.html#Source","240":"/en/api/packages/datastructure/list.html#Usage","241":"/en/api/packages/datastructure/list.html#Index","242":"/en/api/packages/datastructure/list.html#Documentation","243":"/en/api/packages/datastructure/list.html#NewList","244":"/en/api/packages/datastructure/list.html#Contain","245":"/en/api/packages/datastructure/list.html#Data","246":"/en/api/packages/datastructure/list.html#ValueOf","247":"/en/api/packages/datastructure/list.html#IndexOf","248":"/en/api/packages/datastructure/list.html#LastIndexOf","249":"/en/api/packages/datastructure/list.html#IndexOfFunc","250":"/en/api/packages/datastructure/list.html#LastIndexOfFunc","251":"/en/api/packages/datastructure/list.html#Push","252":"/en/api/packages/datastructure/list.html#PopFirst","253":"/en/api/packages/datastructure/list.html#PopFirst-1","254":"/en/api/packages/datastructure/list.html#DeleteAt","255":"/en/api/packages/datastructure/list.html#InsertAt","256":"/en/api/packages/datastructure/list.html#UpdateAt","257":"/en/api/packages/datastructure/list.html#Equal","258":"/en/api/packages/datastructure/list.html#IsEmpty","259":"/en/api/packages/datastructure/list.html#Clear","260":"/en/api/packages/datastructure/list.html#Clone","261":"/en/api/packages/datastructure/list.html#Merge","262":"/en/api/packages/datastructure/list.html#Size","263":"/en/api/packages/datastructure/list.html#Cap","264":"/en/api/packages/datastructure/list.html#Swap","265":"/en/api/packages/datastructure/list.html#Reverse","266":"/en/api/packages/datastructure/list.html#Unique","267":"/en/api/packages/datastructure/list.html#Union","268":"/en/api/packages/datastructure/list.html#Intersection","269":"/en/api/packages/datastructure/list.html#Difference","270":"/en/api/packages/datastructure/list.html#SymmetricDifference","271":"/en/api/packages/datastructure/list.html#RetainAll","272":"/en/api/packages/datastructure/list.html#DeleteAll","273":"/en/api/packages/datastructure/list.html#ForEach","274":"/en/api/packages/datastructure/list.html#Iterator","275":"/en/api/packages/datastructure/list.html#ListToMap","276":"/en/api/packages/datastructure/list.html#SubList","277":"/en/api/packages/datastructure/list.html#DeleteIf","278":"/en/api/packages/datastructure/queue.html#Queue","279":"/en/api/packages/datastructure/queue.html#Source","280":"/en/api/packages/datastructure/queue.html#Usage","281":"/en/api/packages/datastructure/queue.html#Index","282":"/en/api/packages/datastructure/queue.html#_1-ArrayQueue","283":"/en/api/packages/datastructure/queue.html#_2-LinkedQueue","284":"/en/api/packages/datastructure/queue.html#_3-CircularQueue","285":"/en/api/packages/datastructure/queue.html#_4-PriorityQueue","286":"/en/api/packages/datastructure/queue.html#Documentation","287":"/en/api/packages/datastructure/queue.html#_1-ArrayQueue-1","288":"/en/api/packages/datastructure/queue.html#NewArrayQueue","289":"/en/api/packages/datastructure/queue.html#Data","290":"/en/api/packages/datastructure/queue.html#Enqueue","291":"/en/api/packages/datastructure/queue.html#Dequeue","292":"/en/api/packages/datastructure/queue.html#Front","293":"/en/api/packages/datastructure/queue.html#Back","294":"/en/api/packages/datastructure/queue.html#Size","295":"/en/api/packages/datastructure/queue.html#IsEmpty","296":"/en/api/packages/datastructure/queue.html#IsFull","297":"/en/api/packages/datastructure/queue.html#Clear","298":"/en/api/packages/datastructure/queue.html#Contain","299":"/en/api/packages/datastructure/queue.html#_2-LinkedQueue-1","300":"/en/api/packages/datastructure/queue.html#NewLinkedQueue","301":"/en/api/packages/datastructure/queue.html#Data-1","302":"/en/api/packages/datastructure/queue.html#Enqueue-1","303":"/en/api/packages/datastructure/queue.html#Dequeue-1","304":"/en/api/packages/datastructure/queue.html#Front-1","305":"/en/api/packages/datastructure/queue.html#Back-1","306":"/en/api/packages/datastructure/queue.html#Size-1","307":"/en/api/packages/datastructure/queue.html#IsEmpty-1","308":"/en/api/packages/datastructure/queue.html#Clear-1","309":"/en/api/packages/datastructure/queue.html#Contain-1","310":"/en/api/packages/datastructure/queue.html#_3-CircularQueue-1","311":"/en/api/packages/datastructure/queue.html#NewCircularQueue","312":"/en/api/packages/datastructure/queue.html#Data-2","313":"/en/api/packages/datastructure/queue.html#Enqueue-2","314":"/en/api/packages/datastructure/queue.html#Dequeue-2","315":"/en/api/packages/datastructure/queue.html#Front-2","316":"/en/api/packages/datastructure/queue.html#Back-2","317":"/en/api/packages/datastructure/queue.html#Size-2","318":"/en/api/packages/datastructure/queue.html#IsEmpty-2","319":"/en/api/packages/datastructure/queue.html#IsFull-1","320":"/en/api/packages/datastructure/queue.html#Clear-2","321":"/en/api/packages/datastructure/queue.html#Contain-2","322":"/en/api/packages/datastructure/queue.html#_4-PriorityQueue-1","323":"/en/api/packages/datastructure/queue.html#NewPriorityQueue","324":"/en/api/packages/datastructure/queue.html#Data-3","325":"/en/api/packages/datastructure/queue.html#Enqueue-3","326":"/en/api/packages/datastructure/queue.html#Dequeue-3","327":"/en/api/packages/datastructure/queue.html#IsEmpty-3","328":"/en/api/packages/datastructure/queue.html#IsFull-2","329":"/en/api/packages/datastructure/queue.html#Size-3","330":"/en/api/packages/datastructure/set.html#Set","331":"/en/api/packages/datastructure/set.html#Source","332":"/en/api/packages/datastructure/set.html#Usage","333":"/en/api/packages/datastructure/set.html#Index","334":"/en/api/packages/datastructure/set.html#Documentation","335":"/en/api/packages/datastructure/set.html#NewSet","336":"/en/api/packages/datastructure/set.html#NewSetFromSlice","337":"/en/api/packages/datastructure/set.html#Values","338":"/en/api/packages/datastructure/set.html#Add","339":"/en/api/packages/datastructure/set.html#AddIfNotExist","340":"/en/api/packages/datastructure/set.html#AddIfNotExistBy","341":"/en/api/packages/datastructure/set.html#Delete","342":"/en/api/packages/datastructure/set.html#Contain","343":"/en/api/packages/datastructure/set.html#ContainAll","344":"/en/api/packages/datastructure/set.html#Size","345":"/en/api/packages/datastructure/set.html#Clone","346":"/en/api/packages/datastructure/set.html#Equal","347":"/en/api/packages/datastructure/set.html#Iterate","348":"/en/api/packages/datastructure/set.html#EachWithBreak","349":"/en/api/packages/datastructure/set.html#IsEmpty","350":"/en/api/packages/datastructure/set.html#Union","351":"/en/api/packages/datastructure/set.html#Intersection","352":"/en/api/packages/datastructure/set.html#SymmetricDifference","353":"/en/api/packages/datastructure/set.html#Minus","354":"/en/api/packages/datastructure/set.html#Pop","355":"/en/api/packages/datastructure/stack.html#Stack","356":"/en/api/packages/datastructure/stack.html#Source","357":"/en/api/packages/datastructure/stack.html#Usage","358":"/en/api/packages/datastructure/stack.html#Index","359":"/en/api/packages/datastructure/stack.html#_1-ArrayStack","360":"/en/api/packages/datastructure/stack.html#_2-LinkedStack","361":"/en/api/packages/datastructure/stack.html#Documentation","362":"/en/api/packages/datastructure/stack.html#_1-ArrayStack-1","363":"/en/api/packages/datastructure/stack.html#NewArrayStack","364":"/en/api/packages/datastructure/stack.html#Push","365":"/en/api/packages/datastructure/stack.html#Pop","366":"/en/api/packages/datastructure/stack.html#Peak","367":"/en/api/packages/datastructure/stack.html#Data","368":"/en/api/packages/datastructure/stack.html#Size","369":"/en/api/packages/datastructure/stack.html#IsEmpty","370":"/en/api/packages/datastructure/stack.html#Clear","371":"/en/api/packages/datastructure/stack.html#_2-LinkedStack-1","372":"/en/api/packages/datastructure/stack.html#NewLinkedStack","373":"/en/api/packages/datastructure/stack.html#Push-1","374":"/en/api/packages/datastructure/stack.html#Pop-1","375":"/en/api/packages/datastructure/stack.html#Peak-1","376":"/en/api/packages/datastructure/stack.html#Data-1","377":"/en/api/packages/datastructure/stack.html#Size-1","378":"/en/api/packages/datastructure/stack.html#IsEmpty-1","379":"/en/api/packages/datastructure/stack.html#Clear-1","380":"/en/api/packages/datastructure/stack.html#Print","381":"/en/api/packages/datastructure/tree.html#Tree","382":"/en/api/packages/datastructure/tree.html#Source","383":"/en/api/packages/datastructure/tree.html#Usage","384":"/en/api/packages/datastructure/tree.html#Index","385":"/en/api/packages/datastructure/tree.html#_1-BSTree","386":"/en/api/packages/datastructure/tree.html#Documentation","387":"/en/api/packages/datastructure/tree.html#_1-BSTree-1","388":"/en/api/packages/datastructure/tree.html#NewBSTree","389":"/en/api/packages/datastructure/tree.html#Insert","390":"/en/api/packages/datastructure/tree.html#Delete","391":"/en/api/packages/datastructure/tree.html#PreOrderTraverse","392":"/en/api/packages/datastructure/tree.html#InOrderTraverse","393":"/en/api/packages/datastructure/tree.html#PostOrderTraverse","394":"/en/api/packages/datastructure/tree.html#LevelOrderTraverse","395":"/en/api/packages/datastructure/tree.html#Depth","396":"/en/api/packages/datastructure/tree.html#HasSubTree","397":"/en/api/packages/datastructure/tree.html#Print","398":"/en/api/packages/datetime.html#Datetime","399":"/en/api/packages/datetime.html#Source-","400":"/en/api/packages/datetime.html#Usage-","401":"/en/api/packages/datetime.html#Index","402":"/en/api/packages/datetime.html#Documentation","403":"/en/api/packages/datetime.html#Note-","404":"/en/api/packages/datetime.html#AddDay","405":"/en/api/packages/datetime.html#AddHour","406":"/en/api/packages/datetime.html#AddMinute","407":"/en/api/packages/datetime.html#AddYear","408":"/en/api/packages/datetime.html#BeginOfMinute","409":"/en/api/packages/datetime.html#BeginOfHour","410":"/en/api/packages/datetime.html#BeginOfDay","411":"/en/api/packages/datetime.html#BeginOfWeek","412":"/en/api/packages/datetime.html#BeginOfMonth","413":"/en/api/packages/datetime.html#BeginOfYear","414":"/en/api/packages/datetime.html#EndOfMinute","415":"/en/api/packages/datetime.html#EndOfHour","416":"/en/api/packages/datetime.html#EndOfDay","417":"/en/api/packages/datetime.html#EndOfWeek","418":"/en/api/packages/datetime.html#EndOfMonth","419":"/en/api/packages/datetime.html#EndOfYear","420":"/en/api/packages/datetime.html#GetNowDate","421":"/en/api/packages/datetime.html#GetNowTime","422":"/en/api/packages/datetime.html#GetNowDateTime","423":"/en/api/packages/datetime.html#GetTodayStartTime","424":"/en/api/packages/datetime.html#GetTodayEndTime","425":"/en/api/packages/datetime.html#GetZeroHourTimestamp","426":"/en/api/packages/datetime.html#GetNightTimestamp","427":"/en/api/packages/datetime.html#FormatTimeToStr","428":"/en/api/packages/datetime.html#FormatStrToTime","429":"/en/api/packages/datetime.html#NewUnixNow","430":"/en/api/packages/datetime.html#NewUnix","431":"/en/api/packages/datetime.html#NewFormat","432":"/en/api/packages/datetime.html#NewISO8601","433":"/en/api/packages/datetime.html#ToUnix","434":"/en/api/packages/datetime.html#ToFormat","435":"/en/api/packages/datetime.html#ToFormatForTpl","436":"/en/api/packages/datetime.html#ToIso8601","437":"/en/api/packages/datetime.html#IsLeapYear","438":"/en/api/packages/datetime.html#BetweenSeconds","439":"/en/api/packages/datetime.html#DayOfYear","440":"/en/api/packages/datetime.html#IsWeekend-Deprecated-Use-Weekday-instead-","441":"/en/api/packages/datetime.html#NowDateOrTime","442":"/en/api/packages/datetime.html#Timestamp","443":"/en/api/packages/datetime.html#TimestampMilli","444":"/en/api/packages/datetime.html#TimestampMicro","445":"/en/api/packages/datetime.html#TimestampNano","446":"/en/api/packages/fileutil.html#Fileutil","447":"/en/api/packages/fileutil.html#Source-","448":"/en/api/packages/fileutil.html#Usage-","449":"/en/api/packages/fileutil.html#Index","450":"/en/api/packages/fileutil.html#Documentation","451":"/en/api/packages/fileutil.html#ClearFile","452":"/en/api/packages/fileutil.html#CreateFile","453":"/en/api/packages/fileutil.html#CreateDir","454":"/en/api/packages/fileutil.html#CopyFile","455":"/en/api/packages/fileutil.html#CurrentPath","456":"/en/api/packages/fileutil.html#FileMode","457":"/en/api/packages/fileutil.html#MiMeType","458":"/en/api/packages/fileutil.html#IsExist","459":"/en/api/packages/fileutil.html#IsLink","460":"/en/api/packages/fileutil.html#IsDir","461":"/en/api/packages/fileutil.html#ListFileNames","462":"/en/api/packages/fileutil.html#RemoveFile","463":"/en/api/packages/fileutil.html#ReadFileToString","464":"/en/api/packages/fileutil.html#ReadFileByLine","465":"/en/api/packages/fileutil.html#Zip","466":"/en/api/packages/fileutil.html#ZipAppendEntry","467":"/en/api/packages/fileutil.html#UnZip","468":"/en/api/packages/fileutil.html#IsZipFile","469":"/en/api/packages/fileutil.html#FileSize","470":"/en/api/packages/fileutil.html#MTime","471":"/en/api/packages/fileutil.html#Sha","472":"/en/api/packages/fileutil.html#ReadCsvFile","473":"/en/api/packages/fileutil.html#WriteCsvFile","474":"/en/api/packages/fileutil.html#WriteBytesToFile","475":"/en/api/packages/fileutil.html#WriteStringToFile","476":"/en/api/packages/formatter.html#Formatter","477":"/en/api/packages/formatter.html#Source-","478":"/en/api/packages/formatter.html#Usage-","479":"/en/api/packages/formatter.html#Index","480":"/en/api/packages/formatter.html#Documentation","481":"/en/api/packages/formatter.html#Comma","482":"/en/api/packages/formatter.html#Pretty","483":"/en/api/packages/formatter.html#PrettyToWriter","484":"/en/api/packages/formatter.html#DecimalBytes","485":"/en/api/packages/formatter.html#BinaryBytes","486":"/en/api/packages/formatter.html#ParseDecimalBytes","487":"/en/api/packages/formatter.html#ParseBinaryBytes","488":"/en/api/packages/function.html#Function","489":"/en/api/packages/function.html#Source-","490":"/en/api/packages/function.html#Usage-","491":"/en/api/packages/function.html#Index","492":"/en/api/packages/function.html#Documentation","493":"/en/api/packages/function.html#After","494":"/en/api/packages/function.html#Before","495":"/en/api/packages/function.html#CurryFn","496":"/en/api/packages/function.html#Compose","497":"/en/api/packages/function.html#Debounced","498":"/en/api/packages/function.html#Delay","499":"/en/api/packages/function.html#Schedule","500":"/en/api/packages/function.html#Pipeline","501":"/en/api/packages/function.html#Watcher","502":"/en/api/packages/maputil.html#Maputil","503":"/en/api/packages/maputil.html#Source-","504":"/en/api/packages/maputil.html#Example-","505":"/en/api/packages/maputil.html#Index","506":"/en/api/packages/maputil.html#Documentation","507":"/en/api/packages/maputil.html#MapTo","508":"/en/api/packages/maputil.html#ForEach","509":"/en/api/packages/maputil.html#Filter","510":"/en/api/packages/maputil.html#FilterByKeys","511":"/en/api/packages/maputil.html#FilterByValues","512":"/en/api/packages/maputil.html#OmitBy","513":"/en/api/packages/maputil.html#OmitByKeys","514":"/en/api/packages/maputil.html#OmitByValues","515":"/en/api/packages/maputil.html#Intersect","516":"/en/api/packages/maputil.html#Keys","517":"/en/api/packages/maputil.html#Merge","518":"/en/api/packages/maputil.html#Minus","519":"/en/api/packages/maputil.html#Values","520":"/en/api/packages/maputil.html#KeysBy","521":"/en/api/packages/maputil.html#ValuesBy","522":"/en/api/packages/maputil.html#MapKeys","523":"/en/api/packages/maputil.html#MapValues","524":"/en/api/packages/maputil.html#Entry","525":"/en/api/packages/maputil.html#FromEntries","526":"/en/api/packages/maputil.html#Transform","527":"/en/api/packages/maputil.html#IsDisjoint","528":"/en/api/packages/maputil.html#HasKey","529":"/en/api/packages/maputil.html#NewConcurrentMap","530":"/en/api/packages/maputil.html#ConcurrentMap-Set","531":"/en/api/packages/maputil.html#ConcurrentMap-Get","532":"/en/api/packages/maputil.html#ConcurrentMap-GetOrSet","533":"/en/api/packages/maputil.html#ConcurrentMap-Delete","534":"/en/api/packages/maputil.html#ConcurrentMap-GetAndDelete","535":"/en/api/packages/maputil.html#ConcurrentMap-Has","536":"/en/api/packages/maputil.html#ConcurrentMap-Range","537":"/en/api/packages/mathutil.html#Mathutil","538":"/en/api/packages/mathutil.html#Source-","539":"/en/api/packages/mathutil.html#Example-","540":"/en/api/packages/mathutil.html#Index","541":"/en/api/packages/mathutil.html#Documentation","542":"/en/api/packages/mathutil.html#Average","543":"/en/api/packages/mathutil.html#Exponent","544":"/en/api/packages/mathutil.html#Fibonacci","545":"/en/api/packages/mathutil.html#Factorial","546":"/en/api/packages/mathutil.html#Max","547":"/en/api/packages/mathutil.html#MaxBy","548":"/en/api/packages/mathutil.html#Min","549":"/en/api/packages/mathutil.html#MinBy","550":"/en/api/packages/mathutil.html#Percent","551":"/en/api/packages/mathutil.html#RoundToFloat","552":"/en/api/packages/mathutil.html#RoundToString","553":"/en/api/packages/mathutil.html#TruncRound","554":"/en/api/packages/mathutil.html#Range","555":"/en/api/packages/mathutil.html#RangeWithStep","556":"/en/api/packages/mathutil.html#AngleToRadian","557":"/en/api/packages/mathutil.html#RadianToAngle","558":"/en/api/packages/mathutil.html#PointDistance","559":"/en/api/packages/mathutil.html#IsPrime","560":"/en/api/packages/mathutil.html#GCD","561":"/en/api/packages/mathutil.html#LCM","562":"/en/api/packages/mathutil.html#Cos","563":"/en/api/packages/mathutil.html#Sin","564":"/en/api/packages/mathutil.html#Log","565":"/en/api/packages/mathutil.html#Sum","566":"/en/api/packages/mathutil.html#Abs","567":"/en/api/packages/netutil.html#Netutil","568":"/en/api/packages/netutil.html#Source-","569":"/en/api/packages/netutil.html#Usage-","570":"/en/api/packages/netutil.html#Index","571":"/en/api/packages/netutil.html#Documentation","572":"/en/api/packages/netutil.html#ConvertMapToQueryString","573":"/en/api/packages/netutil.html#EncodeUrl","574":"/en/api/packages/netutil.html#GetInternalIp","575":"/en/api/packages/netutil.html#GetIps","576":"/en/api/packages/netutil.html#GetMacAddrs","577":"/en/api/packages/netutil.html#GetPublicIpInfo","578":"/en/api/packages/netutil.html#GetRequestPublicIp","579":"/en/api/packages/netutil.html#IsPublicIP","580":"/en/api/packages/netutil.html#IsInternalIP","581":"/en/api/packages/netutil.html#HttpRequest","582":"/en/api/packages/netutil.html#HttpClient","583":"/en/api/packages/netutil.html#SendRequest","584":"/en/api/packages/netutil.html#DecodeResponse","585":"/en/api/packages/netutil.html#StructToUrlValues","586":"/en/api/packages/netutil.html#HttpGet","587":"/en/api/packages/netutil.html#HttpPost","588":"/en/api/packages/netutil.html#HttpPut","589":"/en/api/packages/netutil.html#HttpDelete","590":"/en/api/packages/netutil.html#HttpPatch","591":"/en/api/packages/netutil.html#ParseHttpResponse","592":"/en/api/packages/netutil.html#DownloadFile","593":"/en/api/packages/netutil.html#UploadFile","594":"/en/api/packages/netutil.html#IsPingConnected","595":"/en/api/packages/netutil.html#IsTelnetConnected","596":"/en/api/packages/pointer.html#Pointer","597":"/en/api/packages/pointer.html#Source-","598":"/en/api/packages/pointer.html#Usage-","599":"/en/api/packages/pointer.html#Index","600":"/en/api/packages/pointer.html#Documentation","601":"/en/api/packages/pointer.html#Of","602":"/en/api/packages/pointer.html#Unwrap","603":"/en/api/packages/pointer.html#UnwarpOr","604":"/en/api/packages/pointer.html#UnwarpOrDefault","605":"/en/api/packages/pointer.html#ExtractPointer","606":"/en/api/packages/random.html#Random","607":"/en/api/packages/random.html#Source-","608":"/en/api/packages/random.html#Usage-","609":"/en/api/packages/random.html#Index","610":"/en/api/packages/random.html#Documentation","611":"/en/api/packages/random.html#RandBytes","612":"/en/api/packages/random.html#RandInt","613":"/en/api/packages/random.html#RandString","614":"/en/api/packages/random.html#RandUpper","615":"/en/api/packages/random.html#RandLower","616":"/en/api/packages/random.html#RandNumeral","617":"/en/api/packages/random.html#RandNumeralOrLetter","618":"/en/api/packages/random.html#UUIdV4","619":"/en/api/packages/random.html#RandUniqueIntSlice","620":"/en/api/packages/retry.html#Retry","621":"/en/api/packages/retry.html#Source-","622":"/en/api/packages/retry.html#Usage-","623":"/en/api/packages/retry.html#Index","624":"/en/api/packages/retry.html#Documentation","625":"/en/api/packages/retry.html#Context","626":"/en/api/packages/retry.html#RetryFunc","627":"/en/api/packages/retry.html#RetryTimes","628":"/en/api/packages/retry.html#RetryDuration","629":"/en/api/packages/retry.html#Retry-1","630":"/en/api/packages/slice.html#Slice","631":"/en/api/packages/slice.html#Source-","632":"/en/api/packages/slice.html#Usage-","633":"/en/api/packages/slice.html#Index","634":"/en/api/packages/slice.html#Documentation","635":"/en/api/packages/slice.html#AppendIfAbsent","636":"/en/api/packages/slice.html#Contain","637":"/en/api/packages/slice.html#ContainBy","638":"/en/api/packages/slice.html#ContainSubSlice","639":"/en/api/packages/slice.html#Chunk","640":"/en/api/packages/slice.html#Compact","641":"/en/api/packages/slice.html#Concat","642":"/en/api/packages/slice.html#Count","643":"/en/api/packages/slice.html#CountBy","644":"/en/api/packages/slice.html#Difference","645":"/en/api/packages/slice.html#DifferenceBy","646":"/en/api/packages/slice.html#DifferenceWith","647":"/en/api/packages/slice.html#DeleteAt","648":"/en/api/packages/slice.html#Drop","649":"/en/api/packages/slice.html#DropRight","650":"/en/api/packages/slice.html#DropWhile","651":"/en/api/packages/slice.html#DropRightWhile","652":"/en/api/packages/slice.html#Equal","653":"/en/api/packages/slice.html#EqualWith","654":"/en/api/packages/slice.html#Every","655":"/en/api/packages/slice.html#Filter","656":"/en/api/packages/slice.html#Find-deprecated-use-FindBy-","657":"/en/api/packages/slice.html#FindBy","658":"/en/api/packages/slice.html#FindLast-deprecated-use-FindLastBy-","659":"/en/api/packages/slice.html#FindLastBy","660":"/en/api/packages/slice.html#Flatten","661":"/en/api/packages/slice.html#FlattenDeep","662":"/en/api/packages/slice.html#ForEach","663":"/en/api/packages/slice.html#ForEachWithBreak","664":"/en/api/packages/slice.html#GroupBy","665":"/en/api/packages/slice.html#GroupWith","666":"/en/api/packages/slice.html#IntSlice-Deprecated-use-generic-feature-of-go1-18-for-replacement-","667":"/en/api/packages/slice.html#InterfaceSlice-Deprecated-use-generic-feature-of-go1-18-for-replacement-","668":"/en/api/packages/slice.html#Intersection","669":"/en/api/packages/slice.html#InsertAt","670":"/en/api/packages/slice.html#IndexOf","671":"/en/api/packages/slice.html#LastIndexOf","672":"/en/api/packages/slice.html#Map","673":"/en/api/packages/slice.html#FilterMap","674":"/en/api/packages/slice.html#FlatMap","675":"/en/api/packages/slice.html#Merge","676":"/en/api/packages/slice.html#Reverse","677":"/en/api/packages/slice.html#Reduce","678":"/en/api/packages/slice.html#ReduceBy","679":"/en/api/packages/slice.html#ReduceRight","680":"/en/api/packages/slice.html#Replace","681":"/en/api/packages/slice.html#ReplaceAll","682":"/en/api/packages/slice.html#Repeat","683":"/en/api/packages/slice.html#Shuffle","684":"/en/api/packages/slice.html#IsAscending","685":"/en/api/packages/slice.html#IsDescending","686":"/en/api/packages/slice.html#IsSorted","687":"/en/api/packages/slice.html#IsSortedByKey","688":"/en/api/packages/slice.html#Sort","689":"/en/api/packages/slice.html#SortBy","690":"/en/api/packages/slice.html#SortByField-Deprecated-use-Sort-and-SortBy-for-replacement-","691":"/en/api/packages/slice.html#Some","692":"/en/api/packages/slice.html#StringSlice-Deprecated-use-generic-feature-of-go1-18-for-replacement-","693":"/en/api/packages/slice.html#SymmetricDifference","694":"/en/api/packages/slice.html#ToSlice","695":"/en/api/packages/slice.html#ToSlicePointer","696":"/en/api/packages/slice.html#Unique","697":"/en/api/packages/slice.html#UniqueBy","698":"/en/api/packages/slice.html#Union","699":"/en/api/packages/slice.html#UnionBy","700":"/en/api/packages/slice.html#UpdateAt","701":"/en/api/packages/slice.html#Without","702":"/en/api/packages/slice.html#KeyBy","703":"/en/api/packages/slice.html#Join","704":"/en/api/packages/stream.html#Stream","705":"/en/api/packages/stream.html#Source-","706":"/en/api/packages/stream.html#Usage-","707":"/en/api/packages/stream.html#Index","708":"/en/api/packages/stream.html#Documentation","709":"/en/api/packages/stream.html#Of","710":"/en/api/packages/stream.html#FromSlice","711":"/en/api/packages/stream.html#FromChannel","712":"/en/api/packages/stream.html#FromRange","713":"/en/api/packages/stream.html#Generate","714":"/en/api/packages/stream.html#Concat","715":"/en/api/packages/stream.html#Distinct","716":"/en/api/packages/stream.html#Filter","717":"/en/api/packages/stream.html#Map","718":"/en/api/packages/stream.html#Peek","719":"/en/api/packages/stream.html#Skip","720":"/en/api/packages/stream.html#Limit","721":"/en/api/packages/stream.html#Reverse","722":"/en/api/packages/stream.html#Range","723":"/en/api/packages/stream.html#Sorted","724":"/en/api/packages/stream.html#ForEach","725":"/en/api/packages/stream.html#Reduce","726":"/en/api/packages/stream.html#FindFirst","727":"/en/api/packages/stream.html#FindLast","728":"/en/api/packages/stream.html#Max","729":"/en/api/packages/stream.html#Min","730":"/en/api/packages/stream.html#AllMatch","731":"/en/api/packages/stream.html#AnyMatch","732":"/en/api/packages/stream.html#NoneMatch","733":"/en/api/packages/stream.html#Count","734":"/en/api/packages/stream.html#ToSlice","735":"/en/api/packages/struct.html#Structs","736":"/en/api/packages/struct.html#Source-","737":"/en/api/packages/struct.html#Usage-","738":"/en/api/packages/struct.html#Index-","739":"/en/api/packages/struct.html#Documentation-","740":"/en/api/packages/struct.html#New","741":"/en/api/packages/struct.html#ToMap","742":"/en/api/packages/struct.html#Fields","743":"/en/api/packages/struct.html#Field","744":"/en/api/packages/struct.html#IsStruct","745":"/en/api/packages/struct.html#Tag","746":"/en/api/packages/struct.html#Value","747":"/en/api/packages/struct.html#IsEmbedded","748":"/en/api/packages/struct.html#IsExported","749":"/en/api/packages/struct.html#IsZero","750":"/en/api/packages/struct.html#Name","751":"/en/api/packages/struct.html#Kind","752":"/en/api/packages/struct.html#IsSlice","753":"/en/api/packages/strutil.html#Strutil","754":"/en/api/packages/strutil.html#Source-","755":"/en/api/packages/strutil.html#Usage-","756":"/en/api/packages/strutil.html#Index","757":"/en/api/packages/strutil.html#Documentation","758":"/en/api/packages/strutil.html#After","759":"/en/api/packages/strutil.html#AfterLast","760":"/en/api/packages/strutil.html#Before","761":"/en/api/packages/strutil.html#BeforeLast","762":"/en/api/packages/strutil.html#CamelCase","763":"/en/api/packages/strutil.html#KebabCase","764":"/en/api/packages/strutil.html#UpperKebabCase","765":"/en/api/packages/strutil.html#Capitalize","766":"/en/api/packages/strutil.html#IsString","767":"/en/api/packages/strutil.html#LowerFirst","768":"/en/api/packages/strutil.html#UpperFirst","769":"/en/api/packages/strutil.html#Pad","770":"/en/api/packages/strutil.html#PadEnd","771":"/en/api/packages/strutil.html#PadStart","772":"/en/api/packages/strutil.html#Reverse","773":"/en/api/packages/strutil.html#SnakeCase","774":"/en/api/packages/strutil.html#UpperSnakeCase","775":"/en/api/packages/strutil.html#SplitEx","776":"/en/api/packages/strutil.html#Substring","777":"/en/api/packages/strutil.html#Wrap","778":"/en/api/packages/strutil.html#Unwrap","779":"/en/api/packages/strutil.html#SplitWords","780":"/en/api/packages/strutil.html#WordCount","781":"/en/api/packages/strutil.html#RemoveNonPrintable","782":"/en/api/packages/strutil.html#StringToBytes","783":"/en/api/packages/strutil.html#BytesToString","784":"/en/api/packages/strutil.html#IsBlank","785":"/en/api/packages/strutil.html#HasPrefixAny","786":"/en/api/packages/strutil.html#HasSuffixAny","787":"/en/api/packages/strutil.html#IndexOffset","788":"/en/api/packages/strutil.html#ReplaceWithMap","789":"/en/api/packages/strutil.html#Trim","790":"/en/api/packages/strutil.html#SplitAndTrim","791":"/en/api/packages/strutil.html#HideString","792":"/en/api/packages/strutil.html#ContainsAll","793":"/en/api/packages/strutil.html#ContainsAny","794":"/en/api/packages/strutil.html#RemoveWhiteSpace","795":"/en/api/packages/system.html#System","796":"/en/api/packages/system.html#Source-","797":"/en/api/packages/system.html#Usage-","798":"/en/api/packages/system.html#Index","799":"/en/api/packages/system.html#Documentation","800":"/en/api/packages/system.html#IsWindows","801":"/en/api/packages/system.html#IsLinux","802":"/en/api/packages/system.html#IsMac","803":"/en/api/packages/system.html#GetOsEnv","804":"/en/api/packages/system.html#SetOsEnv","805":"/en/api/packages/system.html#RemoveOsEnv","806":"/en/api/packages/system.html#CompareOsEnv","807":"/en/api/packages/system.html#ExecCommand","808":"/en/api/packages/system.html#GetOsBits","809":"/en/api/packages/tuple.html#Tuple","810":"/en/api/packages/tuple.html#Source-","811":"/en/api/packages/tuple.html#Usage-","812":"/en/api/packages/tuple.html#Index","813":"/en/api/packages/tuple.html#Documentation","814":"/en/api/packages/tuple.html#Tuple2","815":"/en/api/packages/tuple.html#Tuple2-Unbox","816":"/en/api/packages/tuple.html#Zip2","817":"/en/api/packages/tuple.html#Unzip2","818":"/en/api/packages/tuple.html#Tuple3","819":"/en/api/packages/tuple.html#Tuple3-Unbox","820":"/en/api/packages/tuple.html#Zip3","821":"/en/api/packages/tuple.html#Unzip3","822":"/en/api/packages/tuple.html#Tuple4","823":"/en/api/packages/tuple.html#Tuple4-Unbox","824":"/en/api/packages/tuple.html#Zip4","825":"/en/api/packages/tuple.html#Unzip4","826":"/en/api/packages/tuple.html#Tuple5","827":"/en/api/packages/tuple.html#Tuple5-Unbox","828":"/en/api/packages/tuple.html#Zip5","829":"/en/api/packages/tuple.html#Unzip5","830":"/en/api/packages/tuple.html#Tuple6","831":"/en/api/packages/tuple.html#Tuple6-Unbox","832":"/en/api/packages/tuple.html#Zip6","833":"/en/api/packages/tuple.html#Unzip6","834":"/en/api/packages/tuple.html#Tuple7","835":"/en/api/packages/tuple.html#Tuple7-Unbox","836":"/en/api/packages/tuple.html#Zip7","837":"/en/api/packages/tuple.html#Unzip7","838":"/en/api/packages/tuple.html#Tuple8","839":"/en/api/packages/tuple.html#Tuple8-Unbox","840":"/en/api/packages/tuple.html#Zip8","841":"/en/api/packages/tuple.html#Unzip8","842":"/en/api/packages/tuple.html#Tuple9","843":"/en/api/packages/tuple.html#Tuple9-Unbox","844":"/en/api/packages/tuple.html#Zip9","845":"/en/api/packages/tuple.html#Unzip9","846":"/en/api/packages/tuple.html#Tuple10","847":"/en/api/packages/tuple.html#Tuple10-Unbox","848":"/en/api/packages/tuple.html#Zip10","849":"/en/api/packages/tuple.html#Unzip10","850":"/en/api/packages/validator.html#Validator","851":"/en/api/packages/validator.html#Source-","852":"/en/api/packages/validator.html#Usage-","853":"/en/api/packages/validator.html#Index","854":"/en/api/packages/validator.html#Documentation","855":"/en/api/packages/validator.html#ContainChinese","856":"/en/api/packages/validator.html#ContainLetter","857":"/en/api/packages/validator.html#ContainLower","858":"/en/api/packages/validator.html#ContainUpper","859":"/en/api/packages/validator.html#IsAlpha","860":"/en/api/packages/validator.html#IsAllUpper","861":"/en/api/packages/validator.html#IsAllLower","862":"/en/api/packages/validator.html#IsASCII","863":"/en/api/packages/validator.html#IsBase64","864":"/en/api/packages/validator.html#IsChineseMobile","865":"/en/api/packages/validator.html#IsChineseIdNum","866":"/en/api/packages/validator.html#IsChinesePhone","867":"/en/api/packages/validator.html#IsCreditCard","868":"/en/api/packages/validator.html#IsDns","869":"/en/api/packages/validator.html#IsEmail","870":"/en/api/packages/validator.html#IsEmptyString","871":"/en/api/packages/validator.html#IsInt","872":"/en/api/packages/validator.html#IsFloat","873":"/en/api/packages/validator.html#IsNumber","874":"/en/api/packages/validator.html#IsIntStr","875":"/en/api/packages/validator.html#IsFloatStr","876":"/en/api/packages/validator.html#IsNumberStr","877":"/en/api/packages/validator.html#IsJSON","878":"/en/api/packages/validator.html#IsRegexMatch","879":"/en/api/packages/validator.html#IsIp","880":"/en/api/packages/validator.html#IsIpV4","881":"/en/api/packages/validator.html#IsIpV6","882":"/en/api/packages/validator.html#IsStrongPassword","883":"/en/api/packages/validator.html#IsUrl","884":"/en/api/packages/validator.html#IsWeakPassword","885":"/en/api/packages/validator.html#IsZeroValue","886":"/en/api/packages/validator.html#IsGBK","887":"/en/api/packages/validator.html#IsPrintable","888":"/en/api/packages/xerror.html#Xerror","889":"/en/api/packages/xerror.html#Source-","890":"/en/api/packages/xerror.html#Usage-","891":"/en/api/packages/xerror.html#Index","892":"/en/api/packages/xerror.html#Documentation","893":"/en/api/packages/xerror.html#New","894":"/en/api/packages/xerror.html#Wrap","895":"/en/api/packages/xerror.html#Unwrap","896":"/en/api/packages/xerror.html#XError-Wrap","897":"/en/api/packages/xerror.html#XError-Unwrap","898":"/en/api/packages/xerror.html#XError-With","899":"/en/api/packages/xerror.html#XError-Id","900":"/en/api/packages/xerror.html#XError-Is","901":"/en/api/packages/xerror.html#XError-Values","902":"/en/api/packages/xerror.html#XError-StackTrace","903":"/en/api/packages/xerror.html#XError-Info","904":"/en/api/packages/xerror.html#XError-Error","905":"/en/api/packages/xerror.html#TryUnwrap","906":"/en/guide/getting_started.html#Installation","907":"/en/guide/getting_started.html#Usage","908":"/en/guide/getting_started.html#Example","909":"/en/guide/getting_started.html#More","910":"/en/guide/introduction.html#What-is-lancet-","911":"/en/guide/introduction.html#Why-lancet-"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,60],"1":[1,1,9],"2":[1,1,15],"3":[1,1,11],"4":[1,1,13],"5":[1,1,1],"6":[1,2,61],"7":[1,2,76],"8":[1,2,61],"9":[1,2,61],"10":[1,2,61],"11":[1,2,61],"12":[1,2,61],"13":[1,2,63],"14":[1,2,82],"15":[1,2,82],"16":[1,2,58],"17":[1,2,57],"18":[1,1,11],"19":[2,1,12],"20":[2,1,11],"21":[1,1,8],"22":[1,1,1],"23":[1,2,59],"24":[1,2,49],"25":[1,2,54],"26":[1,2,56],"27":[1,2,56],"28":[1,2,58],"29":[1,2,65],"30":[1,1,13],"31":[2,1,12],"32":[2,1,11],"33":[1,1,1],"34":[1,2,11],"35":[1,1,1],"36":[1,1,1],"37":[1,2,32],"38":[1,2,64],"39":[1,2,58],"40":[1,2,54],"41":[1,2,50],"42":[1,2,59],"43":[1,2,63],"44":[1,2,54],"45":[1,2,63],"46":[1,2,56],"47":[1,1,32],"48":[2,1,11],"49":[2,1,11],"50":[1,1,9],"51":[1,1,1],"52":[1,2,82],"53":[1,2,38],"54":[1,2,38],"55":[1,2,40],"56":[1,2,38],"57":[1,2,41],"58":[1,2,38],"59":[1,2,49],"60":[1,1,10],"61":[2,1,11],"62":[2,1,11],"63":[1,1,22],"64":[1,1,1],"65":[1,2,41],"66":[1,2,42],"67":[1,2,47],"68":[1,2,39],"69":[1,2,40],"70":[1,2,46],"71":[1,2,56],"72":[1,2,55],"73":[1,2,55],"74":[1,2,56],"75":[1,2,34],"76":[1,2,59],"77":[1,2,52],"78":[1,2,52],"79":[1,2,39],"80":[1,2,54],"81":[1,2,72],"82":[1,2,105],"83":[1,2,43],"84":[1,2,39],"85":[1,2,39],"86":[1,1,18],"87":[2,1,13],"88":[2,1,11],"89":[1,1,43],"90":[1,1,1],"91":[1,2,49],"92":[1,2,49],"93":[1,2,49],"94":[1,2,49],"95":[1,2,49],"96":[1,2,49],"97":[1,2,49],"98":[1,2,49],"99":[1,2,50],"100":[1,2,33],"101":[1,2,33],"102":[1,2,46],"103":[1,2,46],"104":[1,2,46],"105":[1,2,46],"106":[1,2,47],"107":[1,2,46],"108":[1,2,46],"109":[1,2,46],"110":[1,2,46],"111":[1,2,37],"112":[1,2,38],"113":[1,2,37],"114":[1,2,42],"115":[1,2,37],"116":[1,2,40],"117":[1,2,37],"118":[1,2,47],"119":[1,2,35],"120":[1,2,38],"121":[1,2,38],"122":[1,2,39],"123":[1,2,32],"124":[1,2,34],"125":[1,2,41],"126":[1,2,34],"127":[1,2,40],"128":[1,2,34],"129":[1,2,39],"130":[1,2,45],"131":[1,2,49],"132":[1,2,49],"133":[1,1,30],"134":[1,1,13],"135":[1,1,11],"136":[1,1,19],"137":[1,1,1],"138":[1,2,17],"139":[1,3,24],"140":[1,2,12],"141":[1,3,24],"142":[1,2,17],"143":[1,3,24],"144":[1,2,23],"145":[1,3,25],"146":[1,2,1],"147":[1,2,21],"148":[1,3,24],"149":[1,2,27],"150":[1,3,24],"151":[1,2,18],"152":[1,3,21],"153":[1,2,15],"154":[1,3,24],"155":[1,2,18],"156":[1,3,24],"157":[1,2,17],"158":[1,3,28],"159":[1,2,20],"160":[1,3,28],"161":[1,2,19],"162":[1,3,26],"163":[1,2,21],"164":[1,3,25],"165":[1,2,23],"166":[1,3,30],"167":[1,2,22],"168":[1,3,27],"169":[1,2,25],"170":[1,3,31],"171":[1,2,20],"172":[1,3,31],"173":[1,1,9],"174":[1,1,12],"175":[1,1,12],"176":[1,1,10],"177":[1,1,1],"178":[1,2,36],"179":[1,2,37],"180":[1,2,37],"181":[1,2,38],"182":[1,2,39],"183":[1,2,43],"184":[1,2,44],"185":[1,2,44],"186":[1,2,44],"187":[1,1,10],"188":[1,1,13],"189":[1,1,12],"190":[1,1,7],"191":[1,1,1],"192":[2,2,27],"193":[1,2,57],"194":[1,2,70],"195":[1,2,83],"196":[1,2,86],"197":[1,2,73],"198":[1,2,67],"199":[1,2,72],"200":[1,1,17],"201":[1,1,14],"202":[1,1,12],"203":[1,1,1],"204":[2,2,16],"205":[2,2,15],"206":[1,1,1],"207":[2,2,17],"208":[1,2,38],"209":[1,2,42],"210":[1,2,52],"211":[1,2,40],"212":[1,2,40],"213":[1,2,44],"214":[1,2,41],"215":[1,2,40],"216":[1,2,39],"217":[1,2,37],"218":[1,2,42],"219":[1,2,39],"220":[1,2,42],"221":[1,2,40],"222":[1,2,45],"223":[2,2,20],"224":[1,2,39],"225":[1,2,42],"226":[1,2,52],"227":[1,2,40],"228":[1,2,40],"229":[1,2,44],"230":[1,2,41],"231":[1,2,44],"232":[1,2,37],"233":[1,2,42],"234":[1,2,39],"235":[1,2,42],"236":[1,2,40],"237":[1,2,36],"238":[1,1,9],"239":[1,1,12],"240":[1,1,12],"241":[1,1,36],"242":[1,1,1],"243":[1,2,43],"244":[1,2,43],"245":[1,2,36],"246":[1,2,43],"247":[1,2,43],"248":[1,2,46],"249":[1,2,47],"250":[1,2,53],"251":[1,2,37],"252":[1,2,44],"253":[1,2,44],"254":[1,2,49],"255":[1,2,49],"256":[1,2,44],"257":[1,2,49],"258":[1,2,43],"259":[1,2,36],"260":[1,2,37],"261":[1,2,45],"262":[1,2,38],"263":[1,2,38],"264":[1,2,42],"265":[1,2,38],"266":[1,2,37],"267":[1,2,49],"268":[1,2,48],"269":[1,2,46],"270":[1,2,42],"271":[1,2,50],"272":[1,2,53],"273":[1,2,46],"274":[1,2,50],"275":[1,2,50],"276":[1,2,46],"277":[1,2,49],"278":[1,1,27],"279":[1,1,16],"280":[1,1,12],"281":[1,1,1],"282":[2,2,12],"283":[2,2,11],"284":[2,2,12],"285":[2,2,8],"286":[1,1,1],"287":[2,2,6],"288":[1,2,42],"289":[1,2,32],"290":[1,2,43],"291":[1,2,41],"292":[1,2,40],"293":[1,2,40],"294":[1,2,39],"295":[1,2,42],"296":[1,2,41],"297":[1,2,38],"298":[1,2,45],"299":[2,2,6],"300":[1,2,39],"301":[1,2,31],"302":[1,2,36],"303":[1,2,41],"304":[1,2,40],"305":[1,2,40],"306":[1,2,39],"307":[1,2,42],"308":[1,2,38],"309":[1,2,45],"310":[2,2,6],"311":[1,2,41],"312":[1,2,32],"313":[1,2,42],"314":[1,2,42],"315":[1,2,39],"316":[1,2,39],"317":[1,2,39],"318":[1,2,42],"319":[1,2,41],"320":[1,2,38],"321":[1,2,45],"322":[2,2,6],"323":[1,2,53],"324":[1,2,32],"325":[1,2,75],"326":[1,2,77],"327":[1,2,66],"328":[1,2,66],"329":[1,2,66],"330":[1,1,14],"331":[1,1,12],"332":[1,1,12],"333":[1,1,20],"334":[1,1,1],"335":[1,2,38],"336":[1,2,36],"337":[1,2,37],"338":[1,2,34],"339":[1,2,57],"340":[1,2,64],"341":[1,2,36],"342":[1,2,44],"343":[1,2,42],"344":[1,2,38],"345":[1,2,39],"346":[1,2,47],"347":[1,2,41],"348":[1,2,61],"349":[1,2,42],"350":[1,2,44],"351":[1,2,46],"352":[1,2,48],"353":[1,2,48],"354":[1,2,51],"355":[1,1,32],"356":[1,1,14],"357":[1,1,12],"358":[1,1,1],"359":[2,2,9],"360":[2,2,10],"361":[1,1,1],"362":[2,2,8],"363":[1,2,35],"364":[1,2,36],"365":[1,2,49],"366":[1,2,43],"367":[1,2,41],"368":[1,2,39],"369":[1,2,43],"370":[1,2,37],"371":[2,2,9],"372":[1,2,38],"373":[1,2,36],"374":[1,2,49],"375":[1,2,43],"376":[1,2,41],"377":[1,2,39],"378":[1,2,43],"379":[1,2,37],"380":[1,2,44],"381":[1,1,18],"382":[1,1,13],"383":[1,1,12],"384":[1,1,1],"385":[2,2,11],"386":[1,1,1],"387":[2,1,40],"388":[1,3,63],"389":[1,3,62],"390":[1,3,63],"391":[1,3,63],"392":[1,3,63],"393":[1,3,63],"394":[1,3,64],"395":[1,3,65],"396":[1,3,72],"397":[1,3,62],"398":[1,1,9],"399":[2,1,12],"400":[2,1,11],"401":[1,1,43],"402":[1,1,1],"403":[2,1,25],"404":[1,3,43],"405":[1,3,43],"406":[1,3,43],"407":[1,3,43],"408":[1,3,47],"409":[1,3,46],"410":[1,3,46],"411":[1,3,51],"412":[1,3,45],"413":[1,3,45],"414":[1,3,48],"415":[1,3,48],"416":[1,3,49],"417":[1,3,52],"418":[1,3,48],"419":[1,3,48],"420":[1,3,37],"421":[1,3,37],"422":[1,3,42],"423":[1,3,40],"424":[1,3,41],"425":[1,3,33],"426":[1,3,34],"427":[1,3,58],"428":[1,3,57],"429":[1,3,36],"430":[1,3,36],"431":[1,3,53],"432":[1,3,46],"433":[1,3,33],"434":[1,3,42],"435":[1,3,48],"436":[1,3,42],"437":[1,3,41],"438":[1,3,46],"439":[1,3,52],"440":[7,3,51],"441":[1,3,48],"442":[1,3,33],"443":[1,3,34],"444":[1,3,34],"445":[1,3,34],"446":[1,1,10],"447":[2,1,12],"448":[2,1,11],"449":[1,1,26],"450":[1,1,1],"451":[1,2,38],"452":[1,2,37],"453":[1,2,40],"454":[1,2,43],"455":[1,2,29],"456":[1,2,35],"457":[1,2,47],"458":[1,2,38],"459":[1,2,39],"460":[1,2,38],"461":[1,2,32],"462":[1,2,35],"463":[1,2,42],"464":[1,2,51],"465":[1,2,41],"466":[1,2,43],"467":[1,2,44],"468":[1,2,35],"469":[1,2,40],"470":[1,2,42],"471":[1,2,53],"472":[1,2,46],"473":[1,2,61],"474":[1,2,46],"475":[1,2,48],"476":[1,1,8],"477":[2,1,12],"478":[2,1,11],"479":[1,1,8],"480":[1,1,1],"481":[1,2,66],"482":[1,2,38],"483":[1,2,57],"484":[1,2,65],"485":[1,2,65],"486":[1,2,49],"487":[1,2,49],"488":[1,1,14],"489":[2,1,12],"490":[2,1,11],"491":[1,1,10],"492":[1,1,1],"493":[1,2,45],"494":[1,2,44],"495":[1,2,46],"496":[1,2,48],"497":[1,2,55],"498":[1,2,39],"499":[1,2,47],"500":[1,2,55],"501":[1,2,67],"502":[1,1,9],"503":[2,1,12],"504":[2,1,11],"505":[1,1,32],"506":[1,1,1],"507":[1,2,67],"508":[1,2,53],"509":[1,2,63],"510":[1,2,52],"511":[1,2,51],"512":[1,2,64],"513":[1,2,56],"514":[1,2,57],"515":[1,2,61],"516":[1,2,49],"517":[1,2,47],"518":[1,2,54],"519":[1,2,49],"520":[1,2,61],"521":[1,2,63],"522":[1,2,56],"523":[1,2,61],"524":[1,2,57],"525":[1,2,51],"526":[1,2,52],"527":[1,2,61],"528":[1,2,62],"529":[1,2,52],"530":[2,2,74],"531":[2,2,82],"532":[2,2,73],"533":[2,2,55],"534":[2,2,74],"535":[2,2,64],"536":[2,2,70],"537":[1,1,9],"538":[2,1,11],"539":[2,1,11],"540":[1,1,26],"541":[1,1,1],"542":[1,2,47],"543":[1,2,40],"544":[1,2,41],"545":[1,2,37],"546":[1,2,40],"547":[1,2,49],"548":[1,2,41],"549":[1,2,49],"550":[1,2,50],"551":[1,2,44],"552":[1,2,47],"553":[1,2,42],"554":[1,2,52],"555":[1,2,50],"556":[1,2,42],"557":[1,2,40],"558":[1,2,37],"559":[1,2,41],"560":[1,2,42],"561":[1,2,42],"562":[1,2,47],"563":[1,2,47],"564":[1,2,42],"565":[1,2,41],"566":[1,2,46],"567":[1,1,13],"568":[2,1,13],"569":[2,1,11],"570":[1,1,25],"571":[1,1,1],"572":[1,2,44],"573":[1,2,43],"574":[1,2,36],"575":[1,2,35],"576":[1,2,44],"577":[1,2,62],"578":[1,2,44],"579":[1,2,50],"580":[1,2,50],"581":[1,2,62],"582":[1,2,66],"583":[1,2,74],"584":[1,2,77],"585":[1,2,66],"586":[1,2,75],"587":[1,2,85],"588":[1,2,91],"589":[1,2,73],"590":[1,2,91],"591":[1,2,72],"592":[1,2,43],"593":[1,2,39],"594":[1,2,42],"595":[1,2,44],"596":[1,1,9],"597":[2,1,11],"598":[2,1,11],"599":[1,1,6],"600":[1,1,1],"601":[1,2,38],"602":[1,2,38],"603":[1,2,60],"604":[1,2,59],"605":[1,2,40],"606":[1,1,12],"607":[2,1,11],"608":[2,1,11],"609":[1,1,10],"610":[1,1,1],"611":[1,2,30],"612":[1,2,35],"613":[1,2,37],"614":[1,2,34],"615":[1,2,33],"616":[1,2,32],"617":[1,2,34],"618":[1,2,39],"619":[1,2,43],"620":[1,1,18],"621":[2,1,11],"622":[2,1,11],"623":[1,1,6],"624":[1,1,1],"625":[1,2,51],"626":[1,2,49],"627":[1,2,53],"628":[1,2,51],"629":[1,2,59],"630":[1,1,8],"631":[2,1,11],"632":[2,1,11],"633":[1,1,70],"634":[1,1,1],"635":[1,2,40],"636":[1,2,48],"637":[1,2,57],"638":[1,2,43],"639":[1,2,54],"640":[1,2,51],"641":[1,2,43],"642":[1,2,41],"643":[1,2,54],"644":[1,2,47],"645":[1,2,61],"646":[1,2,64],"647":[1,2,44],"648":[1,2,43],"649":[1,2,44],"650":[1,2,53],"651":[1,2,53],"652":[1,2,53],"653":[1,2,52],"654":[1,2,53],"655":[1,2,50],"656":[5,2,59],"657":[1,2,79],"658":[5,2,63],"659":[1,2,79],"660":[1,2,34],"661":[1,2,33],"662":[1,2,49],"663":[1,2,60],"664":[1,2,58],"665":[1,2,55],"666":[11,2,33],"667":[11,2,34],"668":[1,2,43],"669":[1,2,46],"670":[1,2,53],"671":[1,2,52],"672":[1,2,51],"673":[1,2,75],"674":[1,2,58],"675":[1,2,38],"676":[1,2,34],"677":[1,2,45],"678":[1,2,61],"679":[1,2,56],"680":[1,2,55],"681":[1,2,45],"682":[1,2,39],"683":[1,2,41],"684":[1,2,44],"685":[1,2,44],"686":[1,2,46],"687":[1,2,50],"688":[1,2,68],"689":[1,2,69],"690":[9,2,64],"691":[1,2,52],"692":[11,2,33],"693":[1,2,44],"694":[1,2,33],"695":[1,2,47],"696":[1,2,33],"697":[1,2,45],"698":[1,2,51],"699":[1,2,55],"700":[1,2,54],"701":[1,2,37],"702":[1,2,48],"703":[1,2,41],"704":[1,1,34],"705":[2,1,11],"706":[2,1,11],"707":[1,1,27],"708":[1,1,1],"709":[1,2,39],"710":[1,2,36],"711":[1,2,46],"712":[1,2,47],"713":[1,2,54],"714":[1,2,52],"715":[1,2,45],"716":[1,2,55],"717":[1,2,54],"718":[1,2,65],"719":[1,2,63],"720":[1,2,57],"721":[1,2,43],"722":[1,2,53],"723":[1,2,52],"724":[1,2,43],"725":[1,2,60],"726":[1,2,48],"727":[1,2,48],"728":[1,2,52],"729":[1,2,51],"730":[1,2,50],"731":[1,2,49],"732":[1,2,49],"733":[1,2,39],"734":[1,2,34],"735":[1,1,11],"736":[2,1,13],"737":[2,1,11],"738":[2,1,14],"739":[2,1,1],"740":[1,3,45],"741":[1,3,55],"742":[1,3,51],"743":[1,3,47],"744":[1,3,44],"745":[1,3,50],"746":[1,3,46],"747":[1,3,51],"748":[1,3,48],"749":[1,3,49],"750":[1,3,42],"751":[1,3,44],"752":[1,3,48],"753":[1,1,9],"754":[2,1,12],"755":[2,1,11],"756":[1,1,38],"757":[1,1,1],"758":[1,2,45],"759":[1,2,45],"760":[1,2,43],"761":[1,2,43],"762":[1,2,51],"763":[1,2,51],"764":[1,2,53],"765":[1,2,43],"766":[1,2,44],"767":[1,2,42],"768":[1,2,42],"769":[1,2,60],"770":[1,2,58],"771":[1,2,58],"772":[1,2,37],"773":[1,2,51],"774":[1,2,53],"775":[1,2,45],"776":[1,2,56],"777":[1,2,35],"778":[1,2,39],"779":[1,2,56],"780":[1,2,63],"781":[1,2,39],"782":[1,2,44],"783":[1,2,38],"784":[1,2,43],"785":[1,2,49],"786":[1,2,48],"787":[1,2,62],"788":[1,2,49],"789":[1,2,53],"790":[1,2,56],"791":[1,2,54],"792":[1,2,41],"793":[1,2,45],"794":[1,2,53],"795":[1,1,11],"796":[2,1,12],"797":[2,1,11],"798":[1,1,10],"799":[1,1,1],"800":[1,2,30],"801":[1,2,30],"802":[1,2,30],"803":[1,2,41],"804":[1,2,42],"805":[1,2,42],"806":[1,2,45],"807":[1,2,73],"808":[1,2,34],"809":[1,1,11],"810":[2,1,11],"811":[2,1,11],"812":[1,1,29],"813":[1,1,1],"814":[1,2,40],"815":[2,2,35],"816":[1,2,44],"817":[1,2,42],"818":[1,2,43],"819":[2,2,38],"820":[1,2,47],"821":[1,2,46],"822":[1,2,47],"823":[2,2,41],"824":[1,2,51],"825":[1,2,51],"826":[1,2,51],"827":[2,2,44],"828":[1,2,54],"829":[1,2,55],"830":[1,2,54],"831":[2,2,46],"832":[1,2,57],"833":[1,2,59],"834":[1,2,57],"835":[2,2,49],"836":[1,2,59],"837":[1,2,63],"838":[1,2,60],"839":[2,2,52],"840":[1,2,61],"841":[1,2,67],"842":[1,2,66],"843":[2,2,57],"844":[1,2,65],"845":[1,2,72],"846":[1,2,70],"847":[2,2,62],"848":[1,2,68],"849":[1,2,76],"850":[1,1,9],"851":[2,1,11],"852":[2,1,11],"853":[1,1,34],"854":[1,1,1],"855":[1,2,40],"856":[1,2,44],"857":[1,2,46],"858":[1,2,46],"859":[1,2,42],"860":[1,2,43],"861":[1,2,43],"862":[1,2,43],"863":[1,2,36],"864":[1,2,40],"865":[1,2,38],"866":[1,2,40],"867":[1,2,38],"868":[1,2,40],"869":[1,2,39],"870":[1,2,39],"871":[1,2,45],"872":[1,2,45],"873":[1,2,45],"874":[1,2,43],"875":[1,2,44],"876":[1,2,44],"877":[1,2,41],"878":[1,2,43],"879":[1,2,42],"880":[1,2,40],"881":[1,2,40],"882":[1,2,51],"883":[1,2,38],"884":[1,2,45],"885":[1,2,41],"886":[1,2,84],"887":[1,2,44],"888":[1,1,7],"889":[2,1,11],"890":[2,1,11],"891":[1,1,13],"892":[1,1,1],"893":[1,2,45],"894":[1,2,45],"895":[1,2,48],"896":[2,2,50],"897":[2,2,42],"898":[2,2,43],"899":[2,2,46],"900":[2,2,51],"901":[2,2,54],"902":[2,2,48],"903":[2,2,50],"904":[2,2,33],"905":[1,2,57],"906":[1,1,43],"907":[1,1,36],"908":[1,1,37],"909":[1,1,7],"910":[4,1,22],"911":[3,4,40]},"averageFieldLength":[1.165570175438594,1.9013157894736843,39.48793859649119],"storedFields":{"0":{"title":"API Overview","titles":[]},"1":{"title":"Algorithm","titles":[]},"2":{"title":"Source","titles":["Algorithm"]},"3":{"title":"Usage","titles":["Algorithm"]},"4":{"title":"Index","titles":["Algorithm"]},"5":{"title":"Documentation","titles":["Algorithm"]},"6":{"title":"BubbleSort","titles":["Algorithm","Documentation"]},"7":{"title":"InsertionSort","titles":["Algorithm","Documentation"]},"8":{"title":"SelectionSort","titles":["Algorithm","Documentation"]},"9":{"title":"ShellSort","titles":["Algorithm","Documentation"]},"10":{"title":"QuickSort","titles":["Algorithm","Documentation"]},"11":{"title":"HeapSort","titles":["Algorithm","Documentation"]},"12":{"title":"MergeSort","titles":["Algorithm","Documentation"]},"13":{"title":"CountSort","titles":["Algorithm","Documentation"]},"14":{"title":"BinarySearch","titles":["Algorithm","Documentation"]},"15":{"title":"BinaryIterativeSearch","titles":["Algorithm","Documentation"]},"16":{"title":"LinearSearch","titles":["Algorithm","Documentation"]},"17":{"title":"LRUCache","titles":["Algorithm","Documentation"]},"18":{"title":"Compare","titles":[]},"19":{"title":"Source:","titles":["Compare"]},"20":{"title":"Usage:","titles":["Compare"]},"21":{"title":"Index","titles":["Compare"]},"22":{"title":"Documentation","titles":["Compare"]},"23":{"title":"Equal","titles":["Compare","Documentation"]},"24":{"title":"EqualValue","titles":["Compare","Documentation"]},"25":{"title":"LessThan","titles":["Compare","Documentation"]},"26":{"title":"GreaterThan","titles":["Compare","Documentation"]},"27":{"title":"LessOrEqual","titles":["Compare","Documentation"]},"28":{"title":"GreaterOrEqual","titles":["Compare","Documentation"]},"29":{"title":"InDelta","titles":["Compare","Documentation"]},"30":{"title":"Concurrency","titles":[]},"31":{"title":"Source:","titles":["Concurrency"]},"32":{"title":"Usage:","titles":["Concurrency"]},"33":{"title":"Index","titles":["Concurrency"]},"34":{"title":"Channel","titles":["Concurrency","Index"]},"35":{"title":"Documentation","titles":["Concurrency"]},"36":{"title":"Channel","titles":["Concurrency"]},"37":{"title":"NewChannel","titles":["Concurrency","Channel"]},"38":{"title":"Bridge","titles":["Concurrency","Channel"]},"39":{"title":"FanIn","titles":["Concurrency","Channel"]},"40":{"title":"Repeat","titles":["Concurrency","Channel"]},"41":{"title":"Generate","titles":["Concurrency","Channel"]},"42":{"title":"RepeatFn","titles":["Concurrency","Channel"]},"43":{"title":"Or","titles":["Concurrency","Channel"]},"44":{"title":"OrDone","titles":["Concurrency","Channel"]},"45":{"title":"Take","titles":["Concurrency","Channel"]},"46":{"title":"Tee","titles":["Concurrency","Channel"]},"47":{"title":"Condition","titles":[]},"48":{"title":"Source:","titles":["Condition"]},"49":{"title":"Usage:","titles":["Condition"]},"50":{"title":"Index","titles":["Condition"]},"51":{"title":"Documentation","titles":["Condition"]},"52":{"title":"Bool","titles":["Condition","Documentation"]},"53":{"title":"And","titles":["Condition","Documentation"]},"54":{"title":"Or","titles":["Condition","Documentation"]},"55":{"title":"Xor","titles":["Condition","Documentation"]},"56":{"title":"Nor","titles":["Condition","Documentation"]},"57":{"title":"Xnor","titles":["Condition","Documentation"]},"58":{"title":"Nand","titles":["Condition","Documentation"]},"59":{"title":"TernaryOperator","titles":["Condition","Documentation"]},"60":{"title":"Convertor","titles":[]},"61":{"title":"Source:","titles":["Convertor"]},"62":{"title":"Usage:","titles":["Convertor"]},"63":{"title":"Index","titles":["Convertor"]},"64":{"title":"Documentation","titles":["Convertor"]},"65":{"title":"ColorHexToRGB","titles":["Convertor","Documentation"]},"66":{"title":"ColorRGBToHex","titles":["Convertor","Documentation"]},"67":{"title":"ToBool","titles":["Convertor","Documentation"]},"68":{"title":"ToBytes","titles":["Convertor","Documentation"]},"69":{"title":"ToChar","titles":["Convertor","Documentation"]},"70":{"title":"ToChannel","titles":["Convertor","Documentation"]},"71":{"title":"ToFloat","titles":["Convertor","Documentation"]},"72":{"title":"ToInt","titles":["Convertor","Documentation"]},"73":{"title":"ToJson","titles":["Convertor","Documentation"]},"74":{"title":"ToMap","titles":["Convertor","Documentation"]},"75":{"title":"ToPointer","titles":["Convertor","Documentation"]},"76":{"title":"ToString","titles":["Convertor","Documentation"]},"77":{"title":"StructToMap","titles":["Convertor","Documentation"]},"78":{"title":"MapToSlice","titles":["Convertor","Documentation"]},"79":{"title":"EncodeByte","titles":["Convertor","Documentation"]},"80":{"title":"DecodeByte","titles":["Convertor","Documentation"]},"81":{"title":"DeepClone","titles":["Convertor","Documentation"]},"82":{"title":"CopyProperties","titles":["Convertor","Documentation"]},"83":{"title":"ToInterface","titles":["Convertor","Documentation"]},"84":{"title":"Utf8ToGbk","titles":["Convertor","Documentation"]},"85":{"title":"GbkToUtf8","titles":["Convertor","Documentation"]},"86":{"title":"Cryptor","titles":[]},"87":{"title":"Source:","titles":["Cryptor"]},"88":{"title":"Usage:","titles":["Cryptor"]},"89":{"title":"Index","titles":["Cryptor"]},"90":{"title":"Documentation","titles":["Cryptor"]},"91":{"title":"AesEcbEncrypt","titles":["Cryptor","Documentation"]},"92":{"title":"AesEcbDecrypt","titles":["Cryptor","Documentation"]},"93":{"title":"AesCbcEncrypt","titles":["Cryptor","Documentation"]},"94":{"title":"AesCbcDecrypt","titles":["Cryptor","Documentation"]},"95":{"title":"AesCtrCrypt","titles":["Cryptor","Documentation"]},"96":{"title":"AesCfbEncrypt","titles":["Cryptor","Documentation"]},"97":{"title":"AesCfbDecrypt","titles":["Cryptor","Documentation"]},"98":{"title":"AesOfbEncrypt","titles":["Cryptor","Documentation"]},"99":{"title":"AesOfbDecrypt","titles":["Cryptor","Documentation"]},"100":{"title":"Base64StdEncode","titles":["Cryptor","Documentation"]},"101":{"title":"Base64StdDecode","titles":["Cryptor","Documentation"]},"102":{"title":"DesEcbEncrypt","titles":["Cryptor","Documentation"]},"103":{"title":"DesEcbDecrypt","titles":["Cryptor","Documentation"]},"104":{"title":"DesCbcEncrypt","titles":["Cryptor","Documentation"]},"105":{"title":"DesCbcDecrypt","titles":["Cryptor","Documentation"]},"106":{"title":"DesCtrCrypt","titles":["Cryptor","Documentation"]},"107":{"title":"DesCfbEncrypt","titles":["Cryptor","Documentation"]},"108":{"title":"DesCfbDecrypt","titles":["Cryptor","Documentation"]},"109":{"title":"DesOfbEncrypt","titles":["Cryptor","Documentation"]},"110":{"title":"DesOfbDecrypt","titles":["Cryptor","Documentation"]},"111":{"title":"HmacMd5","titles":["Cryptor","Documentation"]},"112":{"title":"HmacMd5WithBase64","titles":["Cryptor","Documentation"]},"113":{"title":"HmacSha1","titles":["Cryptor","Documentation"]},"114":{"title":"HmacSha1WithBase64","titles":["Cryptor","Documentation"]},"115":{"title":"HmacSha256","titles":["Cryptor","Documentation"]},"116":{"title":"HmacSha256WithBase64","titles":["Cryptor","Documentation"]},"117":{"title":"HmacSha512","titles":["Cryptor","Documentation"]},"118":{"title":"HmacSha512WithBase64","titles":["Cryptor","Documentation"]},"119":{"title":"Md5String","titles":["Cryptor","Documentation"]},"120":{"title":"Md5StringWithBase64","titles":["Cryptor","Documentation"]},"121":{"title":"Md5Byte","titles":["Cryptor","Documentation"]},"122":{"title":"Md5ByteWithBase64","titles":["Cryptor","Documentation"]},"123":{"title":"Md5File","titles":["Cryptor","Documentation"]},"124":{"title":"Sha1","titles":["Cryptor","Documentation"]},"125":{"title":"Sha1WithBase64","titles":["Cryptor","Documentation"]},"126":{"title":"Sha256","titles":["Cryptor","Documentation"]},"127":{"title":"Sha256WithBase64","titles":["Cryptor","Documentation"]},"128":{"title":"Sha512","titles":["Cryptor","Documentation"]},"129":{"title":"Sha512WithBase64","titles":["Cryptor","Documentation"]},"130":{"title":"GenerateRsaKey","titles":["Cryptor","Documentation"]},"131":{"title":"RsaEncrypt","titles":["Cryptor","Documentation"]},"132":{"title":"RsaDecrypt","titles":["Cryptor","Documentation"]},"133":{"title":"CopyOnWriteList","titles":[]},"134":{"title":"源码","titles":["CopyOnWriteList"]},"135":{"title":"用法","titles":["CopyOnWriteList"]},"136":{"title":"目录","titles":["CopyOnWriteList"]},"137":{"title":"Documentation","titles":["CopyOnWriteList"]},"138":{"title":"NewCopyOnWriteList","titles":["CopyOnWriteList","Documentation"]},"139":{"title":"Example","titles":["CopyOnWriteList","Documentation","NewCopyOnWriteList"]},"140":{"title":"Size","titles":["CopyOnWriteList","Documentation"]},"141":{"title":"Example","titles":["CopyOnWriteList","Documentation","Size"]},"142":{"title":"Get","titles":["CopyOnWriteList","Documentation"]},"143":{"title":"Example","titles":["CopyOnWriteList","Documentation","Get"]},"144":{"title":"Set","titles":["CopyOnWriteList","Documentation"]},"145":{"title":"Example","titles":["CopyOnWriteList","Documentation","Set"]},"146":{"title":"Remove","titles":["CopyOnWriteList","Documentation"]},"147":{"title":"IndexOf","titles":["CopyOnWriteList","Documentation"]},"148":{"title":"Example","titles":["CopyOnWriteList","Documentation","IndexOf"]},"149":{"title":"LastIndexOf","titles":["CopyOnWriteList","Documentation"]},"150":{"title":"Example","titles":["CopyOnWriteList","Documentation","LastIndexOf"]},"151":{"title":"IsEmpty","titles":["CopyOnWriteList","Documentation"]},"152":{"title":"Example","titles":["CopyOnWriteList","Documentation","IsEmpty"]},"153":{"title":"Contain","titles":["CopyOnWriteList","Documentation"]},"154":{"title":"Example","titles":["CopyOnWriteList","Documentation","Contain"]},"155":{"title":"ValueOf","titles":["CopyOnWriteList","Documentation"]},"156":{"title":"Example","titles":["CopyOnWriteList","Documentation","ValueOf"]},"157":{"title":"Add","titles":["CopyOnWriteList","Documentation"]},"158":{"title":"Example","titles":["CopyOnWriteList","Documentation","Add"]},"159":{"title":"AddAll","titles":["CopyOnWriteList","Documentation"]},"160":{"title":"Example","titles":["CopyOnWriteList","Documentation","AddAll"]},"161":{"title":"AddByIndex","titles":["CopyOnWriteList","Documentation"]},"162":{"title":"Example","titles":["CopyOnWriteList","Documentation","AddByIndex"]},"163":{"title":"DeleteAt","titles":["CopyOnWriteList","Documentation"]},"164":{"title":"Example","titles":["CopyOnWriteList","Documentation","DeleteAt"]},"165":{"title":"DeleteIf","titles":["CopyOnWriteList","Documentation"]},"166":{"title":"Example","titles":["CopyOnWriteList","Documentation","DeleteIf"]},"167":{"title":"DeleteBy","titles":["CopyOnWriteList","Documentation"]},"168":{"title":"Example","titles":["CopyOnWriteList","Documentation","DeleteBy"]},"169":{"title":"DeleteRange","titles":["CopyOnWriteList","Documentation"]},"170":{"title":"Example","titles":["CopyOnWriteList","Documentation","DeleteRange"]},"171":{"title":"Equal","titles":["CopyOnWriteList","Documentation"]},"172":{"title":"Example","titles":["CopyOnWriteList","Documentation","Equal"]},"173":{"title":"HashMap","titles":[]},"174":{"title":"Source","titles":["HashMap"]},"175":{"title":"Usage","titles":["HashMap"]},"176":{"title":"Index","titles":["HashMap"]},"177":{"title":"Documentation","titles":["HashMap"]},"178":{"title":"NewHashMap","titles":["HashMap","Documentation"]},"179":{"title":"NewHashMap","titles":["HashMap","Documentation"]},"180":{"title":"Get","titles":["HashMap","Documentation"]},"181":{"title":"Put","titles":["HashMap","Documentation"]},"182":{"title":"Delete","titles":["HashMap","Documentation"]},"183":{"title":"Contains","titles":["HashMap","Documentation"]},"184":{"title":"Iterate","titles":["HashMap","Documentation"]},"185":{"title":"Keys","titles":["HashMap","Documentation"]},"186":{"title":"Values","titles":["HashMap","Documentation"]},"187":{"title":"Heap","titles":[]},"188":{"title":"Source","titles":["Heap"]},"189":{"title":"Usage","titles":["Heap"]},"190":{"title":"Index","titles":["Heap"]},"191":{"title":"Documentation","titles":["Heap"]},"192":{"title":"1. MaxHeap","titles":["Heap","Documentation"]},"193":{"title":"NewMaxHeap","titles":["Heap","Documentation"]},"194":{"title":"Push","titles":["Heap","Documentation"]},"195":{"title":"Pop","titles":["Heap","Documentation"]},"196":{"title":"Peek","titles":["Heap","Documentation"]},"197":{"title":"Data","titles":["Heap","Documentation"]},"198":{"title":"Size","titles":["Heap","Documentation"]},"199":{"title":"PrintStructure","titles":["Heap","Documentation"]},"200":{"title":"Linklist","titles":[]},"201":{"title":"Source","titles":["Linklist"]},"202":{"title":"Usage","titles":["Linklist"]},"203":{"title":"Index","titles":["Linklist"]},"204":{"title":"1. SinglyLink","titles":["Linklist","Index"]},"205":{"title":"2. DoublyLink","titles":["Linklist","Index"]},"206":{"title":"Documentation","titles":["Linklist"]},"207":{"title":"1. SinglyLink","titles":["Linklist","Documentation"]},"208":{"title":"NewSinglyLink","titles":["Linklist","Documentation"]},"209":{"title":"Values","titles":["Linklist","Documentation"]},"210":{"title":"InsertAt","titles":["Linklist","Documentation"]},"211":{"title":"InsertAtHead","titles":["Linklist","Documentation"]},"212":{"title":"InsertAtTail","titles":["Linklist","Documentation"]},"213":{"title":"DeleteAt","titles":["Linklist","Documentation"]},"214":{"title":"DeleteAtHead","titles":["Linklist","Documentation"]},"215":{"title":"DeleteAtTail","titles":["Linklist","Documentation"]},"216":{"title":"DeleteValue","titles":["Linklist","Documentation"]},"217":{"title":"Reverse","titles":["Linklist","Documentation"]},"218":{"title":"GetMiddleNode","titles":["Linklist","Documentation"]},"219":{"title":"Size","titles":["Linklist","Documentation"]},"220":{"title":"IsEmpty","titles":["Linklist","Documentation"]},"221":{"title":"Clear","titles":["Linklist","Documentation"]},"222":{"title":"Print","titles":["Linklist","Documentation"]},"223":{"title":"2. DoublyLink","titles":["Linklist","Documentation"]},"224":{"title":"NewDoublyLink","titles":["Linklist","Documentation"]},"225":{"title":"Values","titles":["Linklist","Documentation"]},"226":{"title":"InsertAt","titles":["Linklist","Documentation"]},"227":{"title":"InsertAtHead","titles":["Linklist","Documentation"]},"228":{"title":"InsertAtTail","titles":["Linklist","Documentation"]},"229":{"title":"DeleteAt","titles":["Linklist","Documentation"]},"230":{"title":"DeleteAtHead","titles":["Linklist","Documentation"]},"231":{"title":"DeleteAtTail","titles":["Linklist","Documentation"]},"232":{"title":"Reverse","titles":["Linklist","Documentation"]},"233":{"title":"GetMiddleNode","titles":["Linklist","Documentation"]},"234":{"title":"Size","titles":["Linklist","Documentation"]},"235":{"title":"IsEmpty","titles":["Linklist","Documentation"]},"236":{"title":"Clear","titles":["Linklist","Documentation"]},"237":{"title":"Print","titles":["Linklist","Documentation"]},"238":{"title":"List","titles":[]},"239":{"title":"Source","titles":["List"]},"240":{"title":"Usage","titles":["List"]},"241":{"title":"Index","titles":["List"]},"242":{"title":"Documentation","titles":["List"]},"243":{"title":"NewList","titles":["List","Documentation"]},"244":{"title":"Contain","titles":["List","Documentation"]},"245":{"title":"Data","titles":["List","Documentation"]},"246":{"title":"ValueOf","titles":["List","Documentation"]},"247":{"title":"IndexOf","titles":["List","Documentation"]},"248":{"title":"LastIndexOf","titles":["List","Documentation"]},"249":{"title":"IndexOfFunc","titles":["List","Documentation"]},"250":{"title":"LastIndexOfFunc","titles":["List","Documentation"]},"251":{"title":"Push","titles":["List","Documentation"]},"252":{"title":"PopFirst","titles":["List","Documentation"]},"253":{"title":"PopFirst","titles":["List","Documentation"]},"254":{"title":"DeleteAt","titles":["List","Documentation"]},"255":{"title":"InsertAt","titles":["List","Documentation"]},"256":{"title":"UpdateAt","titles":["List","Documentation"]},"257":{"title":"Equal","titles":["List","Documentation"]},"258":{"title":"IsEmpty","titles":["List","Documentation"]},"259":{"title":"Clear","titles":["List","Documentation"]},"260":{"title":"Clone","titles":["List","Documentation"]},"261":{"title":"Merge","titles":["List","Documentation"]},"262":{"title":"Size","titles":["List","Documentation"]},"263":{"title":"Cap","titles":["List","Documentation"]},"264":{"title":"Swap","titles":["List","Documentation"]},"265":{"title":"Reverse","titles":["List","Documentation"]},"266":{"title":"Unique","titles":["List","Documentation"]},"267":{"title":"Union","titles":["List","Documentation"]},"268":{"title":"Intersection","titles":["List","Documentation"]},"269":{"title":"Difference","titles":["List","Documentation"]},"270":{"title":"SymmetricDifference","titles":["List","Documentation"]},"271":{"title":"RetainAll","titles":["List","Documentation"]},"272":{"title":"DeleteAll","titles":["List","Documentation"]},"273":{"title":"ForEach","titles":["List","Documentation"]},"274":{"title":"Iterator","titles":["List","Documentation"]},"275":{"title":"ListToMap","titles":["List","Documentation"]},"276":{"title":"SubList","titles":["List","Documentation"]},"277":{"title":"DeleteIf","titles":["List","Documentation"]},"278":{"title":"Queue","titles":[]},"279":{"title":"Source","titles":["Queue"]},"280":{"title":"Usage","titles":["Queue"]},"281":{"title":"Index","titles":["Queue"]},"282":{"title":"1. ArrayQueue","titles":["Queue","Index"]},"283":{"title":"2. LinkedQueue","titles":["Queue","Index"]},"284":{"title":"3. CircularQueue","titles":["Queue","Index"]},"285":{"title":"4. PriorityQueue","titles":["Queue","Index"]},"286":{"title":"Documentation","titles":["Queue"]},"287":{"title":"1. ArrayQueue","titles":["Queue","Documentation"]},"288":{"title":"NewArrayQueue","titles":["Queue","Documentation"]},"289":{"title":"Data","titles":["Queue","Documentation"]},"290":{"title":"Enqueue","titles":["Queue","Documentation"]},"291":{"title":"Dequeue","titles":["Queue","Documentation"]},"292":{"title":"Front","titles":["Queue","Documentation"]},"293":{"title":"Back","titles":["Queue","Documentation"]},"294":{"title":"Size","titles":["Queue","Documentation"]},"295":{"title":"IsEmpty","titles":["Queue","Documentation"]},"296":{"title":"IsFull","titles":["Queue","Documentation"]},"297":{"title":"Clear","titles":["Queue","Documentation"]},"298":{"title":"Contain","titles":["Queue","Documentation"]},"299":{"title":"2. LinkedQueue","titles":["Queue","Documentation"]},"300":{"title":"NewLinkedQueue","titles":["Queue","Documentation"]},"301":{"title":"Data","titles":["Queue","Documentation"]},"302":{"title":"Enqueue","titles":["Queue","Documentation"]},"303":{"title":"Dequeue","titles":["Queue","Documentation"]},"304":{"title":"Front","titles":["Queue","Documentation"]},"305":{"title":"Back","titles":["Queue","Documentation"]},"306":{"title":"Size","titles":["Queue","Documentation"]},"307":{"title":"IsEmpty","titles":["Queue","Documentation"]},"308":{"title":"Clear","titles":["Queue","Documentation"]},"309":{"title":"Contain","titles":["Queue","Documentation"]},"310":{"title":"3. CircularQueue","titles":["Queue","Documentation"]},"311":{"title":"NewCircularQueue","titles":["Queue","Documentation"]},"312":{"title":"Data","titles":["Queue","Documentation"]},"313":{"title":"Enqueue","titles":["Queue","Documentation"]},"314":{"title":"Dequeue","titles":["Queue","Documentation"]},"315":{"title":"Front","titles":["Queue","Documentation"]},"316":{"title":"Back","titles":["Queue","Documentation"]},"317":{"title":"Size","titles":["Queue","Documentation"]},"318":{"title":"IsEmpty","titles":["Queue","Documentation"]},"319":{"title":"IsFull","titles":["Queue","Documentation"]},"320":{"title":"Clear","titles":["Queue","Documentation"]},"321":{"title":"Contain","titles":["Queue","Documentation"]},"322":{"title":"4. PriorityQueue","titles":["Queue","Documentation"]},"323":{"title":"NewPriorityQueue","titles":["Queue","Documentation"]},"324":{"title":"Data","titles":["Queue","Documentation"]},"325":{"title":"Enqueue","titles":["Queue","Documentation"]},"326":{"title":"Dequeue","titles":["Queue","Documentation"]},"327":{"title":"IsEmpty","titles":["Queue","Documentation"]},"328":{"title":"IsFull","titles":["Queue","Documentation"]},"329":{"title":"Size","titles":["Queue","Documentation"]},"330":{"title":"Set","titles":[]},"331":{"title":"Source","titles":["Set"]},"332":{"title":"Usage","titles":["Set"]},"333":{"title":"Index","titles":["Set"]},"334":{"title":"Documentation","titles":["Set"]},"335":{"title":"NewSet","titles":["Set","Documentation"]},"336":{"title":"NewSetFromSlice","titles":["Set","Documentation"]},"337":{"title":"Values","titles":["Set","Documentation"]},"338":{"title":"Add","titles":["Set","Documentation"]},"339":{"title":"AddIfNotExist","titles":["Set","Documentation"]},"340":{"title":"AddIfNotExistBy","titles":["Set","Documentation"]},"341":{"title":"Delete","titles":["Set","Documentation"]},"342":{"title":"Contain","titles":["Set","Documentation"]},"343":{"title":"ContainAll","titles":["Set","Documentation"]},"344":{"title":"Size","titles":["Set","Documentation"]},"345":{"title":"Clone","titles":["Set","Documentation"]},"346":{"title":"Equal","titles":["Set","Documentation"]},"347":{"title":"Iterate","titles":["Set","Documentation"]},"348":{"title":"EachWithBreak","titles":["Set","Documentation"]},"349":{"title":"IsEmpty","titles":["Set","Documentation"]},"350":{"title":"Union","titles":["Set","Documentation"]},"351":{"title":"Intersection","titles":["Set","Documentation"]},"352":{"title":"SymmetricDifference","titles":["Set","Documentation"]},"353":{"title":"Minus","titles":["Set","Documentation"]},"354":{"title":"Pop","titles":["Set","Documentation"]},"355":{"title":"Stack","titles":[]},"356":{"title":"Source","titles":["Stack"]},"357":{"title":"Usage","titles":["Stack"]},"358":{"title":"Index","titles":["Stack"]},"359":{"title":"1. ArrayStack","titles":["Stack","Index"]},"360":{"title":"2. LinkedStack","titles":["Stack","Index"]},"361":{"title":"Documentation","titles":["Stack"]},"362":{"title":"1. ArrayStack","titles":["Stack","Documentation"]},"363":{"title":"NewArrayStack","titles":["Stack","Documentation"]},"364":{"title":"Push","titles":["Stack","Documentation"]},"365":{"title":"Pop","titles":["Stack","Documentation"]},"366":{"title":"Peak","titles":["Stack","Documentation"]},"367":{"title":"Data","titles":["Stack","Documentation"]},"368":{"title":"Size","titles":["Stack","Documentation"]},"369":{"title":"IsEmpty","titles":["Stack","Documentation"]},"370":{"title":"Clear","titles":["Stack","Documentation"]},"371":{"title":"2. LinkedStack","titles":["Stack","Documentation"]},"372":{"title":"NewLinkedStack","titles":["Stack","Documentation"]},"373":{"title":"Push","titles":["Stack","Documentation"]},"374":{"title":"Pop","titles":["Stack","Documentation"]},"375":{"title":"Peak","titles":["Stack","Documentation"]},"376":{"title":"Data","titles":["Stack","Documentation"]},"377":{"title":"Size","titles":["Stack","Documentation"]},"378":{"title":"IsEmpty","titles":["Stack","Documentation"]},"379":{"title":"Clear","titles":["Stack","Documentation"]},"380":{"title":"Print","titles":["Stack","Documentation"]},"381":{"title":"Tree","titles":[]},"382":{"title":"Source","titles":["Tree"]},"383":{"title":"Usage","titles":["Tree"]},"384":{"title":"Index","titles":["Tree"]},"385":{"title":"1. BSTree","titles":["Tree","Index"]},"386":{"title":"Documentation","titles":["Tree"]},"387":{"title":"1. BSTree","titles":["Tree"]},"388":{"title":"NewBSTree","titles":["Tree","1. BSTree"]},"389":{"title":"Insert","titles":["Tree","1. BSTree"]},"390":{"title":"Delete","titles":["Tree","1. BSTree"]},"391":{"title":"PreOrderTraverse","titles":["Tree","1. BSTree"]},"392":{"title":"InOrderTraverse","titles":["Tree","1. BSTree"]},"393":{"title":"PostOrderTraverse","titles":["Tree","1. BSTree"]},"394":{"title":"LevelOrderTraverse","titles":["Tree","1. BSTree"]},"395":{"title":"Depth","titles":["Tree","1. BSTree"]},"396":{"title":"HasSubTree","titles":["Tree","1. BSTree"]},"397":{"title":"Print","titles":["Tree","1. BSTree"]},"398":{"title":"Datetime","titles":[]},"399":{"title":"Source:","titles":["Datetime"]},"400":{"title":"Usage:","titles":["Datetime"]},"401":{"title":"Index","titles":["Datetime"]},"402":{"title":"Documentation","titles":["Datetime"]},"403":{"title":"Note:","titles":["Datetime"]},"404":{"title":"AddDay","titles":["Datetime","Note:"]},"405":{"title":"AddHour","titles":["Datetime","Note:"]},"406":{"title":"AddMinute","titles":["Datetime","Note:"]},"407":{"title":"AddYear","titles":["Datetime","Note:"]},"408":{"title":"BeginOfMinute","titles":["Datetime","Note:"]},"409":{"title":"BeginOfHour","titles":["Datetime","Note:"]},"410":{"title":"BeginOfDay","titles":["Datetime","Note:"]},"411":{"title":"BeginOfWeek","titles":["Datetime","Note:"]},"412":{"title":"BeginOfMonth","titles":["Datetime","Note:"]},"413":{"title":"BeginOfYear","titles":["Datetime","Note:"]},"414":{"title":"EndOfMinute","titles":["Datetime","Note:"]},"415":{"title":"EndOfHour","titles":["Datetime","Note:"]},"416":{"title":"EndOfDay","titles":["Datetime","Note:"]},"417":{"title":"EndOfWeek","titles":["Datetime","Note:"]},"418":{"title":"EndOfMonth","titles":["Datetime","Note:"]},"419":{"title":"EndOfYear","titles":["Datetime","Note:"]},"420":{"title":"GetNowDate","titles":["Datetime","Note:"]},"421":{"title":"GetNowTime","titles":["Datetime","Note:"]},"422":{"title":"GetNowDateTime","titles":["Datetime","Note:"]},"423":{"title":"GetTodayStartTime","titles":["Datetime","Note:"]},"424":{"title":"GetTodayEndTime","titles":["Datetime","Note:"]},"425":{"title":"GetZeroHourTimestamp","titles":["Datetime","Note:"]},"426":{"title":"GetNightTimestamp","titles":["Datetime","Note:"]},"427":{"title":"FormatTimeToStr","titles":["Datetime","Note:"]},"428":{"title":"FormatStrToTime","titles":["Datetime","Note:"]},"429":{"title":"NewUnixNow","titles":["Datetime","Note:"]},"430":{"title":"NewUnix","titles":["Datetime","Note:"]},"431":{"title":"NewFormat","titles":["Datetime","Note:"]},"432":{"title":"NewISO8601","titles":["Datetime","Note:"]},"433":{"title":"ToUnix","titles":["Datetime","Note:"]},"434":{"title":"ToFormat","titles":["Datetime","Note:"]},"435":{"title":"ToFormatForTpl","titles":["Datetime","Note:"]},"436":{"title":"ToIso8601","titles":["Datetime","Note:"]},"437":{"title":"IsLeapYear","titles":["Datetime","Note:"]},"438":{"title":"BetweenSeconds","titles":["Datetime","Note:"]},"439":{"title":"DayOfYear","titles":["Datetime","Note:"]},"440":{"title":"IsWeekend(Deprecated, Use \'== Weekday\' instead)","titles":["Datetime","Note:"]},"441":{"title":"NowDateOrTime","titles":["Datetime","Note:"]},"442":{"title":"Timestamp","titles":["Datetime","Note:"]},"443":{"title":"TimestampMilli","titles":["Datetime","Note:"]},"444":{"title":"TimestampMicro","titles":["Datetime","Note:"]},"445":{"title":"TimestampNano","titles":["Datetime","Note:"]},"446":{"title":"Fileutil","titles":[]},"447":{"title":"Source:","titles":["Fileutil"]},"448":{"title":"Usage:","titles":["Fileutil"]},"449":{"title":"Index","titles":["Fileutil"]},"450":{"title":"Documentation","titles":["Fileutil"]},"451":{"title":"ClearFile","titles":["Fileutil","Documentation"]},"452":{"title":"CreateFile","titles":["Fileutil","Documentation"]},"453":{"title":"CreateDir","titles":["Fileutil","Documentation"]},"454":{"title":"CopyFile","titles":["Fileutil","Documentation"]},"455":{"title":"CurrentPath","titles":["Fileutil","Documentation"]},"456":{"title":"FileMode","titles":["Fileutil","Documentation"]},"457":{"title":"MiMeType","titles":["Fileutil","Documentation"]},"458":{"title":"IsExist","titles":["Fileutil","Documentation"]},"459":{"title":"IsLink","titles":["Fileutil","Documentation"]},"460":{"title":"IsDir","titles":["Fileutil","Documentation"]},"461":{"title":"ListFileNames","titles":["Fileutil","Documentation"]},"462":{"title":"RemoveFile","titles":["Fileutil","Documentation"]},"463":{"title":"ReadFileToString","titles":["Fileutil","Documentation"]},"464":{"title":"ReadFileByLine","titles":["Fileutil","Documentation"]},"465":{"title":"Zip","titles":["Fileutil","Documentation"]},"466":{"title":"ZipAppendEntry","titles":["Fileutil","Documentation"]},"467":{"title":"UnZip","titles":["Fileutil","Documentation"]},"468":{"title":"IsZipFile","titles":["Fileutil","Documentation"]},"469":{"title":"FileSize","titles":["Fileutil","Documentation"]},"470":{"title":"MTime","titles":["Fileutil","Documentation"]},"471":{"title":"Sha","titles":["Fileutil","Documentation"]},"472":{"title":"ReadCsvFile","titles":["Fileutil","Documentation"]},"473":{"title":"WriteCsvFile","titles":["Fileutil","Documentation"]},"474":{"title":"WriteBytesToFile","titles":["Fileutil","Documentation"]},"475":{"title":"WriteStringToFile","titles":["Fileutil","Documentation"]},"476":{"title":"Formatter","titles":[]},"477":{"title":"Source:","titles":["Formatter"]},"478":{"title":"Usage:","titles":["Formatter"]},"479":{"title":"Index","titles":["Formatter"]},"480":{"title":"Documentation","titles":["Formatter"]},"481":{"title":"Comma","titles":["Formatter","Documentation"]},"482":{"title":"Pretty","titles":["Formatter","Documentation"]},"483":{"title":"PrettyToWriter","titles":["Formatter","Documentation"]},"484":{"title":"DecimalBytes","titles":["Formatter","Documentation"]},"485":{"title":"BinaryBytes","titles":["Formatter","Documentation"]},"486":{"title":"ParseDecimalBytes","titles":["Formatter","Documentation"]},"487":{"title":"ParseBinaryBytes","titles":["Formatter","Documentation"]},"488":{"title":"Function","titles":[]},"489":{"title":"Source:","titles":["Function"]},"490":{"title":"Usage:","titles":["Function"]},"491":{"title":"Index","titles":["Function"]},"492":{"title":"Documentation","titles":["Function"]},"493":{"title":"After","titles":["Function","Documentation"]},"494":{"title":"Before","titles":["Function","Documentation"]},"495":{"title":"CurryFn","titles":["Function","Documentation"]},"496":{"title":"Compose","titles":["Function","Documentation"]},"497":{"title":"Debounced","titles":["Function","Documentation"]},"498":{"title":"Delay","titles":["Function","Documentation"]},"499":{"title":"Schedule","titles":["Function","Documentation"]},"500":{"title":"Pipeline","titles":["Function","Documentation"]},"501":{"title":"Watcher","titles":["Function","Documentation"]},"502":{"title":"Maputil","titles":[]},"503":{"title":"Source:","titles":["Maputil"]},"504":{"title":"Example:","titles":["Maputil"]},"505":{"title":"Index","titles":["Maputil"]},"506":{"title":"Documentation","titles":["Maputil"]},"507":{"title":"MapTo","titles":["Maputil","Documentation"]},"508":{"title":"ForEach","titles":["Maputil","Documentation"]},"509":{"title":"Filter","titles":["Maputil","Documentation"]},"510":{"title":"FilterByKeys","titles":["Maputil","Documentation"]},"511":{"title":"FilterByValues","titles":["Maputil","Documentation"]},"512":{"title":"OmitBy","titles":["Maputil","Documentation"]},"513":{"title":"OmitByKeys","titles":["Maputil","Documentation"]},"514":{"title":"OmitByValues","titles":["Maputil","Documentation"]},"515":{"title":"Intersect","titles":["Maputil","Documentation"]},"516":{"title":"Keys","titles":["Maputil","Documentation"]},"517":{"title":"Merge","titles":["Maputil","Documentation"]},"518":{"title":"Minus","titles":["Maputil","Documentation"]},"519":{"title":"Values","titles":["Maputil","Documentation"]},"520":{"title":"KeysBy","titles":["Maputil","Documentation"]},"521":{"title":"ValuesBy","titles":["Maputil","Documentation"]},"522":{"title":"MapKeys","titles":["Maputil","Documentation"]},"523":{"title":"MapValues","titles":["Maputil","Documentation"]},"524":{"title":"Entry","titles":["Maputil","Documentation"]},"525":{"title":"FromEntries","titles":["Maputil","Documentation"]},"526":{"title":"Transform","titles":["Maputil","Documentation"]},"527":{"title":"IsDisjoint","titles":["Maputil","Documentation"]},"528":{"title":"HasKey","titles":["Maputil","Documentation"]},"529":{"title":"NewConcurrentMap","titles":["Maputil","Documentation"]},"530":{"title":"ConcurrentMap_Set","titles":["Maputil","Documentation"]},"531":{"title":"ConcurrentMap_Get","titles":["Maputil","Documentation"]},"532":{"title":"ConcurrentMap_GetOrSet","titles":["Maputil","Documentation"]},"533":{"title":"ConcurrentMap_Delete","titles":["Maputil","Documentation"]},"534":{"title":"ConcurrentMap_GetAndDelete","titles":["Maputil","Documentation"]},"535":{"title":"ConcurrentMap_Has","titles":["Maputil","Documentation"]},"536":{"title":"ConcurrentMap_Range","titles":["Maputil","Documentation"]},"537":{"title":"Mathutil","titles":[]},"538":{"title":"Source:","titles":["Mathutil"]},"539":{"title":"Example:","titles":["Mathutil"]},"540":{"title":"Index","titles":["Mathutil"]},"541":{"title":"Documentation","titles":["Mathutil"]},"542":{"title":"Average","titles":["Mathutil","Documentation"]},"543":{"title":"Exponent","titles":["Mathutil","Documentation"]},"544":{"title":"Fibonacci","titles":["Mathutil","Documentation"]},"545":{"title":"Factorial","titles":["Mathutil","Documentation"]},"546":{"title":"Max","titles":["Mathutil","Documentation"]},"547":{"title":"MaxBy","titles":["Mathutil","Documentation"]},"548":{"title":"Min","titles":["Mathutil","Documentation"]},"549":{"title":"MinBy","titles":["Mathutil","Documentation"]},"550":{"title":"Percent","titles":["Mathutil","Documentation"]},"551":{"title":"RoundToFloat","titles":["Mathutil","Documentation"]},"552":{"title":"RoundToString","titles":["Mathutil","Documentation"]},"553":{"title":"TruncRound","titles":["Mathutil","Documentation"]},"554":{"title":"Range","titles":["Mathutil","Documentation"]},"555":{"title":"RangeWithStep","titles":["Mathutil","Documentation"]},"556":{"title":"AngleToRadian","titles":["Mathutil","Documentation"]},"557":{"title":"RadianToAngle","titles":["Mathutil","Documentation"]},"558":{"title":"PointDistance","titles":["Mathutil","Documentation"]},"559":{"title":"IsPrime","titles":["Mathutil","Documentation"]},"560":{"title":"GCD","titles":["Mathutil","Documentation"]},"561":{"title":"LCM","titles":["Mathutil","Documentation"]},"562":{"title":"Cos","titles":["Mathutil","Documentation"]},"563":{"title":"Sin","titles":["Mathutil","Documentation"]},"564":{"title":"Log","titles":["Mathutil","Documentation"]},"565":{"title":"Sum","titles":["Mathutil","Documentation"]},"566":{"title":"Abs","titles":["Mathutil","Documentation"]},"567":{"title":"Netutil","titles":[]},"568":{"title":"Source:","titles":["Netutil"]},"569":{"title":"Usage:","titles":["Netutil"]},"570":{"title":"Index","titles":["Netutil"]},"571":{"title":"Documentation","titles":["Netutil"]},"572":{"title":"ConvertMapToQueryString","titles":["Netutil","Documentation"]},"573":{"title":"EncodeUrl","titles":["Netutil","Documentation"]},"574":{"title":"GetInternalIp","titles":["Netutil","Documentation"]},"575":{"title":"GetIps","titles":["Netutil","Documentation"]},"576":{"title":"GetMacAddrs","titles":["Netutil","Documentation"]},"577":{"title":"GetPublicIpInfo","titles":["Netutil","Documentation"]},"578":{"title":"GetRequestPublicIp","titles":["Netutil","Documentation"]},"579":{"title":"IsPublicIP","titles":["Netutil","Documentation"]},"580":{"title":"IsInternalIP","titles":["Netutil","Documentation"]},"581":{"title":"HttpRequest","titles":["Netutil","Documentation"]},"582":{"title":"HttpClient","titles":["Netutil","Documentation"]},"583":{"title":"SendRequest","titles":["Netutil","Documentation"]},"584":{"title":"DecodeResponse","titles":["Netutil","Documentation"]},"585":{"title":"StructToUrlValues","titles":["Netutil","Documentation"]},"586":{"title":"HttpGet","titles":["Netutil","Documentation"]},"587":{"title":"HttpPost","titles":["Netutil","Documentation"]},"588":{"title":"HttpPut","titles":["Netutil","Documentation"]},"589":{"title":"HttpDelete","titles":["Netutil","Documentation"]},"590":{"title":"HttpPatch","titles":["Netutil","Documentation"]},"591":{"title":"ParseHttpResponse","titles":["Netutil","Documentation"]},"592":{"title":"DownloadFile","titles":["Netutil","Documentation"]},"593":{"title":"UploadFile","titles":["Netutil","Documentation"]},"594":{"title":"IsPingConnected","titles":["Netutil","Documentation"]},"595":{"title":"IsTelnetConnected","titles":["Netutil","Documentation"]},"596":{"title":"Pointer","titles":[]},"597":{"title":"Source:","titles":["Pointer"]},"598":{"title":"Usage:","titles":["Pointer"]},"599":{"title":"Index","titles":["Pointer"]},"600":{"title":"Documentation","titles":["Pointer"]},"601":{"title":"Of","titles":["Pointer","Documentation"]},"602":{"title":"Unwrap","titles":["Pointer","Documentation"]},"603":{"title":"UnwarpOr","titles":["Pointer","Documentation"]},"604":{"title":"UnwarpOrDefault","titles":["Pointer","Documentation"]},"605":{"title":"ExtractPointer","titles":["Pointer","Documentation"]},"606":{"title":"Random","titles":[]},"607":{"title":"Source:","titles":["Random"]},"608":{"title":"Usage:","titles":["Random"]},"609":{"title":"Index","titles":["Random"]},"610":{"title":"Documentation","titles":["Random"]},"611":{"title":"RandBytes","titles":["Random","Documentation"]},"612":{"title":"RandInt","titles":["Random","Documentation"]},"613":{"title":"RandString","titles":["Random","Documentation"]},"614":{"title":"RandUpper","titles":["Random","Documentation"]},"615":{"title":"RandLower","titles":["Random","Documentation"]},"616":{"title":"RandNumeral","titles":["Random","Documentation"]},"617":{"title":"RandNumeralOrLetter","titles":["Random","Documentation"]},"618":{"title":"UUIdV4","titles":["Random","Documentation"]},"619":{"title":"RandUniqueIntSlice","titles":["Random","Documentation"]},"620":{"title":"Retry","titles":[]},"621":{"title":"Source:","titles":["Retry"]},"622":{"title":"Usage:","titles":["Retry"]},"623":{"title":"Index","titles":["Retry"]},"624":{"title":"Documentation","titles":["Retry"]},"625":{"title":"Context","titles":["Retry","Documentation"]},"626":{"title":"RetryFunc","titles":["Retry","Documentation"]},"627":{"title":"RetryTimes","titles":["Retry","Documentation"]},"628":{"title":"RetryDuration","titles":["Retry","Documentation"]},"629":{"title":"Retry","titles":["Retry","Documentation"]},"630":{"title":"Slice","titles":[]},"631":{"title":"Source:","titles":["Slice"]},"632":{"title":"Usage:","titles":["Slice"]},"633":{"title":"Index","titles":["Slice"]},"634":{"title":"Documentation","titles":["Slice"]},"635":{"title":"AppendIfAbsent","titles":["Slice","Documentation"]},"636":{"title":"Contain","titles":["Slice","Documentation"]},"637":{"title":"ContainBy","titles":["Slice","Documentation"]},"638":{"title":"ContainSubSlice","titles":["Slice","Documentation"]},"639":{"title":"Chunk","titles":["Slice","Documentation"]},"640":{"title":"Compact","titles":["Slice","Documentation"]},"641":{"title":"Concat","titles":["Slice","Documentation"]},"642":{"title":"Count","titles":["Slice","Documentation"]},"643":{"title":"CountBy","titles":["Slice","Documentation"]},"644":{"title":"Difference","titles":["Slice","Documentation"]},"645":{"title":"DifferenceBy","titles":["Slice","Documentation"]},"646":{"title":"DifferenceWith","titles":["Slice","Documentation"]},"647":{"title":"DeleteAt","titles":["Slice","Documentation"]},"648":{"title":"Drop","titles":["Slice","Documentation"]},"649":{"title":"DropRight","titles":["Slice","Documentation"]},"650":{"title":"DropWhile","titles":["Slice","Documentation"]},"651":{"title":"DropRightWhile","titles":["Slice","Documentation"]},"652":{"title":"Equal","titles":["Slice","Documentation"]},"653":{"title":"EqualWith","titles":["Slice","Documentation"]},"654":{"title":"Every","titles":["Slice","Documentation"]},"655":{"title":"Filter","titles":["Slice","Documentation"]},"656":{"title":"Find(deprecated: use FindBy)","titles":["Slice","Documentation"]},"657":{"title":"FindBy","titles":["Slice","Documentation"]},"658":{"title":"FindLast(deprecated: use FindLastBy)","titles":["Slice","Documentation"]},"659":{"title":"FindLastBy","titles":["Slice","Documentation"]},"660":{"title":"Flatten","titles":["Slice","Documentation"]},"661":{"title":"FlattenDeep","titles":["Slice","Documentation"]},"662":{"title":"ForEach","titles":["Slice","Documentation"]},"663":{"title":"ForEachWithBreak","titles":["Slice","Documentation"]},"664":{"title":"GroupBy","titles":["Slice","Documentation"]},"665":{"title":"GroupWith","titles":["Slice","Documentation"]},"666":{"title":"IntSlice (Deprecated: use generic feature of go1.18+ for replacement)","titles":["Slice","Documentation"]},"667":{"title":"InterfaceSlice (Deprecated: use generic feature of go1.18+ for replacement)","titles":["Slice","Documentation"]},"668":{"title":"Intersection","titles":["Slice","Documentation"]},"669":{"title":"InsertAt","titles":["Slice","Documentation"]},"670":{"title":"IndexOf","titles":["Slice","Documentation"]},"671":{"title":"LastIndexOf","titles":["Slice","Documentation"]},"672":{"title":"Map","titles":["Slice","Documentation"]},"673":{"title":"FilterMap","titles":["Slice","Documentation"]},"674":{"title":"FlatMap","titles":["Slice","Documentation"]},"675":{"title":"Merge","titles":["Slice","Documentation"]},"676":{"title":"Reverse","titles":["Slice","Documentation"]},"677":{"title":"Reduce","titles":["Slice","Documentation"]},"678":{"title":"ReduceBy","titles":["Slice","Documentation"]},"679":{"title":"ReduceRight","titles":["Slice","Documentation"]},"680":{"title":"Replace","titles":["Slice","Documentation"]},"681":{"title":"ReplaceAll","titles":["Slice","Documentation"]},"682":{"title":"Repeat","titles":["Slice","Documentation"]},"683":{"title":"Shuffle","titles":["Slice","Documentation"]},"684":{"title":"IsAscending","titles":["Slice","Documentation"]},"685":{"title":"IsDescending","titles":["Slice","Documentation"]},"686":{"title":"IsSorted","titles":["Slice","Documentation"]},"687":{"title":"IsSortedByKey","titles":["Slice","Documentation"]},"688":{"title":"Sort","titles":["Slice","Documentation"]},"689":{"title":"SortBy","titles":["Slice","Documentation"]},"690":{"title":"SortByField (Deprecated: use Sort and SortBy for replacement)","titles":["Slice","Documentation"]},"691":{"title":"Some","titles":["Slice","Documentation"]},"692":{"title":"StringSlice (Deprecated: use generic feature of go1.18+ for replacement)","titles":["Slice","Documentation"]},"693":{"title":"SymmetricDifference","titles":["Slice","Documentation"]},"694":{"title":"ToSlice","titles":["Slice","Documentation"]},"695":{"title":"ToSlicePointer","titles":["Slice","Documentation"]},"696":{"title":"Unique","titles":["Slice","Documentation"]},"697":{"title":"UniqueBy","titles":["Slice","Documentation"]},"698":{"title":"Union","titles":["Slice","Documentation"]},"699":{"title":"UnionBy","titles":["Slice","Documentation"]},"700":{"title":"UpdateAt","titles":["Slice","Documentation"]},"701":{"title":"Without","titles":["Slice","Documentation"]},"702":{"title":"KeyBy","titles":["Slice","Documentation"]},"703":{"title":"Join","titles":["Slice","Documentation"]},"704":{"title":"Stream","titles":[]},"705":{"title":"Source:","titles":["Stream"]},"706":{"title":"Usage:","titles":["Stream"]},"707":{"title":"Index","titles":["Stream"]},"708":{"title":"Documentation","titles":["Stream"]},"709":{"title":"Of","titles":["Stream","Documentation"]},"710":{"title":"FromSlice","titles":["Stream","Documentation"]},"711":{"title":"FromChannel","titles":["Stream","Documentation"]},"712":{"title":"FromRange","titles":["Stream","Documentation"]},"713":{"title":"Generate","titles":["Stream","Documentation"]},"714":{"title":"Concat","titles":["Stream","Documentation"]},"715":{"title":"Distinct","titles":["Stream","Documentation"]},"716":{"title":"Filter","titles":["Stream","Documentation"]},"717":{"title":"Map","titles":["Stream","Documentation"]},"718":{"title":"Peek","titles":["Stream","Documentation"]},"719":{"title":"Skip","titles":["Stream","Documentation"]},"720":{"title":"Limit","titles":["Stream","Documentation"]},"721":{"title":"Reverse","titles":["Stream","Documentation"]},"722":{"title":"Range","titles":["Stream","Documentation"]},"723":{"title":"Sorted","titles":["Stream","Documentation"]},"724":{"title":"ForEach","titles":["Stream","Documentation"]},"725":{"title":"Reduce","titles":["Stream","Documentation"]},"726":{"title":"FindFirst","titles":["Stream","Documentation"]},"727":{"title":"FindLast","titles":["Stream","Documentation"]},"728":{"title":"Max","titles":["Stream","Documentation"]},"729":{"title":"Min","titles":["Stream","Documentation"]},"730":{"title":"AllMatch","titles":["Stream","Documentation"]},"731":{"title":"AnyMatch","titles":["Stream","Documentation"]},"732":{"title":"NoneMatch","titles":["Stream","Documentation"]},"733":{"title":"Count","titles":["Stream","Documentation"]},"734":{"title":"ToSlice","titles":["Stream","Documentation"]},"735":{"title":"Structs","titles":[]},"736":{"title":"Source:","titles":["Structs"]},"737":{"title":"Usage:","titles":["Structs"]},"738":{"title":"Index:","titles":["Structs"]},"739":{"title":"Documentation:","titles":["Structs"]},"740":{"title":"New","titles":["Structs","Documentation:"]},"741":{"title":"ToMap","titles":["Structs","Documentation:"]},"742":{"title":"Fields","titles":["Structs","Documentation:"]},"743":{"title":"Field","titles":["Structs","Documentation:"]},"744":{"title":"IsStruct","titles":["Structs","Documentation:"]},"745":{"title":"Tag","titles":["Structs","Documentation:"]},"746":{"title":"Value","titles":["Structs","Documentation:"]},"747":{"title":"IsEmbedded","titles":["Structs","Documentation:"]},"748":{"title":"IsExported","titles":["Structs","Documentation:"]},"749":{"title":"IsZero","titles":["Structs","Documentation:"]},"750":{"title":"Name","titles":["Structs","Documentation:"]},"751":{"title":"Kind","titles":["Structs","Documentation:"]},"752":{"title":"IsSlice","titles":["Structs","Documentation:"]},"753":{"title":"Strutil","titles":[]},"754":{"title":"Source:","titles":["Strutil"]},"755":{"title":"Usage:","titles":["Strutil"]},"756":{"title":"Index","titles":["Strutil"]},"757":{"title":"Documentation","titles":["Strutil"]},"758":{"title":"After","titles":["Strutil","Documentation"]},"759":{"title":"AfterLast","titles":["Strutil","Documentation"]},"760":{"title":"Before","titles":["Strutil","Documentation"]},"761":{"title":"BeforeLast","titles":["Strutil","Documentation"]},"762":{"title":"CamelCase","titles":["Strutil","Documentation"]},"763":{"title":"KebabCase","titles":["Strutil","Documentation"]},"764":{"title":"UpperKebabCase","titles":["Strutil","Documentation"]},"765":{"title":"Capitalize","titles":["Strutil","Documentation"]},"766":{"title":"IsString","titles":["Strutil","Documentation"]},"767":{"title":"LowerFirst","titles":["Strutil","Documentation"]},"768":{"title":"UpperFirst","titles":["Strutil","Documentation"]},"769":{"title":"Pad","titles":["Strutil","Documentation"]},"770":{"title":"PadEnd","titles":["Strutil","Documentation"]},"771":{"title":"PadStart","titles":["Strutil","Documentation"]},"772":{"title":"Reverse","titles":["Strutil","Documentation"]},"773":{"title":"SnakeCase","titles":["Strutil","Documentation"]},"774":{"title":"UpperSnakeCase","titles":["Strutil","Documentation"]},"775":{"title":"SplitEx","titles":["Strutil","Documentation"]},"776":{"title":"Substring","titles":["Strutil","Documentation"]},"777":{"title":"Wrap","titles":["Strutil","Documentation"]},"778":{"title":"Unwrap","titles":["Strutil","Documentation"]},"779":{"title":"SplitWords","titles":["Strutil","Documentation"]},"780":{"title":"WordCount","titles":["Strutil","Documentation"]},"781":{"title":"RemoveNonPrintable","titles":["Strutil","Documentation"]},"782":{"title":"StringToBytes","titles":["Strutil","Documentation"]},"783":{"title":"BytesToString","titles":["Strutil","Documentation"]},"784":{"title":"IsBlank","titles":["Strutil","Documentation"]},"785":{"title":"HasPrefixAny","titles":["Strutil","Documentation"]},"786":{"title":"HasSuffixAny","titles":["Strutil","Documentation"]},"787":{"title":"IndexOffset","titles":["Strutil","Documentation"]},"788":{"title":"ReplaceWithMap","titles":["Strutil","Documentation"]},"789":{"title":"Trim","titles":["Strutil","Documentation"]},"790":{"title":"SplitAndTrim","titles":["Strutil","Documentation"]},"791":{"title":"HideString","titles":["Strutil","Documentation"]},"792":{"title":"ContainsAll","titles":["Strutil","Documentation"]},"793":{"title":"ContainsAny","titles":["Strutil","Documentation"]},"794":{"title":"RemoveWhiteSpace","titles":["Strutil","Documentation"]},"795":{"title":"System","titles":[]},"796":{"title":"Source:","titles":["System"]},"797":{"title":"Usage:","titles":["System"]},"798":{"title":"Index","titles":["System"]},"799":{"title":"Documentation","titles":["System"]},"800":{"title":"IsWindows","titles":["System","Documentation"]},"801":{"title":"IsLinux","titles":["System","Documentation"]},"802":{"title":"IsMac","titles":["System","Documentation"]},"803":{"title":"GetOsEnv","titles":["System","Documentation"]},"804":{"title":"SetOsEnv","titles":["System","Documentation"]},"805":{"title":"RemoveOsEnv","titles":["System","Documentation"]},"806":{"title":"CompareOsEnv","titles":["System","Documentation"]},"807":{"title":"ExecCommand","titles":["System","Documentation"]},"808":{"title":"GetOsBits","titles":["System","Documentation"]},"809":{"title":"Tuple","titles":[]},"810":{"title":"Source:","titles":["Tuple"]},"811":{"title":"Usage:","titles":["Tuple"]},"812":{"title":"Index","titles":["Tuple"]},"813":{"title":"Documentation","titles":["Tuple"]},"814":{"title":"Tuple2","titles":["Tuple","Documentation"]},"815":{"title":"Tuple2_Unbox","titles":["Tuple","Documentation"]},"816":{"title":"Zip2","titles":["Tuple","Documentation"]},"817":{"title":"Unzip2","titles":["Tuple","Documentation"]},"818":{"title":"Tuple3","titles":["Tuple","Documentation"]},"819":{"title":"Tuple3_Unbox","titles":["Tuple","Documentation"]},"820":{"title":"Zip3","titles":["Tuple","Documentation"]},"821":{"title":"Unzip3","titles":["Tuple","Documentation"]},"822":{"title":"Tuple4","titles":["Tuple","Documentation"]},"823":{"title":"Tuple4_Unbox","titles":["Tuple","Documentation"]},"824":{"title":"Zip4","titles":["Tuple","Documentation"]},"825":{"title":"Unzip4","titles":["Tuple","Documentation"]},"826":{"title":"Tuple5","titles":["Tuple","Documentation"]},"827":{"title":"Tuple5_Unbox","titles":["Tuple","Documentation"]},"828":{"title":"Zip5","titles":["Tuple","Documentation"]},"829":{"title":"Unzip5","titles":["Tuple","Documentation"]},"830":{"title":"Tuple6","titles":["Tuple","Documentation"]},"831":{"title":"Tuple6_Unbox","titles":["Tuple","Documentation"]},"832":{"title":"Zip6","titles":["Tuple","Documentation"]},"833":{"title":"Unzip6","titles":["Tuple","Documentation"]},"834":{"title":"Tuple7","titles":["Tuple","Documentation"]},"835":{"title":"Tuple7_Unbox","titles":["Tuple","Documentation"]},"836":{"title":"Zip7","titles":["Tuple","Documentation"]},"837":{"title":"Unzip7","titles":["Tuple","Documentation"]},"838":{"title":"Tuple8","titles":["Tuple","Documentation"]},"839":{"title":"Tuple8_Unbox","titles":["Tuple","Documentation"]},"840":{"title":"Zip8","titles":["Tuple","Documentation"]},"841":{"title":"Unzip8","titles":["Tuple","Documentation"]},"842":{"title":"Tuple9","titles":["Tuple","Documentation"]},"843":{"title":"Tuple9_Unbox","titles":["Tuple","Documentation"]},"844":{"title":"Zip9","titles":["Tuple","Documentation"]},"845":{"title":"Unzip9","titles":["Tuple","Documentation"]},"846":{"title":"Tuple10","titles":["Tuple","Documentation"]},"847":{"title":"Tuple10_Unbox","titles":["Tuple","Documentation"]},"848":{"title":"Zip10","titles":["Tuple","Documentation"]},"849":{"title":"Unzip10","titles":["Tuple","Documentation"]},"850":{"title":"Validator","titles":[]},"851":{"title":"Source:","titles":["Validator"]},"852":{"title":"Usage:","titles":["Validator"]},"853":{"title":"Index","titles":["Validator"]},"854":{"title":"Documentation","titles":["Validator"]},"855":{"title":"ContainChinese","titles":["Validator","Documentation"]},"856":{"title":"ContainLetter","titles":["Validator","Documentation"]},"857":{"title":"ContainLower","titles":["Validator","Documentation"]},"858":{"title":"ContainUpper","titles":["Validator","Documentation"]},"859":{"title":"IsAlpha","titles":["Validator","Documentation"]},"860":{"title":"IsAllUpper","titles":["Validator","Documentation"]},"861":{"title":"IsAllLower","titles":["Validator","Documentation"]},"862":{"title":"IsASCII","titles":["Validator","Documentation"]},"863":{"title":"IsBase64","titles":["Validator","Documentation"]},"864":{"title":"IsChineseMobile","titles":["Validator","Documentation"]},"865":{"title":"IsChineseIdNum","titles":["Validator","Documentation"]},"866":{"title":"IsChinesePhone","titles":["Validator","Documentation"]},"867":{"title":"IsCreditCard","titles":["Validator","Documentation"]},"868":{"title":"IsDns","titles":["Validator","Documentation"]},"869":{"title":"IsEmail","titles":["Validator","Documentation"]},"870":{"title":"IsEmptyString","titles":["Validator","Documentation"]},"871":{"title":"IsInt","titles":["Validator","Documentation"]},"872":{"title":"IsFloat","titles":["Validator","Documentation"]},"873":{"title":"IsNumber","titles":["Validator","Documentation"]},"874":{"title":"IsIntStr","titles":["Validator","Documentation"]},"875":{"title":"IsFloatStr","titles":["Validator","Documentation"]},"876":{"title":"IsNumberStr","titles":["Validator","Documentation"]},"877":{"title":"IsJSON","titles":["Validator","Documentation"]},"878":{"title":"IsRegexMatch","titles":["Validator","Documentation"]},"879":{"title":"IsIp","titles":["Validator","Documentation"]},"880":{"title":"IsIpV4","titles":["Validator","Documentation"]},"881":{"title":"IsIpV6","titles":["Validator","Documentation"]},"882":{"title":"IsStrongPassword","titles":["Validator","Documentation"]},"883":{"title":"IsUrl","titles":["Validator","Documentation"]},"884":{"title":"IsWeakPassword","titles":["Validator","Documentation"]},"885":{"title":"IsZeroValue","titles":["Validator","Documentation"]},"886":{"title":"IsGBK","titles":["Validator","Documentation"]},"887":{"title":"IsPrintable","titles":["Validator","Documentation"]},"888":{"title":"Xerror","titles":[]},"889":{"title":"Source:","titles":["Xerror"]},"890":{"title":"Usage:","titles":["Xerror"]},"891":{"title":"Index","titles":["Xerror"]},"892":{"title":"Documentation","titles":["Xerror"]},"893":{"title":"New","titles":["Xerror","Documentation"]},"894":{"title":"Wrap","titles":["Xerror","Documentation"]},"895":{"title":"Unwrap","titles":["Xerror","Documentation"]},"896":{"title":"XError_Wrap","titles":["Xerror","Documentation"]},"897":{"title":"XError_Unwrap","titles":["Xerror","Documentation"]},"898":{"title":"XError_With","titles":["Xerror","Documentation"]},"899":{"title":"XError_Id","titles":["Xerror","Documentation"]},"900":{"title":"XError_Is","titles":["Xerror","Documentation"]},"901":{"title":"XError_Values","titles":["Xerror","Documentation"]},"902":{"title":"XError_StackTrace","titles":["Xerror","Documentation"]},"903":{"title":"XError_Info","titles":["Xerror","Documentation"]},"904":{"title":"XError_Error","titles":["Xerror","Documentation"]},"905":{"title":"TryUnwrap","titles":["Xerror","Documentation"]},"906":{"title":"Installation","titles":[]},"907":{"title":"Usage","titles":["Installation"]},"908":{"title":"Example","titles":["Installation"]},"909":{"title":"More","titles":["Installation"]},"910":{"title":"What is lancet?","titles":[]},"911":{"title":"Why lancet?","titles":["What is lancet?"]}},"dirtCount":0,"index":[["😄",{"2":{"862":2,"887":2}}],["中文",{"2":{"784":2}}],["私はプログラマーです",{"2":{"779":2,"780":2}}],["こんにちは",{"2":{"779":2,"780":2}}],["我是一名码农",{"2":{"779":2,"780":2}}],["欢迎你",{"2":{"776":2}}],["你好hello",{"2":{"855":2}}],["你好😄",{"2":{"781":4}}],["你好",{"2":{"776":4,"779":2,"780":2,"855":2,"856":2,"862":2,"886":2}}],["^",{"2":{"762":2,"763":2,"764":2,"773":2,"774":2,"856":2,"882":1}}],[">",{"2":{"728":1}}],["¥1",{"2":{"481":2}}],["¥",{"2":{"481":2}}],["$1",{"2":{"790":4}}],["$12",{"2":{"481":2}}],["$foo",{"2":{"762":2}}],["$",{"2":{"481":2,"789":10,"790":2,"856":2,"882":3,"884":2}}],["z",{"2":{"613":1,"857":1,"858":1,"859":1,"860":1,"861":1,"878":4}}],["za",{"2":{"613":1,"859":1,"878":4}}],["zhimg",{"2":{"592":2}}],["zip10",{"0":{"848":1},"2":{"812":1,"848":4}}],["zip9",{"0":{"844":1},"2":{"812":1,"844":4}}],["zip8",{"0":{"840":1},"2":{"812":1,"840":4}}],["zip7",{"0":{"836":1},"2":{"812":1,"836":4}}],["zip6",{"0":{"832":1},"2":{"812":1,"832":4}}],["zip5",{"0":{"828":1},"2":{"812":1,"828":4}}],["zip4",{"0":{"824":1},"2":{"812":1,"824":4}}],["zip3",{"0":{"820":1},"2":{"812":1,"820":4}}],["zip2",{"0":{"816":1},"2":{"812":1,"816":4}}],["zipfile",{"2":{"467":2,"468":2}}],["zipappendentry",{"0":{"466":1},"2":{"449":1,"466":4}}],["zip",{"0":{"465":1},"2":{"449":1,"465":7,"466":3,"467":4,"468":3}}],["zerotime",{"2":{"425":4}}],["zero",{"2":{"52":2,"195":1,"196":1,"409":1,"425":1,"426":1,"657":1,"659":1,"726":1,"727":1,"749":1,"885":1}}],["y2",{"2":{"558":2}}],["y1",{"2":{"558":2}}],["year",{"2":{"407":3,"413":1,"419":1,"437":3,"439":1}}],["yesterday",{"2":{"404":4,"438":4}}],["yy",{"2":{"403":3,"427":2,"428":2}}],["yyyymmdd",{"2":{"403":1}}],["yyyy",{"2":{"403":11,"420":1,"422":1,"423":1,"424":1,"427":4,"428":4,"431":1,"434":1,"441":4}}],["you",{"2":{"47":1,"906":1,"907":2}}],["目录",{"0":{"136":1}}],["用法",{"0":{"135":1}}],["源码",{"0":{"134":1}}],["qs",{"2":{"572":2}}],["q",{"2":{"288":4,"289":6,"290":12,"291":14,"292":14,"293":14,"294":12,"295":14,"296":14,"297":14,"298":14,"300":4,"301":6,"302":12,"303":14,"304":14,"305":14,"306":12,"307":14,"308":14,"309":14,"311":4,"312":6,"313":12,"314":14,"315":14,"316":14,"317":12,"318":14,"319":14,"320":14,"321":14,"323":4,"324":6,"325":6,"326":6,"327":8,"328":8,"329":8}}],["qvtghdzf6klavt4po0gs2a6pq00=",{"2":{"125":2}}],["queryvalues",{"2":{"585":2}}],["queryparams",{"2":{"581":2}}],["query",{"2":{"572":1,"573":1,"577":2,"586":2,"587":2,"588":2,"589":2,"590":2}}],["queuenode",{"2":{"300":8}}],["queue",{"0":{"278":1},"1":{"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1},"2":{"278":1,"279":4,"280":4,"287":1,"288":6,"289":7,"290":8,"291":7,"292":7,"293":7,"294":7,"295":7,"296":7,"297":7,"298":7,"299":1,"300":6,"301":7,"302":7,"303":7,"304":7,"305":7,"306":7,"307":7,"308":7,"309":7,"310":1,"311":6,"312":7,"313":8,"314":7,"315":7,"316":7,"317":7,"318":7,"319":7,"320":7,"321":7,"322":1,"323":7,"324":7,"325":8,"326":7,"327":7,"328":7,"329":7}}],["quick",{"2":{"10":1,"688":1}}],["quicksort",{"0":{"10":1},"2":{"4":1,"10":4}}],["quot",{"2":{"3":4,"6":8,"7":28,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":8,"15":8,"16":8,"17":8,"20":4,"23":36,"24":16,"25":16,"26":24,"27":16,"28":24,"29":8,"32":4,"37":8,"38":12,"39":12,"40":12,"41":12,"42":16,"43":16,"44":12,"45":12,"46":12,"49":4,"52":16,"53":20,"54":20,"55":8,"56":8,"57":8,"58":8,"59":8,"62":4,"65":12,"66":8,"67":44,"68":12,"69":20,"70":8,"71":32,"72":24,"73":36,"74":16,"75":8,"76":12,"77":16,"78":36,"79":12,"80":8,"81":24,"82":136,"83":20,"84":16,"85":12,"88":4,"91":16,"92":16,"93":16,"94":16,"95":16,"96":16,"97":16,"98":16,"99":16,"100":12,"101":12,"102":16,"103":16,"104":16,"105":16,"106":16,"107":16,"108":16,"109":16,"110":16,"111":16,"112":16,"113":16,"114":16,"115":16,"116":16,"117":16,"118":16,"119":12,"120":12,"121":8,"122":12,"123":12,"124":12,"125":12,"126":12,"127":12,"128":12,"129":12,"130":16,"131":28,"132":28,"135":4,"139":8,"141":8,"143":8,"145":8,"148":8,"150":8,"152":8,"154":8,"156":8,"158":8,"160":8,"162":8,"164":8,"166":8,"168":8,"170":8,"172":8,"175":4,"178":8,"179":8,"180":12,"181":16,"182":24,"183":20,"184":20,"185":32,"186":20,"189":4,"193":8,"194":8,"195":8,"196":8,"197":8,"198":8,"199":8,"202":4,"208":8,"209":8,"210":8,"211":8,"212":8,"213":8,"214":8,"215":8,"216":8,"217":8,"218":8,"219":8,"220":8,"221":8,"222":8,"224":8,"225":8,"226":8,"227":8,"228":8,"229":8,"230":8,"231":8,"232":8,"233":8,"234":8,"235":8,"236":8,"237":8,"240":4,"243":8,"244":8,"245":8,"246":8,"247":8,"248":8,"249":8,"250":8,"251":8,"252":8,"253":8,"254":8,"255":8,"256":8,"257":8,"258":8,"259":8,"260":8,"261":8,"262":8,"263":8,"264":8,"265":8,"266":8,"267":8,"268":8,"269":8,"270":8,"271":8,"272":8,"273":8,"274":8,"275":8,"276":8,"277":8,"280":4,"288":8,"289":8,"290":8,"291":8,"292":8,"293":8,"294":8,"295":8,"296":8,"297":8,"298":8,"300":8,"301":8,"302":8,"303":8,"304":8,"305":8,"306":8,"307":8,"308":8,"309":8,"311":8,"312":8,"313":8,"314":8,"315":8,"316":8,"317":8,"318":8,"319":8,"320":8,"321":8,"323":8,"324":8,"325":8,"326":8,"327":8,"328":8,"329":8,"332":4,"335":8,"336":8,"337":8,"338":8,"339":8,"340":8,"341":8,"342":8,"343":8,"344":8,"345":8,"346":8,"347":8,"348":8,"349":8,"350":8,"351":8,"352":8,"353":8,"354":8,"357":4,"363":8,"364":8,"365":8,"366":8,"367":8,"368":8,"369":8,"370":8,"372":8,"373":8,"374":8,"375":8,"376":8,"377":8,"378":8,"379":8,"380":8,"383":4,"388":8,"389":8,"390":8,"391":8,"392":8,"393":8,"394":8,"395":8,"396":8,"397":8,"400":4,"404":12,"405":12,"406":12,"407":12,"408":12,"409":12,"410":12,"411":12,"412":12,"413":12,"414":12,"415":12,"416":12,"417":12,"418":12,"419":12,"420":8,"421":8,"422":8,"423":8,"424":8,"425":8,"426":8,"427":32,"428":32,"429":8,"430":8,"431":12,"432":12,"433":8,"434":12,"435":16,"436":12,"437":8,"438":8,"439":8,"440":8,"441":20,"442":8,"443":8,"444":8,"445":8,"448":4,"451":12,"452":12,"453":12,"454":16,"455":8,"456":12,"457":20,"458":16,"459":12,"460":16,"461":12,"462":12,"463":20,"464":28,"465":16,"466":16,"467":16,"468":12,"469":12,"470":12,"471":20,"472":12,"473":36,"474":16,"475":16,"478":4,"481":28,"482":40,"483":32,"484":8,"485":8,"486":24,"487":24,"490":4,"493":12,"494":12,"495":8,"496":12,"497":8,"498":12,"499":8,"500":8,"501":8,"504":4,"507":68,"508":24,"509":28,"510":36,"511":28,"512":28,"513":36,"514":28,"515":48,"516":32,"517":24,"518":32,"519":32,"520":24,"521":52,"522":24,"523":24,"524":24,"525":20,"526":24,"527":28,"528":32,"529":8,"530":16,"531":16,"532":12,"533":16,"534":20,"535":16,"536":12,"539":4,"542":8,"543":8,"544":8,"545":8,"546":8,"547":32,"548":8,"549":32,"550":8,"551":8,"552":8,"553":8,"554":8,"555":8,"556":8,"557":8,"558":8,"559":8,"560":8,"561":8,"562":8,"563":8,"564":8,"565":8,"566":8,"569":4,"572":20,"573":12,"574":12,"575":12,"576":12,"577":56,"578":20,"579":24,"580":24,"581":44,"582":16,"583":40,"584":40,"585":44,"586":28,"587":48,"588":48,"589":24,"590":48,"591":48,"592":16,"593":16,"594":16,"595":24,"598":4,"601":12,"602":12,"603":20,"604":12,"605":8,"608":4,"611":8,"612":8,"613":8,"614":8,"615":8,"616":8,"617":8,"618":8,"619":8,"622":4,"625":24,"626":20,"627":20,"628":20,"629":20,"632":4,"635":32,"636":24,"637":44,"638":48,"639":28,"640":24,"641":24,"642":8,"643":8,"644":8,"645":8,"646":8,"647":44,"648":56,"649":56,"650":8,"651":8,"652":8,"653":8,"654":8,"655":8,"656":8,"657":8,"658":8,"659":8,"660":24,"661":24,"662":8,"663":8,"664":8,"665":8,"666":8,"667":32,"668":8,"669":96,"670":32,"671":32,"672":8,"673":24,"674":32,"675":8,"676":24,"677":8,"678":16,"679":16,"680":64,"681":32,"682":12,"683":8,"684":8,"685":8,"686":8,"687":44,"688":36,"689":24,"690":28,"691":8,"692":32,"693":8,"694":20,"695":16,"696":20,"697":8,"698":8,"699":8,"700":88,"701":8,"702":20,"703":16,"706":4,"709":8,"710":8,"711":8,"712":8,"713":8,"714":8,"715":8,"716":8,"717":8,"718":12,"719":8,"720":8,"721":8,"722":8,"723":8,"724":8,"725":8,"726":8,"727":8,"728":8,"729":8,"730":8,"731":8,"732":8,"733":8,"734":8,"737":4,"740":12,"741":16,"742":16,"743":20,"744":16,"745":20,"746":20,"747":20,"748":20,"749":16,"750":16,"751":16,"752":12,"755":4,"758":48,"759":48,"760":40,"761":40,"762":28,"763":28,"764":28,"765":28,"766":20,"767":24,"768":24,"769":64,"770":64,"771":64,"772":12,"773":28,"774":28,"775":48,"776":32,"777":40,"778":48,"779":32,"780":32,"781":16,"782":12,"783":8,"784":20,"785":36,"786":36,"787":32,"788":28,"789":20,"790":24,"791":28,"792":28,"793":36,"794":12,"797":4,"800":8,"801":8,"802":8,"803":20,"804":20,"805":28,"806":24,"807":48,"808":8,"811":4,"814":12,"815":12,"816":8,"817":12,"818":16,"819":16,"820":12,"821":16,"822":16,"823":16,"824":12,"825":16,"826":16,"827":16,"828":12,"829":16,"830":16,"831":16,"832":12,"833":16,"834":20,"835":20,"836":16,"837":20,"838":24,"839":24,"840":20,"841":24,"842":28,"843":28,"844":20,"845":24,"846":32,"847":32,"848":20,"849":24,"852":4,"855":20,"856":20,"857":20,"858":20,"859":20,"860":20,"861":20,"862":28,"863":16,"864":16,"865":16,"866":16,"867":16,"868":20,"869":16,"870":20,"871":16,"872":16,"873":16,"874":24,"875":24,"876":24,"877":32,"878":16,"879":24,"880":16,"881":16,"882":16,"883":20,"884":16,"885":16,"886":16,"887":28,"890":4,"893":12,"894":16,"895":32,"896":28,"897":24,"898":24,"899":32,"900":32,"901":24,"902":16,"903":32,"904":12,"905":20,"907":4,"908":12}}],["\\terr2",{"2":{"896":2}}],["\\toption",{"2":{"807":2}}],["\\tvar",{"2":{"603":4,"604":4}}],["\\tvalue",{"2":{"208":2,"224":2,"300":2,"372":2,"388":2}}],["\\tval2",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\tval1",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\tb",{"2":{"603":2,"604":2}}],["\\tbstree",{"2":{"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"397":6}}],["\\ta",{"2":{"603":2,"604":2}}],["\\twg2",{"2":{"530":4,"531":4,"533":2,"534":2,"535":2}}],["\\tsubtree",{"2":{"396":4}}],["\\tsupertree",{"2":{"396":10}}],["\\tsize",{"2":{"288":2,"323":2}}],["\\tright",{"2":{"388":2}}],["\\troot",{"2":{"388":2}}],["\\tresult4",{"2":{"603":2,"604":2}}],["\\tresult1",{"2":{"603":2,"604":2}}],["\\tresult3",{"2":{"566":2,"603":2,"604":2}}],["\\tresult2",{"2":{"441":2,"566":2,"603":2,"604":2}}],["\\trear",{"2":{"311":2}}],["\\treturn",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\ttop",{"2":{"372":2}}],["\\ttail",{"2":{"288":2,"300":2}}],["\\tcapacity",{"2":{"288":2,"311":2}}],["\\tcomparator",{"2":{"193":2,"323":2,"388":2}}],["\\titems",{"2":{"288":2,"323":2}}],["\\tif",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\thead",{"2":{"208":2,"224":2,"288":2,"300":2}}],["\\thms",{"2":{"118":2}}],["\\tnext",{"2":{"208":2,"224":2,"300":2,"372":2}}],["\\t\\t",{"2":{"530":2,"531":2}}],["\\t\\t\\twg2",{"2":{"530":2,"531":2}}],["\\t\\t\\tfmt",{"2":{"530":2,"531":2}}],["\\t\\t\\tval",{"2":{"530":2,"531":2}}],["\\t\\tgo",{"2":{"530":2,"531":2}}],["\\t\\tq",{"2":{"325":2,"326":2,"327":2,"328":2,"329":2}}],["\\t\\tmaxheap",{"2":{"194":2,"195":2,"196":2,"197":2,"198":2,"199":2}}],["\\t\\treturn",{"2":{"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4}}],["\\tfront",{"2":{"311":2}}],["\\tfor",{"2":{"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"530":2,"531":2}}],["\\tfmt",{"2":{"118":2,"120":2,"121":2,"122":2,"125":2,"127":2,"129":2,"158":2,"566":6,"603":8,"604":8,"896":2}}],["\\tdata",{"2":{"193":2,"311":2,"363":2}}],["\\tleft",{"2":{"388":2}}],["\\tlength",{"2":{"208":2,"224":2,"300":2,"363":2,"372":2}}],["\\tl",{"2":{"139":2,"158":4,"168":2}}],["\\t",{"2":{"118":4,"120":4,"121":4,"122":4,"125":4,"127":4,"129":4,"166":4,"168":4,"172":4,"193":4,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6,"325":6,"326":6,"327":6,"328":6,"329":6,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"530":2,"531":2,"566":8,"603":10,"604":10,"896":4}}],["\\tkey",{"2":{"118":2}}],["+$`",{"2":{"878":4}}],["+3e2",{"2":{"876":2}}],["+3",{"2":{"874":2,"875":2,"876":2}}],["+0000",{"2":{"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"428":6}}],["+=",{"2":{"348":2,"508":2,"509":2,"663":2,"724":2}}],["+xhyydsm",{"2":{"118":2}}],["+",{"2":{"78":4,"495":2,"500":2,"520":2,"523":2,"645":2,"672":2,"674":2,"677":2,"678":4,"679":2,"717":2,"725":2,"882":2,"884":1}}],["js",{"2":{"910":1}}],["jsonplaceholder",{"2":{"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["json",{"2":{"73":1,"76":1,"82":2,"482":1,"586":2,"587":2,"588":6,"589":2,"590":6,"591":4,"877":1}}],["je",{"2":{"779":4,"780":2}}],["java",{"2":{"704":1,"910":1}}],["join",{"0":{"703":1},"2":{"633":1,"703":7}}],["jpg",{"2":{"592":4,"593":2}}],["j++",{"2":{"530":2,"531":2,"533":2,"534":2,"535":2}}],["jim",{"2":{"473":4}}],["just",{"2":{"292":1,"293":1,"304":1,"305":1,"315":1,"316":1,"534":1,"907":1}}],["judgment",{"2":{"47":1}}],["j",{"2":{"264":2,"524":4,"530":6,"531":6,"533":6,"534":6,"535":6,"846":12,"847":4,"848":8,"849":6}}],["运行",{"2":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1}}],["xgo",{"2":{"906":2}}],["xgqdsmzlkunu0di",{"2":{"114":2}}],["xyz",{"2":{"785":2,"786":2,"869":2}}],["xxx",{"2":{"593":2,"902":2}}],["x2",{"2":{"558":2}}],["x1",{"2":{"558":2}}],["x",{"2":{"500":14,"543":3,"545":3,"551":2,"552":2,"553":2,"566":3,"578":2,"587":2,"680":24,"681":6,"886":2,"906":14}}],["xufakrxlkna5cz2rebffkg==",{"2":{"120":2,"122":2}}],["xnor",{"0":{"57":1},"2":{"50":1,"57":10}}],["xor",{"0":{"55":1},"2":{"50":1,"55":10}}],["xerrorfunc",{"2":{"894":1,"895":1,"896":1,"898":1,"899":1}}],["xerrortype",{"2":{"893":1}}],["xerror",{"0":{"888":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1},"1":{"889":1,"890":1,"891":1,"892":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1},"2":{"0":1,"888":1,"889":2,"890":2,"891":9,"893":8,"894":8,"895":9,"896":8,"897":6,"898":8,"899":13,"900":11,"901":10,"902":6,"903":7,"904":6,"905":6}}],["weak",{"2":{"884":1}}],["weekend",{"2":{"440":1}}],["weekday",{"0":{"440":1},"2":{"411":2,"417":2}}],["week",{"2":{"411":2,"417":2}}],["word",{"2":{"779":5,"780":4}}],["words",{"2":{"779":1}}],["wordcount",{"0":{"780":1},"2":{"756":1,"780":14}}],["working",{"2":{"911":1}}],["work",{"2":{"704":1,"911":1}}],["world",{"2":{"463":4,"464":2,"781":2,"785":2,"786":2,"787":2,"792":4,"793":4,"794":4}}],["www",{"2":{"573":4,"587":2,"593":2,"594":4,"595":4}}],["wg",{"2":{"532":8}}],["wg2",{"2":{"530":2,"531":2,"533":6,"534":6,"535":6}}],["wg1",{"2":{"530":8,"531":8,"533":8,"534":8,"535":8,"536":8}}],["w",{"2":{"501":20}}],["way",{"2":{"704":1,"788":1}}],["want",{"2":{"688":1}}],["watch",{"2":{"501":1}}],["watcher",{"0":{"501":1},"2":{"489":1,"491":1,"501":19}}],["was",{"2":{"497":1,"620":1,"629":1,"906":1}}],["waitgroup",{"2":{"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["wait",{"2":{"497":1,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["wrong",{"2":{"894":4}}],["wronly|os",{"2":{"463":2,"464":2,"473":2}}],["wrapped",{"2":{"901":2}}],["wraperr",{"2":{"894":4,"895":4}}],["wraptoken",{"2":{"778":2}}],["wrapwith",{"2":{"777":2}}],["wrap",{"0":{"777":1,"894":1,"896":1},"2":{"756":1,"777":11,"891":2,"894":4,"895":2,"896":4,"897":2,"903":2}}],["writer",{"2":{"483":3}}],["writes",{"2":{"474":1,"475":1}}],["writestring",{"2":{"463":2,"464":2}}],["writestringtofile",{"0":{"475":1},"2":{"449":1,"475":4}}],["write",{"2":{"451":1,"473":1}}],["writebytestofile",{"0":{"474":1},"2":{"449":1,"474":4}}],["writecsvfile",{"0":{"473":1},"2":{"449":1,"473":4}}],["writing",{"2":{"133":2}}],["why",{"0":{"911":1}}],["who",{"2":{"906":2}}],["whose",{"2":{"45":1,"200":1,"207":1,"223":1,"268":1,"269":1,"351":1,"352":1,"353":1,"500":1,"510":1,"511":1,"514":1,"518":1,"520":1,"521":1,"529":2,"644":1,"682":1,"693":1,"709":1,"714":1,"721":1,"722":1,"772":1,"816":1,"820":1,"824":1,"828":1,"832":1,"836":1,"840":1,"844":1,"848":1}}],["what",{"0":{"910":1},"1":{"911":1},"2":{"699":1}}],["where",{"2":{"713":1}}],["whether",{"2":{"673":1,"730":1,"731":1,"732":1,"775":1,"886":2}}],["when",{"2":{"43":1,"133":3,"348":1,"663":1,"794":1,"907":1}}],["whitespace",{"2":{"784":1,"789":1,"794":3}}],["while",{"2":{"650":1,"651":1,"886":1}}],["which",{"2":{"387":2,"435":1,"439":1,"484":1,"485":1,"512":1,"513":1,"585":1,"586":8,"587":8,"588":8,"589":8,"590":8,"645":2,"646":1,"655":1,"670":1,"671":1,"673":1,"699":1,"788":1,"790":1,"902":1,"903":1}}],["windows",{"2":{"800":1,"807":4}}],["will",{"2":{"43":1,"44":1,"71":1,"72":1,"73":1,"76":2,"348":1,"453":2,"454":1,"500":1,"517":1,"552":1,"663":1,"664":1,"700":1,"719":1,"762":1,"763":1,"764":1,"773":1,"774":1,"778":1,"901":1,"906":2}}],["without",{"0":{"701":1},"2":{"196":1,"633":1,"701":4,"782":1,"783":1}}],["withcancel",{"2":{"38":2,"39":2,"40":2,"41":2,"42":2,"44":2,"45":2,"46":2,"625":2}}],["within",{"2":{"14":1,"15":1,"29":1,"886":2}}],["with",{"0":{"898":1},"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"17":1,"45":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"114":1,"116":1,"118":1,"120":1,"122":1,"129":1,"131":1,"132":1,"138":1,"144":1,"169":1,"178":1,"179":1,"238":1,"243":1,"288":1,"311":1,"323":1,"417":1,"441":1,"529":2,"554":1,"555":1,"582":1,"625":1,"640":1,"641":1,"643":1,"653":1,"660":1,"680":1,"681":1,"682":1,"697":1,"703":1,"777":1,"785":1,"786":1,"791":1,"794":1,"806":1,"891":1,"893":1,"895":2,"896":2,"897":3,"898":4,"901":3,"902":1,"903":2,"905":1,"906":1,"911":2}}],["||",{"2":{"583":2,"584":2}}],["|",{"2":{"29":2,"481":4,"542":2,"546":2,"548":2,"554":2,"555":2,"565":2,"566":2,"712":2}}],["`^",{"2":{"878":4}}],["`replacechar`",{"2":{"791":1}}],["`right`",{"2":{"25":1,"26":1,"27":1,"28":1}}],["`delimiter`",{"2":{"790":1}}],["`desc`",{"2":{"688":1}}],["`field`",{"2":{"745":1,"746":1}}],["`format`",{"2":{"427":1,"428":1}}],["`tag`",{"2":{"745":2}}],["`t`",{"2":{"439":1}}],["`str`",{"2":{"788":1,"790":1}}],["`struct`",{"2":{"740":1}}],["`sortorder`",{"2":{"688":1}}],["`size`",{"2":{"639":1}}],["`shatype`",{"2":{"471":1}}],["`v`",{"2":{"601":1}}],["`value`",{"2":{"216":1}}],["`abspath`",{"2":{"453":1}}],["`year`",{"2":{"437":1}}],["`command`",{"2":{"807":1}}],["`comparator`",{"2":{"323":1}}],["`charactermask`",{"2":{"789":1}}],["`checker`",{"2":{"340":2}}],["`idxfrom`",{"2":{"787":1}}],["`index`",{"2":{"210":1,"213":1,"226":1,"229":1}}],["`istrue`",{"2":{"59":1}}],["`key`",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1}}],["`",{"2":{"77":2,"82":42,"483":4,"507":12,"577":24,"583":8,"584":8,"585":6,"588":6,"590":6,"591":8,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2}}],["`json",{"2":{"77":2,"82":42,"483":4,"507":12,"577":24,"583":8,"584":8,"585":6,"588":6,"590":6,"591":8,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2}}],["`json`",{"2":{"77":1,"585":1}}],["`left`",{"2":{"25":1,"26":1,"27":1,"28":1}}],["kebab",{"2":{"763":1,"764":1,"774":1}}],["kebabcase",{"0":{"763":1},"2":{"756":1,"763":5}}],["keyby",{"0":{"702":1},"2":{"633":1,"702":4}}],["keysby",{"0":{"520":1},"2":{"505":1,"520":4}}],["keys",{"0":{"185":1,"516":1},"2":{"176":1,"185":9,"505":1,"510":4,"513":3,"516":11,"520":6,"522":1,"527":1,"665":1}}],["keysize",{"2":{"130":2}}],["key",{"2":{"17":6,"78":4,"91":9,"92":9,"93":9,"94":9,"95":9,"96":9,"97":9,"98":9,"99":9,"102":9,"103":9,"104":9,"105":9,"106":9,"107":9,"108":9,"109":9,"110":9,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":4,"130":1,"131":1,"132":1,"173":1,"180":3,"181":3,"182":4,"183":3,"184":7,"192":3,"508":3,"509":3,"512":2,"515":1,"517":2,"518":1,"520":1,"522":2,"523":2,"524":3,"525":9,"526":2,"528":5,"529":2,"530":3,"531":3,"532":3,"533":3,"534":4,"535":3,"536":5,"803":3,"804":3,"805":2,"806":3,"898":3,"901":3}}],["k2",{"2":{"526":6}}],["k23proa=",{"2":{"114":2}}],["k1",{"2":{"526":6}}],["kfunc",{"2":{"516":1}}],["kib",{"2":{"487":4}}],["king",{"2":{"483":4}}],["kindfunc",{"2":{"751":1}}],["kind",{"0":{"751":1},"2":{"278":1,"738":1,"751":8}}],["kb",{"2":{"486":4}}],["k",{"2":{"17":18,"74":6,"78":6,"275":6,"508":6,"509":8,"510":8,"511":6,"512":8,"513":8,"514":6,"515":6,"516":5,"517":6,"518":6,"519":4,"520":6,"521":4,"522":10,"523":12,"524":10,"525":10,"526":4,"527":4,"528":6,"529":4,"530":4,"531":4,"532":4,"533":4,"534":4,"535":4,"536":4,"687":4}}],["90",{"2":{"556":2,"557":2,"562":2,"563":2}}],["9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043",{"2":{"128":2}}],["999z",{"2":{"432":2,"436":2}}],["999999999",{"2":{"414":2,"415":2,"416":2,"417":2,"418":2,"419":2}}],["99",{"2":{"68":2,"79":2,"80":2,"782":2}}],["98",{"2":{"68":2,"79":2,"80":2,"782":2}}],["97",{"2":{"68":2,"79":2,"80":2,"782":2}}],["96",{"2":{"29":4}}],["9",{"2":{"14":2,"15":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"396":2,"515":4,"560":2,"561":2,"574":2,"575":2,"842":1}}],["720w",{"2":{"592":2}}],["76",{"2":{"576":2}}],["7853981633974483",{"2":{"556":2}}],["74",{"2":{"29":4,"576":4}}],["7",{"2":{"14":2,"15":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"397":4,"515":2,"550":2,"619":2,"646":2,"769":2,"770":2,"771":2,"791":4,"834":1}}],["87562",{"2":{"866":2}}],["8760h0m0s",{"2":{"407":4}}],["8976",{"2":{"791":2}}],["894",{"2":{"563":2}}],["80",{"2":{"595":2}}],["801",{"2":{"563":2}}],["86400",{"2":{"438":4}}],["8",{"2":{"7":4,"14":2,"15":2,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"396":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"457":4,"564":2,"646":2,"838":1,"886":2}}],["4o2",{"2":{"905":4}}],["4111111111111111",{"2":{"867":2}}],["4122",{"2":{"618":1}}],["434324324",{"2":{"864":2}}],["4321",{"2":{"679":2}}],["447",{"2":{"562":2}}],["456",{"2":{"603":6}}],["45",{"2":{"556":2,"557":2}}],["42",{"2":{"550":2,"905":4}}],["408420",{"2":{"550":2}}],["4096",{"2":{"130":2,"131":2,"132":2}}],["48",{"2":{"29":8}}],["4",{"0":{"285":1,"322":1},"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":2,"38":2,"40":2,"45":2,"145":2,"158":2,"160":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"210":4,"213":2,"214":4,"226":4,"229":2,"230":4,"251":4,"254":10,"255":10,"256":6,"257":4,"261":8,"262":4,"264":4,"265":4,"266":4,"267":6,"268":6,"269":2,"270":4,"271":6,"272":12,"273":4,"274":4,"275":4,"276":4,"277":4,"298":2,"309":2,"321":2,"325":2,"326":2,"329":2,"339":4,"340":2,"342":2,"343":2,"346":2,"348":2,"350":4,"351":2,"352":4,"353":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":6,"397":4,"484":1,"485":1,"508":2,"509":4,"510":2,"511":6,"512":2,"513":4,"514":4,"516":4,"519":2,"520":2,"530":2,"531":2,"532":2,"542":2,"546":6,"548":4,"554":18,"555":8,"557":2,"558":2,"611":2,"618":1,"619":2,"625":2,"636":2,"639":2,"641":4,"642":2,"643":2,"644":4,"645":4,"646":4,"648":2,"649":2,"650":4,"651":4,"653":2,"655":4,"656":2,"657":2,"658":4,"659":4,"662":2,"663":2,"664":4,"665":6,"668":2,"672":2,"673":4,"674":4,"675":4,"678":4,"679":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"693":4,"697":2,"698":4,"699":4,"701":4,"703":6,"711":2,"712":2,"713":2,"714":4,"716":4,"717":2,"719":8,"720":4,"723":6,"728":4,"729":2,"769":2,"770":2,"771":2,"780":2,"791":2,"822":1,"906":1}}],["64",{"2":{"808":3}}],["64bit",{"2":{"808":1}}],["6dqwbqujlycljdsrinpjmg==",{"2":{"112":2}}],["66667",{"2":{"29":2}}],["6",{"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":2,"15":2,"16":2,"79":2,"80":2,"160":2,"162":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"261":4,"267":4,"268":2,"276":2,"325":2,"326":2,"348":2,"388":2,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"396":4,"397":4,"515":2,"545":2,"560":2,"561":2,"613":2,"614":2,"615":2,"616":2,"617":2,"644":2,"646":2,"653":2,"663":2,"665":10,"677":2,"697":2,"698":6,"714":4,"724":2,"725":2,"769":2,"770":2,"771":2,"830":1,"882":2}}],["600",{"2":{"0":1}}],["36",{"2":{"500":2,"578":4,"579":2,"580":2}}],["345",{"2":{"481":2}}],["33",{"2":{"421":4,"422":2,"518":2,"550":4}}],["31",{"2":{"418":2,"419":2,"439":2,"576":2}}],["315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75",{"2":{"115":2}}],["3jrlnpkcji8pzm6xbhxx6zg4uumxadezjr1wuxdre9g9zvn7aqw==",{"2":{"129":2}}],["3y8skkndi9nu4ljtmi6c6m",{"2":{"118":2}}],["32116675",{"2":{"866":2}}],["32bit",{"2":{"808":1}}],["32",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"564":2,"808":3}}],["30305",{"2":{"550":2}}],["30",{"2":{"82":2,"441":4}}],["300",{"2":{"82":2}}],["39",{"2":{"81":2,"121":4,"777":14,"779":14,"780":8,"782":12,"783":12}}],["3",{"0":{"284":1,"310":1},"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":2,"15":2,"16":6,"17":2,"23":6,"29":4,"38":2,"41":4,"42":2,"43":2,"44":2,"45":6,"59":2,"69":4,"70":4,"72":2,"73":4,"76":4,"78":4,"79":2,"80":2,"82":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":4,"184":2,"185":2,"186":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"209":4,"210":4,"211":4,"212":4,"213":6,"214":4,"215":2,"216":4,"217":4,"218":2,"219":4,"220":2,"221":2,"222":4,"225":4,"226":4,"227":4,"228":4,"229":6,"230":4,"231":2,"232":4,"233":2,"234":4,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":2,"247":2,"248":4,"249":2,"250":4,"251":4,"252":4,"253":4,"254":10,"255":12,"256":6,"257":6,"258":2,"259":2,"260":4,"261":4,"262":2,"264":6,"265":4,"266":4,"267":4,"268":2,"269":4,"270":4,"271":10,"272":12,"273":4,"274":4,"275":4,"276":4,"277":4,"290":4,"291":4,"292":4,"293":6,"294":4,"295":2,"296":4,"297":2,"298":2,"302":4,"303":4,"304":4,"305":6,"306":4,"307":2,"308":2,"309":2,"313":4,"314":4,"315":4,"316":6,"317":4,"318":2,"319":4,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"335":4,"336":4,"337":4,"338":4,"339":4,"340":4,"341":4,"342":2,"343":4,"344":4,"345":2,"346":6,"347":4,"348":4,"349":2,"350":6,"351":6,"352":4,"353":6,"354":4,"364":4,"365":4,"366":6,"367":4,"368":4,"369":2,"370":2,"373":4,"374":4,"375":6,"376":4,"377":4,"378":2,"379":2,"380":4,"481":1,"484":2,"495":2,"508":2,"509":2,"510":2,"511":6,"512":4,"513":4,"514":4,"515":4,"516":4,"517":4,"518":4,"519":2,"520":4,"521":6,"522":4,"523":4,"524":4,"525":4,"526":4,"527":2,"530":2,"531":2,"532":2,"542":2,"545":2,"546":4,"548":2,"550":2,"551":2,"552":2,"553":2,"554":8,"555":4,"556":2,"560":4,"561":2,"564":6,"565":2,"572":2,"586":2,"587":2,"588":2,"589":2,"590":2,"625":2,"626":4,"627":2,"628":5,"629":4,"636":2,"639":2,"640":4,"641":4,"642":6,"643":2,"644":4,"645":4,"646":2,"650":4,"651":4,"652":6,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"662":4,"663":4,"664":4,"665":4,"666":6,"668":6,"669":6,"672":4,"673":2,"674":4,"675":8,"677":2,"678":4,"679":2,"680":2,"682":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":2,"693":4,"697":4,"698":4,"699":2,"700":2,"701":4,"702":2,"703":6,"709":4,"710":4,"711":2,"712":2,"713":2,"714":4,"715":14,"716":2,"717":4,"718":6,"719":8,"720":4,"721":4,"722":6,"723":6,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":4,"732":4,"733":4,"734":4,"752":2,"769":2,"770":2,"771":2,"776":6,"780":4,"791":8,"818":1,"844":4,"845":4,"848":4,"849":4,"871":2,"872":2,"873":2,"874":4,"875":2,"876":2}}],["56",{"2":{"576":2}}],["567",{"2":{"481":2}}],["5d",{"2":{"573":2}}],["5d41402abc4b2a76b9719d911017c592",{"2":{"119":2}}],["5b2",{"2":{"573":2}}],["5707963267948966",{"2":{"556":2}}],["57",{"2":{"421":4}}],["598",{"2":{"562":2}}],["59",{"2":{"414":2,"415":4,"416":4,"417":4,"418":4,"419":4,"422":2,"424":6,"426":1}}],["50",{"2":{"408":4,"409":2,"410":2,"411":2,"412":2,"413":2,"414":4,"415":2,"416":2,"417":2,"418":2,"419":2,"497":2,"550":2,"625":2,"626":2,"628":2,"629":2}}],["5c6a9db0cccb92e36ed0323fd09b7f936de9ace0",{"2":{"113":2}}],["512",{"2":{"471":3}}],["51",{"2":{"65":2,"66":2}}],["54",{"2":{"29":4}}],["5",{"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":2,"38":4,"45":4,"160":2,"170":4,"172":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"256":2,"261":4,"267":4,"268":2,"271":2,"272":2,"276":6,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"297":2,"298":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"320":2,"321":2,"325":2,"326":2,"329":2,"348":2,"350":4,"351":2,"352":4,"353":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"396":4,"397":4,"509":2,"510":2,"511":2,"512":4,"513":4,"514":4,"516":4,"519":2,"530":8,"531":8,"532":4,"533":8,"534":8,"535":8,"536":4,"544":4,"558":4,"564":2,"619":4,"627":1,"639":2,"643":2,"644":4,"645":4,"646":6,"650":4,"651":4,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"663":2,"664":4,"673":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":2,"697":2,"698":4,"703":6,"712":4,"714":4,"716":2,"719":2,"720":2,"769":2,"770":2,"771":2,"776":2,"787":2,"826":1}}],["2e",{"2":{"576":6}}],["2a",{"2":{"576":6}}],["27",{"2":{"564":2}}],["22",{"2":{"473":4,"518":2,"527":4}}],["2658976",{"2":{"791":2}}],["26",{"2":{"441":4}}],["210911192105130715",{"2":{"865":2}}],["21",{"2":{"427":2,"428":2,"473":4,"689":4,"690":4}}],["29",{"2":{"423":2,"424":2}}],["2m0s",{"2":{"406":4}}],["2h0m0s",{"2":{"405":4}}],["2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",{"2":{"126":2}}],["24h0m0s",{"2":{"404":4}}],["24",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"578":4,"579":2,"580":2}}],["235mb",{"2":{"484":2}}],["2346mb",{"2":{"484":2}}],["234",{"2":{"481":2}}],["23",{"2":{"76":4,"416":2,"417":2,"418":2,"419":2,"424":3,"426":1}}],["23e3",{"2":{"71":2}}],["28",{"2":{"7":4,"420":2,"422":2,"507":4}}],["2021",{"2":{"427":6,"428":10}}],["2022",{"2":{"420":2,"422":2,"431":2,"434":4,"435":4}}],["2023",{"2":{"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"423":2,"424":2,"439":6,"440":6,"441":4}}],["2001",{"2":{"437":2}}],["2000",{"2":{"437":2}}],["2006",{"2":{"427":2,"432":2,"435":2,"436":4}}],["200",{"2":{"82":2,"583":2,"584":2}}],["20",{"2":{"7":4,"29":4,"82":2,"469":2}}],["2",{"0":{"205":1,"223":1,"283":1,"299":1,"360":1,"371":1},"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":2,"15":2,"16":2,"17":14,"23":12,"24":2,"25":10,"26":10,"27":8,"28":8,"29":6,"38":2,"39":6,"40":6,"41":4,"43":2,"45":4,"46":2,"52":2,"59":4,"69":4,"70":4,"73":4,"76":4,"78":4,"81":4,"139":2,"141":2,"143":4,"145":4,"148":2,"150":2,"154":2,"156":4,"158":2,"160":2,"162":4,"164":4,"166":4,"168":4,"170":4,"172":4,"184":2,"185":2,"186":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"209":4,"210":8,"211":4,"212":4,"213":4,"214":4,"215":4,"216":6,"217":4,"218":4,"219":2,"220":2,"221":2,"222":4,"225":4,"226":8,"227":4,"228":4,"229":4,"230":4,"231":4,"232":4,"233":4,"234":2,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":2,"247":2,"248":2,"249":2,"250":2,"251":4,"252":4,"253":4,"254":12,"255":12,"256":10,"257":6,"258":2,"259":2,"260":4,"261":4,"262":2,"264":4,"265":4,"266":6,"267":4,"268":2,"269":4,"270":4,"271":18,"272":12,"273":4,"274":4,"275":4,"276":4,"277":4,"290":4,"291":4,"292":4,"293":4,"294":2,"295":2,"296":2,"297":2,"298":2,"302":4,"303":4,"304":4,"305":4,"306":2,"307":2,"308":2,"309":2,"313":4,"314":4,"315":4,"316":4,"317":2,"318":2,"319":2,"320":2,"321":2,"325":2,"326":2,"335":6,"336":6,"337":6,"338":4,"339":4,"340":8,"341":4,"342":2,"343":6,"344":2,"345":2,"346":6,"347":4,"348":2,"349":2,"350":6,"351":6,"352":4,"353":6,"354":2,"364":4,"365":4,"366":4,"367":4,"368":2,"369":2,"370":2,"373":4,"374":4,"375":4,"376":4,"377":2,"378":2,"379":2,"380":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"397":4,"405":4,"406":4,"485":2,"486":2,"487":2,"493":2,"494":2,"495":2,"497":2,"498":2,"499":6,"500":4,"508":2,"509":6,"510":4,"511":2,"512":4,"513":2,"514":4,"515":8,"516":4,"517":6,"518":2,"519":2,"520":4,"521":6,"522":4,"523":4,"524":4,"525":4,"526":4,"527":2,"528":2,"530":2,"531":2,"532":2,"542":4,"543":2,"544":2,"545":4,"546":4,"548":4,"550":8,"551":4,"552":4,"553":4,"554":8,"555":10,"557":2,"559":2,"561":4,"562":2,"563":2,"564":8,"565":2,"566":4,"572":2,"573":2,"586":2,"587":2,"588":2,"589":2,"590":2,"627":4,"636":2,"637":6,"639":2,"640":4,"641":4,"642":4,"643":6,"644":4,"645":4,"646":4,"647":2,"650":6,"651":8,"652":6,"653":6,"654":4,"655":6,"656":6,"657":6,"658":4,"659":4,"662":4,"663":2,"664":6,"665":4,"666":6,"668":6,"669":6,"672":4,"673":7,"674":4,"675":4,"677":2,"678":4,"679":2,"680":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":4,"693":4,"697":4,"698":4,"699":6,"700":2,"701":4,"702":2,"703":6,"709":4,"710":4,"711":2,"712":2,"713":2,"714":4,"715":10,"716":6,"717":4,"718":6,"719":8,"720":4,"721":4,"722":8,"723":6,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":4,"752":2,"769":2,"770":2,"771":2,"776":8,"780":2,"788":2,"814":1,"826":4,"827":4,"828":4,"829":4,"830":12,"831":12,"832":12,"833":12,"834":12,"835":12,"836":12,"837":12,"838":12,"839":12,"840":12,"841":12,"842":12,"843":12,"844":12,"845":12,"846":12,"847":12,"848":12,"849":12}}],["256",{"2":{"471":3}}],["25",{"2":{"0":1}}],["n++",{"2":{"713":2}}],["nth",{"2":{"543":1,"544":1}}],["nworld",{"2":{"464":2}}],["nighttime",{"2":{"426":4}}],["nil",{"2":{"68":2,"73":2,"76":2,"80":2,"81":8,"82":2,"130":2,"131":2,"132":2,"180":2,"182":2,"222":8,"231":2,"354":1,"365":3,"366":2,"374":3,"375":2,"380":2,"451":2,"454":2,"456":2,"462":2,"465":2,"466":2,"467":2,"469":2,"470":2,"471":2,"472":2,"473":4,"474":6,"475":6,"483":2,"507":2,"531":1,"573":2,"577":2,"583":4,"584":4,"586":2,"587":4,"588":4,"589":2,"590":4,"591":4,"603":1,"604":1,"618":2,"626":4,"627":4,"628":4,"629":4,"640":1,"657":1,"659":1,"690":2,"803":2,"804":2,"805":4,"806":2,"807":2,"895":1,"905":2}}],["nubmers",{"2":{"329":1}}],["numerror",{"2":{"905":2}}],["numeral",{"2":{"616":1,"617":1}}],["num",{"2":{"643":4,"654":4,"655":4,"656":4,"657":4,"658":4,"659":4,"664":4,"665":4,"673":6,"674":4,"691":4}}],["nums2",{"2":{"668":4,"675":4,"693":4,"698":4}}],["nums1",{"2":{"668":4,"675":4,"693":4,"698":4}}],["nums",{"2":{"52":10,"642":6,"643":4,"654":4,"655":4,"656":4,"657":4,"658":4,"659":4,"662":4,"664":4,"665":4,"666":4,"672":4,"673":4,"674":4,"677":4,"683":4,"691":4,"697":4,"699":4,"703":6}}],["number++",{"2":{"625":2,"626":2,"627":2,"628":2,"629":2}}],["number",{"2":{"45":3,"76":1,"198":1,"219":1,"234":1,"262":1,"294":1,"306":1,"317":1,"344":1,"368":1,"377":1,"438":1,"481":2,"484":1,"485":1,"507":6,"544":1,"559":2,"625":6,"626":6,"627":4,"628":6,"629":6,"642":1,"643":1,"688":2,"712":1,"780":1,"864":1,"865":1,"866":1,"873":1,"876":1,"882":1,"884":2}}],["numbers",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":4,"14":10,"15":10,"16":6,"45":16,"481":1,"542":3,"546":3,"548":3,"554":1,"555":1,"565":3,"650":6,"651":8,"663":4,"688":10,"689":6,"762":1,"763":1,"764":1,"773":1,"774":1}}],["n",{"2":{"83":4,"275":6,"348":6,"493":3,"494":3,"520":4,"530":10,"531":10,"532":6,"533":10,"534":14,"535":10,"536":6,"543":2,"544":2,"550":3,"551":3,"552":3,"553":3,"559":2,"564":3,"619":3,"627":2,"648":3,"649":3,"650":11,"651":11,"663":6,"680":3,"681":1,"682":3,"699":4,"713":6,"716":4,"717":4,"718":4,"719":4,"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"781":2,"784":2,"794":2}}],["nabcd",{"2":{"789":2}}],["nano",{"2":{"445":1}}],["nand",{"0":{"58":1},"2":{"50":1,"58":10}}],["named",{"2":{"803":1,"804":1,"806":1}}],["names",{"2":{"461":1}}],["name",{"0":{"750":1},"2":{"7":12,"74":8,"77":6,"82":14,"483":8,"507":6,"585":8,"689":8,"690":8,"738":1,"740":6,"741":10,"742":6,"743":11,"744":6,"745":10,"746":6,"747":6,"748":6,"749":4,"750":13,"751":4,"752":2,"877":2,"907":1}}],["non",{"2":{"680":1,"681":1,"762":1,"763":1,"764":1,"773":1,"774":1,"781":1}}],["nonematch",{"0":{"732":1},"2":{"707":1,"732":6}}],["none",{"2":{"582":1}}],["no",{"2":{"403":1,"527":1,"531":1,"657":2,"659":2,"720":1,"732":1,"895":1}}],["nodes",{"2":{"217":1,"219":1,"221":1,"222":1,"232":1,"234":1,"236":1,"237":1,"381":1,"391":1,"392":1,"393":1,"394":1}}],["node",{"2":{"192":1,"200":2,"207":2,"209":1,"218":1,"223":3,"225":1,"233":1,"381":3,"387":1,"394":1}}],["nor",{"0":{"56":1},"2":{"50":1,"54":1,"56":11,"57":1}}],["nowdateortime",{"0":{"441":1},"2":{"401":1,"441":6}}],["now",{"2":{"25":2,"26":2,"27":2,"28":2,"43":2,"404":12,"405":12,"406":12,"407":12,"438":2}}],["nothin",{"2":{"507":4}}],["nothing",{"2":{"210":3,"226":3,"254":1,"255":1,"339":1,"340":1,"534":1}}],["notequal",{"2":{"899":4,"900":4}}],["note",{"0":{"403":1},"1":{"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1},"2":{"427":1,"428":1}}],["notok",{"2":{"340":4}}],["not",{"2":{"23":1,"24":1,"29":1,"52":1,"55":1,"147":1,"149":1,"151":1,"169":1,"183":1,"210":1,"220":1,"226":1,"235":1,"244":1,"247":1,"248":1,"249":1,"250":1,"254":1,"255":1,"258":1,"269":1,"295":1,"296":1,"298":1,"307":1,"309":1,"318":1,"319":1,"321":1,"327":1,"328":1,"330":1,"339":1,"340":1,"342":1,"346":1,"349":1,"352":1,"353":1,"369":1,"378":1,"396":1,"437":1,"440":1,"459":1,"460":1,"468":1,"513":1,"518":1,"528":1,"579":1,"580":1,"594":1,"595":1,"612":1,"619":1,"636":1,"638":1,"644":1,"673":1,"689":1,"693":1,"787":1,"870":1,"871":1,"872":1,"873":1,"886":1,"905":1}}],["needs",{"2":{"908":1}}],["need",{"2":{"907":1}}],["next",{"2":{"200":1,"207":1,"222":6,"223":2,"274":2,"380":6,"517":1}}],["neither",{"2":{"54":1,"56":1,"57":1}}],["newencoder",{"2":{"886":2}}],["newtuple10",{"2":{"846":4,"847":2}}],["newtuple9",{"2":{"842":4,"843":2}}],["newtuple8",{"2":{"838":4,"839":2}}],["newtuple7",{"2":{"834":4,"835":2}}],["newtuple6",{"2":{"830":4,"831":2}}],["newtuple5",{"2":{"826":4,"827":2}}],["newtuple4",{"2":{"822":4,"823":2}}],["newtuple3",{"2":{"818":4,"819":2}}],["newtuple2",{"2":{"814":4,"815":2}}],["newhttpclientwithconfig",{"2":{"582":4}}],["newhttpclient",{"2":{"582":2,"583":2,"584":2}}],["newhashmapwithcapacity",{"2":{"176":1,"179":4}}],["newhashmap",{"0":{"178":1,"179":1},"2":{"176":1,"178":4,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2}}],["newwatcher",{"2":{"501":4}}],["newiso8601",{"0":{"432":1},"2":{"401":1,"432":4,"436":2}}],["newformat",{"0":{"431":1},"2":{"401":1,"431":4,"434":2,"435":2}}],["newunix",{"0":{"430":1},"2":{"401":1,"430":4}}],["newunixnow",{"0":{"429":1},"2":{"401":1,"429":4,"433":2}}],["newbstree",{"0":{"388":1},"2":{"385":1,"388":4,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":4,"397":2}}],["newarraystack",{"0":{"363":1},"2":{"359":1,"363":4,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2}}],["newarrayqueue",{"0":{"288":1},"2":{"282":1,"288":4,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2}}],["newsetfromslice",{"0":{"336":1},"2":{"333":1,"336":4}}],["newset",{"0":{"335":1},"2":{"333":1,"335":4,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":6,"344":2,"345":2,"346":6,"347":2,"348":2,"349":4,"350":4,"351":4,"352":4,"353":6,"354":2}}],["newsinglylink",{"0":{"208":1},"2":{"204":1,"208":4,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2}}],["newpriorityqueue",{"0":{"323":1},"2":{"285":1,"323":4,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2}}],["newlinkedstack",{"0":{"372":1},"2":{"360":1,"372":4,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2}}],["newlinkedqueue",{"0":{"300":1},"2":{"283":1,"300":4,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2}}],["newlist",{"0":{"243":1},"2":{"241":1,"243":5,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":6,"258":4,"259":2,"260":2,"261":4,"262":2,"263":2,"264":2,"265":2,"266":2,"267":4,"268":4,"269":4,"270":4,"271":12,"272":12,"273":2,"274":2,"275":2,"276":2,"277":2}}],["newlrucache",{"2":{"17":4}}],["newdoublylink",{"0":{"224":1},"2":{"205":1,"224":4,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2}}],["newmaxheap",{"0":{"193":1},"2":{"193":5,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2}}],["newconcurrentmap",{"0":{"529":1},"2":{"505":1,"529":6,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2}}],["newcopyonwritelist",{"0":{"138":1},"1":{"139":1},"2":{"136":1,"138":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2}}],["newcircularqueue",{"0":{"311":1},"2":{"284":1,"311":4,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2}}],["newchannel",{"0":{"37":1},"2":{"34":1,"37":4,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2}}],["new",{"0":{"740":1,"893":1},"2":{"133":1,"181":1,"261":1,"267":1,"268":1,"350":1,"351":1,"352":1,"495":4,"509":1,"510":1,"511":1,"515":1,"625":2,"626":2,"627":2,"628":2,"629":2,"641":1,"680":3,"681":3,"738":1,"740":4,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"891":1,"893":5,"894":3,"895":2,"896":6,"897":4,"898":2,"899":6,"900":6,"901":2,"902":2,"903":2,"904":2}}],["net",{"2":{"567":1,"568":1,"574":4,"575":2,"576":2,"579":10,"580":10,"581":2,"582":2,"583":2,"584":2,"911":2}}],["netutil",{"0":{"567":1},"1":{"568":1,"569":1,"570":1,"571":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1},"2":{"0":1,"567":1,"568":2,"569":2,"572":4,"573":4,"574":4,"575":4,"576":4,"577":4,"578":4,"579":8,"580":8,"581":4,"582":6,"583":6,"584":6,"585":4,"586":4,"587":4,"588":4,"589":4,"590":4,"591":6,"592":4,"593":4,"594":6,"595":6}}],["network",{"2":{"0":1}}],["0aw7cq",{"2":{"617":2}}],["0f",{"2":{"576":6}}],["09",{"2":{"576":2}}],["0777",{"2":{"463":2,"464":2,"473":2}}],["07",{"2":{"441":4}}],["035172",{"2":{"616":2}}],["03",{"2":{"431":2,"434":4,"435":4,"440":2}}],["05+08",{"2":{"436":2}}],["05",{"2":{"427":2,"431":2,"432":2,"434":4,"435":6,"436":2}}],["04",{"2":{"427":8,"428":8,"431":2,"432":2,"434":4,"435":6,"436":4,"440":2}}],["024kb",{"2":{"484":2}}],["02t23",{"2":{"436":2}}],["02t15",{"2":{"432":2,"436":2}}],["02",{"2":{"427":10,"428":12,"435":2,"439":4,"440":2,"441":2}}],["06",{"2":{"423":2,"424":2,"440":6}}],["08",{"2":{"408":2,"409":2,"410":2,"411":2,"414":2,"415":2,"416":2,"427":6,"428":8}}],["010",{"2":{"866":2}}],["01",{"2":{"408":2,"409":2,"410":2,"411":2,"412":4,"413":4,"414":2,"415":2,"416":2,"417":2,"418":2,"420":2,"422":2,"427":10,"428":12,"432":2,"435":2,"436":4,"439":8,"441":4}}],["0xc000010250",{"2":{"380":2}}],["0xc000010260",{"2":{"380":2}}],["0xc0000a4060",{"2":{"222":2}}],["0xc0000a4048",{"2":{"222":2}}],["0cc175b9c0f1b6a831c399e269772661",{"2":{"121":2}}],["0jt",{"2":{"114":2}}],["00",{"2":{"408":2,"409":4,"410":6,"411":6,"412":6,"413":6,"423":9,"425":2,"428":6,"436":2}}],["002",{"2":{"82":2}}],["003",{"2":{"82":2}}],["003366",{"2":{"65":2,"66":2}}],["003s",{"2":{"43":2}}],["001",{"2":{"29":4,"82":6}}],["0",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":6,"15":6,"16":2,"17":2,"29":24,"39":10,"52":2,"53":10,"54":10,"55":8,"56":8,"57":8,"58":8,"59":6,"65":2,"66":2,"67":8,"71":10,"72":5,"76":4,"79":2,"80":2,"81":8,"82":8,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"210":3,"213":1,"226":3,"229":1,"244":2,"246":2,"247":4,"248":2,"249":4,"250":2,"254":3,"255":5,"256":3,"263":2,"264":2,"273":2,"274":2,"325":2,"326":2,"327":2,"328":2,"329":2,"340":4,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"439":8,"440":24,"495":2,"496":4,"497":2,"499":2,"501":2,"509":2,"512":2,"530":6,"531":6,"532":4,"533":4,"534":4,"535":4,"536":2,"543":2,"550":4,"551":12,"552":12,"553":12,"554":2,"555":8,"556":2,"559":2,"562":8,"563":10,"564":2,"565":2,"566":8,"579":6,"580":6,"586":2,"587":2,"588":2,"589":2,"590":2,"604":2,"619":4,"625":2,"626":2,"627":2,"628":2,"629":2,"640":9,"643":2,"647":4,"648":2,"649":2,"650":2,"651":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"664":2,"669":4,"670":2,"673":2,"677":2,"678":2,"680":2,"691":2,"697":2,"700":3,"713":2,"716":2,"719":2,"720":2,"722":8,"724":2,"725":2,"730":2,"733":2,"776":2,"780":4,"787":2,"807":2,"814":4,"815":4,"816":4,"817":4,"818":4,"819":4,"820":4,"821":4,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"871":4,"872":4,"873":4,"879":28,"880":16,"881":16,"885":2,"902":6}}],["1c",{"2":{"788":4}}],["1bar",{"2":{"762":2,"763":2,"764":2,"773":2,"774":2}}],["1😄$",{"2":{"762":2,"763":2,"764":2,"773":2,"774":2}}],["192",{"2":{"574":2,"575":2,"579":2,"580":2}}],["13263527980",{"2":{"864":2}}],["1324265",{"2":{"791":2}}],["13242658976",{"2":{"791":4}}],["132",{"2":{"791":4}}],["13",{"2":{"551":2,"552":2}}],["1mib",{"2":{"485":2}}],["1kib",{"2":{"485":2}}],["1kb",{"2":{"484":2}}],["15",{"2":{"421":4,"422":2,"427":2,"435":2,"441":2,"689":4,"690":4}}],["18+",{"0":{"666":1,"667":1,"692":1}}],["180",{"2":{"556":2,"557":2,"562":2,"563":2}}],["18mib",{"2":{"485":2}}],["18",{"2":{"408":4,"409":4,"410":2,"411":2,"412":2,"413":2,"414":4,"415":4,"416":2,"417":2,"418":2,"419":2,"431":2,"434":4,"435":4,"561":2,"576":2,"787":2,"906":5}}],["168",{"2":{"574":2,"575":2,"579":2,"580":2}}],["1682391110",{"2":{"470":2}}],["1690363051331788000",{"2":{"445":2}}],["1690363051331784",{"2":{"444":2}}],["1690363051331",{"2":{"443":2}}],["1690363051",{"2":{"442":2}}],["1647594245",{"2":{"431":2}}],["1647597438",{"2":{"429":2,"430":4,"433":2}}],["1643385599",{"2":{"426":2}}],["1643299200",{"2":{"425":2}}],["16",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"427":6,"428":8,"472":2}}],["125",{"2":{"551":6,"552":6,"553":6}}],["124",{"2":{"551":2,"552":2,"553":2}}],["12492",{"2":{"487":2}}],["12288",{"2":{"487":4}}],["12200",{"2":{"486":2}}],["12000",{"2":{"486":4}}],["12ki",{"2":{"487":2}}],["12k",{"2":{"486":2}}],["127",{"2":{"82":4,"579":2,"580":2,"807":1,"879":4,"880":2,"881":2}}],["12",{"2":{"72":4,"79":2,"80":2,"194":4,"195":4,"196":6,"197":4,"199":4,"277":2,"419":2,"472":2,"486":8,"487":8,"551":2,"552":2,"553":4,"787":2,"788":4,"875":2}}],["1234",{"2":{"678":2}}],["123456",{"2":{"863":2,"865":2,"867":2}}],["123456789",{"2":{"507":4}}],["1234567",{"2":{"481":2,"484":4,"485":4}}],["12345",{"2":{"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"481":2}}],["1230",{"2":{"71":2}}],["123",{"2":{"67":2,"72":8,"75":4,"481":4,"585":4,"595":2,"601":4,"602":4,"603":4,"604":4,"793":2,"862":2,"866":2,"887":2}}],["111",{"2":{"745":2,"746":4,"747":2}}],["112",{"2":{"578":4,"579":2,"580":2}}],["1136214245",{"2":{"432":2}}],["11",{"2":{"71":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"327":2,"328":2,"518":2,"740":2,"741":6,"742":2,"743":4,"744":2,"747":2,"748":4,"749":2,"750":2,"751":2,"791":2}}],["141592653589793",{"2":{"556":2}}],["14",{"2":{"29":2,"417":2,"472":2}}],["1e",{"2":{"29":2}}],["1774mib",{"2":{"485":2}}],["17",{"2":{"7":4,"431":2,"434":4,"435":4}}],["101",{"2":{"74":4}}],["10000000",{"2":{"501":2}}],["10000",{"2":{"483":4}}],["1000",{"2":{"179":2,"484":3,"486":1}}],["100",{"2":{"74":4,"77":2,"82":2,"179":2,"263":4,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"497":4,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"543":2,"689":4,"690":4}}],["1024",{"2":{"484":2,"485":7,"487":1}}],["102",{"2":{"65":2,"66":2}}],["10",{"2":{"7":4,"82":2,"178":1,"194":4,"195":2,"196":2,"197":4,"199":4,"325":4,"326":4,"327":2,"328":2,"329":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"508":2,"543":8,"578":4,"579":2,"580":2,"582":2,"612":2,"619":2,"673":2,"674":2,"678":2,"846":1,"882":2}}],["1",{"0":{"192":1,"204":1,"207":1,"282":1,"287":1,"359":1,"362":1,"385":1,"387":1},"1":{"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"6":8,"7":4,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":13,"15":13,"16":5,"17":8,"23":28,"24":14,"25":10,"26":10,"27":12,"28":12,"29":6,"38":6,"39":8,"40":6,"41":4,"43":4,"44":8,"45":4,"46":10,"52":4,"53":4,"54":4,"55":8,"56":8,"57":8,"58":8,"59":8,"67":2,"69":4,"70":4,"71":6,"73":4,"76":8,"78":4,"81":20,"82":12,"125":1,"139":2,"141":2,"143":2,"145":2,"147":1,"148":4,"149":1,"150":6,"154":4,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":4,"178":1,"181":4,"182":4,"183":2,"184":2,"185":2,"186":4,"193":4,"194":8,"195":6,"196":6,"197":8,"198":4,"199":8,"209":4,"210":10,"211":4,"212":4,"213":5,"214":2,"215":4,"216":4,"217":4,"218":2,"219":2,"220":2,"221":2,"222":4,"225":4,"226":10,"227":4,"228":4,"229":5,"230":2,"231":4,"232":4,"233":2,"234":2,"235":2,"236":2,"237":2,"243":2,"244":4,"245":4,"246":4,"247":7,"248":9,"249":7,"250":9,"251":4,"252":4,"253":4,"254":8,"255":12,"256":11,"257":6,"258":2,"259":2,"260":4,"261":4,"262":2,"264":4,"265":4,"266":4,"267":4,"268":2,"269":4,"270":4,"271":14,"272":12,"273":4,"274":4,"275":6,"276":2,"277":26,"290":4,"291":4,"292":6,"293":4,"294":2,"295":2,"296":2,"297":2,"298":4,"302":4,"303":4,"304":6,"305":4,"306":2,"307":2,"308":2,"309":4,"313":4,"314":4,"315":6,"316":4,"317":2,"318":2,"319":2,"320":2,"321":4,"325":8,"326":8,"327":6,"328":6,"329":6,"335":4,"336":4,"337":4,"338":4,"339":6,"340":4,"341":4,"342":4,"343":6,"344":2,"345":2,"346":6,"347":4,"348":2,"349":2,"350":4,"351":2,"352":4,"353":4,"354":2,"364":4,"365":4,"366":4,"367":4,"368":2,"369":2,"370":2,"373":4,"374":4,"375":4,"376":4,"377":2,"378":2,"379":2,"380":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"404":4,"407":4,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"427":1,"428":1,"438":4,"439":20,"471":3,"482":4,"484":6,"485":4,"495":4,"497":2,"500":2,"507":4,"508":2,"509":2,"510":4,"511":2,"512":4,"513":2,"514":4,"515":12,"516":4,"517":8,"518":2,"519":2,"520":4,"521":6,"522":4,"523":4,"524":4,"525":4,"526":4,"527":2,"528":2,"530":2,"531":2,"532":2,"542":12,"543":4,"544":18,"545":4,"546":14,"548":18,"550":4,"554":15,"555":22,"556":2,"558":4,"559":4,"560":24,"561":8,"562":4,"563":2,"565":10,"566":8,"572":2,"574":2,"575":2,"579":4,"580":4,"581":2,"583":4,"584":4,"585":4,"586":4,"587":4,"588":8,"589":4,"590":8,"591":2,"605":4,"612":2,"619":2,"636":2,"637":10,"639":2,"640":4,"641":4,"642":6,"643":2,"644":4,"645":6,"646":4,"647":3,"648":4,"649":4,"650":2,"651":6,"652":6,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"662":2,"663":2,"664":4,"665":4,"666":6,"668":2,"669":22,"670":3,"671":5,"672":4,"673":3,"674":4,"675":4,"677":2,"678":4,"679":2,"680":4,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":2,"693":4,"697":4,"698":6,"699":4,"700":20,"701":4,"702":2,"703":6,"709":4,"710":4,"711":4,"712":6,"713":2,"714":4,"715":6,"716":2,"717":4,"718":6,"719":10,"720":10,"721":4,"722":10,"723":6,"724":2,"725":2,"726":4,"727":4,"728":2,"729":4,"730":4,"731":4,"732":4,"733":2,"734":4,"742":2,"752":2,"763":4,"764":4,"766":2,"769":2,"770":2,"771":2,"773":4,"774":4,"776":6,"787":11,"788":2,"790":2,"807":1,"814":8,"815":8,"816":8,"817":8,"818":8,"819":8,"820":8,"821":8,"822":8,"823":8,"824":8,"825":8,"826":8,"827":8,"828":8,"829":8,"830":8,"831":8,"832":8,"833":8,"834":8,"835":8,"836":8,"837":8,"838":8,"839":8,"840":8,"841":8,"842":12,"843":12,"844":8,"845":8,"846":12,"847":12,"848":8,"849":8,"871":2,"872":2,"873":2,"879":4,"880":4,"881":4,"885":2,"906":1}}],["olleh",{"2":{"908":2}}],["old",{"2":{"680":3,"681":3}}],["oldvalue",{"2":{"144":2,"163":2,"165":2}}],["oops",{"2":{"895":2}}],["oom",{"2":{"785":2,"786":2}}],["oof",{"2":{"772":2}}],["odd",{"2":{"664":4}}],["occur",{"2":{"807":1}}],["occurs",{"2":{"625":2,"626":2,"627":2,"628":2,"629":2}}],["occurrences",{"2":{"642":1}}],["occurrence",{"2":{"149":1,"165":1,"167":1,"248":1,"250":1,"670":1,"671":1,"758":1,"759":1,"760":1,"761":1}}],["obj",{"2":{"591":2}}],["object",{"2":{"80":1,"171":1,"584":1,"894":1,"898":1,"899":1}}],["omitempty",{"2":{"585":2,"745":2,"746":2}}],["omitted",{"2":{"513":1}}],["omitbyvalues",{"0":{"514":1},"2":{"505":1,"514":4}}],["omitbykeys",{"0":{"513":1},"2":{"505":1,"513":4}}],["omitby",{"0":{"512":1},"2":{"505":1,"512":5}}],["o",{"2":{"463":4,"464":4,"473":4,"787":4}}],["osbit",{"2":{"808":4}}],["os",{"2":{"457":5,"463":6,"464":6,"473":4,"474":4,"475":4,"795":1,"796":1,"800":1,"801":1,"802":1,"808":1}}],["overwritten",{"2":{"901":1}}],["overwrite",{"2":{"454":1,"517":1}}],["overlapping",{"2":{"680":1,"681":1}}],["over",{"2":{"274":1,"348":1,"509":1,"510":1,"511":1,"515":1,"643":1,"656":1,"657":1,"658":1,"659":1,"662":1,"663":1,"664":1,"679":1}}],["overview",{"0":{"0":1}}],["optional",{"2":{"725":1,"789":1}}],["option",{"2":{"629":2,"807":2}}],["opts",{"2":{"629":2,"807":2}}],["operate",{"2":{"596":1}}],["operations",{"2":{"278":2,"446":1,"704":1,"809":1}}],["operation",{"2":{"270":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1}}],["openfile",{"2":{"463":2,"464":2,"473":2}}],["open",{"2":{"457":2}}],["oppoiste",{"2":{"270":1}}],["opposite",{"2":{"52":1,"512":1,"513":1,"514":1}}],["othervalue",{"2":{"646":2}}],["otherwise",{"2":{"532":1,"534":1}}],["other",{"2":{"52":1,"76":1,"257":2,"261":2,"267":3,"268":3,"269":2,"270":2,"343":2,"346":2,"350":3,"351":3,"352":2,"522":1,"523":1,"644":1,"789":1,"911":1}}],["out",{"2":{"38":8,"355":1,"483":2,"807":6,"909":1,"911":1}}],["output",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"38":2,"40":2,"41":2,"42":2,"44":2,"45":2,"46":2,"52":2,"59":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":2,"85":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"131":2,"132":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"530":2,"531":2,"532":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"572":2,"573":2,"574":2,"575":2,"576":2,"578":2,"579":2,"580":2,"583":2,"584":2,"585":2,"594":2,"595":2,"601":2,"602":2,"603":2,"604":2,"605":2,"625":2,"626":2,"627":2,"628":2,"629":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"803":2,"804":2,"805":2,"806":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"903":2,"904":2,"905":2}}],["organizes",{"2":{"907":1}}],["org",{"2":{"577":4,"886":2}}],["origin",{"2":{"353":1,"396":1,"791":3}}],["original",{"2":{"133":2,"261":1,"269":1,"276":1,"715":6,"716":4,"717":4,"718":6,"719":10,"720":10,"721":4,"722":11,"723":6,"724":4,"725":4,"726":4,"727":4,"728":4,"729":4,"730":6,"731":6,"732":6}}],["ordone",{"0":{"44":1},"2":{"34":1,"44":4}}],["ordered",{"2":{"684":2,"685":2,"686":2,"687":2,"688":4}}],["order",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"185":1,"186":1,"217":1,"232":1,"265":1,"391":1,"392":1,"393":1,"394":1,"530":2,"531":2,"532":2,"646":1,"652":1,"676":1,"683":2,"684":1,"685":1,"688":2,"689":1,"690":1,"698":1,"721":1,"772":1,"908":1}}],["or",{"0":{"43":1,"54":1},"2":{"23":1,"24":1,"27":1,"28":1,"29":1,"34":1,"39":2,"43":5,"47":1,"50":1,"54":10,"55":1,"57":1,"91":1,"92":1,"93":1,"94":1,"95":2,"96":1,"97":1,"98":1,"99":1,"106":1,"147":1,"149":1,"183":1,"192":2,"220":1,"235":1,"244":1,"258":1,"295":1,"296":1,"298":1,"307":1,"309":1,"318":1,"319":1,"321":1,"327":1,"328":1,"339":1,"340":1,"342":1,"346":1,"349":1,"352":1,"369":1,"378":1,"396":1,"404":1,"405":1,"406":1,"407":1,"437":1,"440":1,"457":1,"458":1,"459":1,"460":1,"465":1,"466":1,"468":1,"471":1,"493":1,"507":1,"528":1,"531":1,"579":1,"580":1,"582":1,"586":4,"587":4,"588":4,"589":4,"590":4,"594":1,"595":1,"603":1,"604":1,"617":1,"620":1,"629":1,"636":1,"638":1,"657":2,"659":2,"670":1,"671":1,"673":1,"686":1,"688":2,"690":1,"700":1,"726":1,"727":1,"784":1,"787":1,"789":1,"807":2,"808":4,"870":1,"871":1,"872":1,"873":1,"884":2}}],["ok",{"2":{"17":4,"83":6,"144":2,"163":2,"165":2,"195":4,"196":2,"246":4,"252":4,"253":4,"326":2,"340":4,"354":6,"530":4,"531":4,"532":6,"534":10,"535":4,"593":4,"656":4,"657":6,"658":4,"659":6,"713":2,"726":4,"727":4,"728":4,"729":4}}],["ok3",{"2":{"17":4}}],["ok2",{"2":{"17":4}}],["ok1",{"2":{"17":4}}],["once",{"2":{"493":1,"494":1}}],["one",{"2":{"38":1,"39":1,"43":2,"46":1,"403":1,"500":2,"656":1,"657":1,"658":1,"659":1,"660":1,"675":1,"793":1,"794":1,"856":1,"857":1,"858":1,"896":1}}],["only",{"2":{"24":1,"70":1,"77":1,"271":1,"278":1,"585":1,"613":1,"779":1,"780":1,"794":1,"859":1,"884":2}}],["on",{"2":{"16":1,"18":1,"74":1,"78":1,"257":1,"275":1,"525":1,"656":1,"657":1,"658":1,"659":1,"702":1,"718":1,"725":1,"769":1,"770":1,"771":1,"809":1,"894":1}}],["offsetting",{"2":{"787":1}}],["offset",{"2":{"776":3}}],["off",{"2":{"553":1}}],["ofb",{"2":{"98":1,"99":1,"109":1,"110":1}}],["of",{"0":{"601":1,"666":1,"667":1,"692":1,"709":1},"2":{"14":1,"15":1,"16":2,"47":2,"52":1,"59":1,"70":1,"74":1,"81":2,"82":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"140":1,"147":1,"149":2,"157":1,"159":2,"165":1,"167":1,"180":1,"184":1,"185":1,"186":1,"192":3,"197":1,"198":1,"199":1,"200":1,"207":1,"209":1,"218":1,"219":1,"222":1,"223":1,"225":1,"233":1,"234":1,"237":1,"245":1,"247":1,"248":2,"250":2,"252":1,"253":1,"254":2,"255":1,"256":1,"259":1,"260":1,"262":1,"263":1,"265":1,"270":1,"272":1,"273":1,"276":1,"277":1,"278":3,"291":1,"292":1,"293":1,"294":1,"303":1,"304":1,"305":1,"306":1,"314":1,"315":1,"316":1,"317":1,"323":1,"326":1,"329":1,"330":1,"337":1,"344":1,"345":1,"347":1,"348":1,"350":1,"353":1,"354":2,"355":1,"365":1,"366":1,"367":1,"368":1,"374":1,"375":1,"376":1,"377":1,"380":1,"381":1,"390":1,"395":1,"396":1,"397":1,"403":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"423":1,"424":1,"425":2,"426":2,"429":1,"430":1,"431":1,"432":1,"438":1,"439":1,"462":1,"463":1,"464":1,"465":1,"484":1,"485":1,"488":2,"500":1,"501":3,"512":1,"513":1,"514":1,"515":1,"516":1,"518":1,"519":1,"520":1,"521":1,"524":1,"525":1,"536":1,"542":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"554":1,"555":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"599":1,"601":6,"618":1,"619":2,"627":1,"628":1,"639":2,"642":2,"643":2,"644":1,"645":1,"646":2,"647":1,"648":1,"649":1,"650":1,"651":1,"654":1,"656":1,"657":1,"658":1,"659":1,"662":1,"663":1,"664":1,"665":3,"668":1,"670":1,"671":1,"672":1,"674":1,"678":1,"679":1,"680":2,"681":2,"683":1,"688":1,"691":1,"694":1,"695":1,"697":1,"698":1,"699":1,"704":1,"707":1,"709":4,"714":2,"716":2,"717":3,"718":2,"719":3,"720":2,"721":1,"723":2,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":2,"740":1,"742":1,"743":1,"745":1,"758":1,"759":1,"760":2,"761":2,"765":1,"767":1,"768":1,"776":1,"780":1,"785":2,"786":2,"787":2,"788":1,"789":1,"790":1,"793":1,"803":1,"804":1,"807":1,"816":1,"817":2,"820":1,"821":2,"824":1,"825":2,"828":1,"829":2,"832":1,"833":2,"836":1,"837":2,"840":1,"841":2,"844":1,"845":2,"848":1,"849":2,"886":3,"900":1,"901":2,"903":1,"906":6,"910":1,"911":1}}],["==",{"0":{"440":1},"2":{"16":2,"81":2,"166":2,"249":4,"250":4,"277":2,"345":2,"509":2,"512":2,"626":2,"627":2,"628":2,"629":2,"637":12,"643":2,"646":2,"650":2,"651":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"664":2,"673":2,"691":2,"698":1,"716":2}}],["=",{"2":{"6":8,"7":8,"8":8,"9":8,"10":8,"11":8,"12":8,"13":10,"14":12,"15":12,"16":8,"17":10,"23":14,"24":8,"25":16,"26":18,"27":16,"28":18,"29":12,"37":2,"38":16,"39":14,"40":8,"41":6,"42":10,"43":8,"44":8,"45":10,"46":10,"52":22,"59":8,"65":4,"66":8,"67":6,"68":4,"69":6,"70":8,"71":12,"72":10,"73":6,"74":4,"75":2,"76":14,"77":4,"78":4,"79":2,"80":6,"81":8,"82":8,"83":4,"84":4,"85":4,"91":8,"92":8,"93":8,"94":8,"95":8,"96":8,"97":8,"98":8,"99":8,"100":2,"101":2,"102":8,"103":8,"104":8,"105":8,"106":8,"107":8,"108":8,"109":8,"110":8,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":6,"119":4,"120":2,"121":2,"122":2,"123":2,"124":4,"125":2,"126":4,"127":2,"128":4,"129":2,"130":4,"131":10,"132":10,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"178":2,"179":2,"180":4,"181":4,"182":6,"183":2,"184":2,"185":4,"186":4,"193":6,"194":10,"195":12,"196":12,"197":10,"198":10,"199":10,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":4,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":4,"232":2,"233":4,"234":2,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":4,"247":2,"248":2,"249":2,"250":2,"251":2,"252":4,"253":4,"254":2,"255":2,"256":2,"257":6,"258":4,"259":2,"260":4,"261":6,"262":2,"263":4,"264":2,"265":2,"266":2,"267":6,"268":6,"269":6,"270":6,"271":12,"272":12,"273":6,"274":10,"275":4,"276":2,"277":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":4,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":10,"326":12,"327":10,"328":10,"329":10,"335":2,"336":2,"337":2,"338":2,"339":6,"340":10,"341":2,"342":2,"343":6,"344":2,"345":4,"346":6,"347":6,"348":2,"349":4,"350":6,"351":6,"352":6,"353":10,"354":4,"363":2,"364":2,"365":4,"366":4,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":4,"375":4,"376":2,"377":2,"378":2,"379":2,"380":2,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"396":8,"397":6,"404":10,"405":10,"406":10,"407":10,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":8,"428":6,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":4,"436":4,"437":4,"438":10,"439":12,"440":12,"441":4,"442":2,"443":2,"444":2,"445":2,"451":4,"452":2,"453":2,"454":4,"455":2,"456":4,"457":6,"458":2,"459":2,"460":4,"461":2,"462":4,"463":6,"464":6,"465":4,"466":4,"467":4,"468":2,"469":2,"470":2,"471":6,"472":2,"473":14,"474":14,"475":14,"481":6,"482":4,"483":6,"484":8,"485":8,"486":8,"487":8,"493":2,"494":2,"495":8,"496":8,"497":6,"498":2,"499":6,"500":10,"501":8,"507":4,"508":2,"509":6,"510":4,"511":4,"512":6,"513":4,"514":4,"515":12,"516":4,"517":6,"518":6,"519":4,"520":4,"521":4,"522":4,"523":4,"524":4,"525":2,"526":4,"527":10,"528":8,"529":2,"530":8,"531":8,"532":6,"533":6,"534":10,"535":8,"536":4,"542":6,"543":6,"544":6,"545":6,"546":4,"547":6,"548":4,"549":6,"550":6,"551":6,"552":6,"553":6,"554":8,"555":8,"556":6,"557":6,"558":2,"559":8,"560":10,"561":6,"562":10,"563":10,"564":6,"565":4,"566":6,"572":4,"573":6,"574":4,"575":2,"576":2,"577":4,"578":6,"579":6,"580":6,"581":6,"582":4,"583":14,"584":14,"585":4,"586":10,"587":12,"588":14,"589":8,"590":14,"591":14,"592":2,"593":2,"594":4,"595":4,"601":4,"602":8,"603":12,"604":12,"605":10,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":4,"619":2,"625":8,"626":10,"627":8,"628":10,"629":10,"635":4,"636":4,"637":12,"638":4,"639":12,"640":8,"641":4,"642":6,"643":6,"644":6,"645":8,"646":8,"647":6,"648":8,"649":8,"650":8,"651":10,"652":10,"653":8,"654":6,"655":6,"656":6,"657":6,"658":6,"659":6,"660":4,"661":4,"662":6,"663":2,"664":6,"665":6,"666":4,"667":4,"668":6,"669":10,"670":6,"671":6,"672":6,"673":6,"674":6,"675":6,"676":2,"677":6,"678":4,"679":2,"680":12,"681":2,"682":2,"683":4,"684":6,"685":6,"686":6,"687":6,"688":4,"689":4,"690":6,"691":6,"692":4,"693":6,"694":2,"695":10,"696":2,"697":4,"698":6,"699":6,"700":10,"701":2,"702":2,"703":6,"709":4,"710":4,"711":8,"712":4,"713":10,"714":8,"715":8,"716":6,"717":6,"718":8,"719":10,"720":10,"721":4,"722":10,"723":4,"724":4,"725":4,"726":4,"727":4,"728":4,"729":4,"730":6,"731":6,"732":6,"733":4,"734":4,"740":4,"741":8,"742":6,"743":6,"744":4,"745":8,"746":6,"747":12,"748":8,"749":8,"750":8,"751":8,"752":6,"758":10,"759":10,"760":8,"761":8,"762":6,"763":6,"764":6,"765":6,"766":10,"767":6,"768":6,"769":14,"770":14,"771":14,"772":4,"773":6,"774":6,"775":26,"776":12,"777":8,"778":10,"779":12,"780":12,"781":4,"782":4,"783":4,"784":6,"785":4,"786":4,"787":12,"788":6,"789":8,"790":6,"791":10,"792":6,"793":8,"794":6,"800":2,"801":2,"802":2,"803":4,"804":4,"805":8,"806":6,"807":8,"808":2,"814":2,"815":4,"816":2,"817":2,"818":2,"819":4,"820":2,"821":2,"822":2,"823":4,"824":2,"825":2,"826":2,"827":4,"828":2,"829":2,"830":2,"831":4,"832":2,"833":2,"834":2,"835":4,"836":2,"837":2,"838":2,"839":4,"840":2,"841":2,"842":2,"843":4,"844":2,"845":2,"846":2,"847":4,"848":2,"849":2,"855":6,"856":6,"857":6,"858":6,"859":6,"860":6,"861":6,"862":10,"863":4,"864":4,"865":4,"866":4,"867":4,"868":6,"869":4,"870":6,"871":8,"872":8,"873":8,"874":8,"875":8,"876":8,"877":8,"878":4,"879":8,"880":4,"881":4,"882":4,"883":6,"884":4,"885":8,"886":6,"887":10,"893":2,"894":4,"895":8,"896":4,"897":6,"898":4,"899":10,"900":10,"901":4,"902":6,"903":6,"904":2,"905":8,"908":4}}],["host",{"2":{"594":3,"595":3}}],["hour",{"2":{"405":2,"415":1,"416":1,"425":1,"426":1}}],["hours",{"2":{"405":1}}],["httpdelete",{"0":{"589":1},"2":{"589":4}}],["httpdeletedeprecated",{"2":{"570":1}}],["httpget",{"0":{"586":1},"2":{"586":4,"591":2}}],["httpgetdeprecated",{"2":{"570":1}}],["httppatch",{"0":{"590":1},"2":{"590":4}}],["httppatchdeprecated",{"2":{"570":1}}],["httpput",{"0":{"588":1},"2":{"588":4}}],["httpputdeprecated",{"2":{"570":1}}],["httppost",{"0":{"587":1},"2":{"587":4}}],["httppostdeprecated",{"2":{"570":1}}],["httpclientcfg",{"2":{"582":4}}],["httpclientconfig",{"2":{"582":8}}],["httpclienttype",{"2":{"582":1}}],["httpclient",{"0":{"582":1},"2":{"570":1,"582":8,"583":9,"584":8}}],["httprequest",{"0":{"581":1},"2":{"570":1,"581":5,"583":4,"584":2}}],["http",{"2":{"567":1,"568":1,"573":4,"578":7,"581":5,"582":5,"583":3,"584":3,"586":9,"587":9,"588":9,"589":9,"590":9,"591":3,"593":2,"868":2,"883":2,"911":1}}],["https",{"2":{"2":3,"19":2,"31":1,"48":1,"61":1,"87":2,"134":2,"174":1,"188":1,"201":2,"239":1,"279":4,"331":1,"356":2,"382":1,"399":2,"447":1,"477":2,"489":2,"503":1,"538":1,"568":2,"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"597":1,"607":1,"621":1,"631":1,"705":1,"736":2,"754":1,"796":1,"810":1,"851":1,"889":1}}],["human",{"2":{"484":1,"485":1,"486":1,"487":1}}],["hh",{"2":{"403":10,"421":1,"422":1,"427":4,"428":4,"431":1,"434":1,"441":4}}],["h",{"2":{"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["hm",{"2":{"178":4,"179":4,"180":6,"181":8,"182":12,"183":10,"184":12,"185":12,"186":12}}],["hms",{"2":{"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":2}}],["hmacsha512withbase64",{"0":{"118":1},"2":{"89":1,"118":4}}],["hmacsha512",{"0":{"117":1},"2":{"89":1,"117":4}}],["hmacsha256withbase64",{"0":{"116":1},"2":{"89":1,"116":4}}],["hmacsha256",{"0":{"115":1},"2":{"89":1,"115":4}}],["hmacsha1withbase64",{"0":{"114":1},"2":{"89":1,"114":4}}],["hmacsha1",{"0":{"113":1},"2":{"89":1,"113":4}}],["hmacmd5withbase64",{"0":{"112":1},"2":{"89":1,"112":4}}],["hmacmd5",{"0":{"111":1},"2":{"89":1,"111":4}}],["hmac",{"2":{"86":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1}}],["hide",{"2":{"791":1}}],["hidestring",{"0":{"791":1},"2":{"756":1,"791":10}}],["high",{"2":{"735":1,"895":4,"896":2,"897":2,"898":4,"901":4,"903":4}}],["highindex",{"2":{"14":2,"15":2}}],["hi",{"2":{"74":4,"674":10}}],["handshaketimeout",{"2":{"582":4}}],["have",{"2":{"52":1,"497":1,"527":1}}],["hassle",{"2":{"911":1}}],["hassuffixany",{"0":{"786":1},"2":{"756":1,"786":6}}],["hassubtree",{"0":{"396":1},"2":{"385":1,"396":6}}],["hasprefixany",{"0":{"785":1},"2":{"756":1,"785":6}}],["haskey",{"0":{"528":1},"2":{"505":1,"528":10}}],["hasnext",{"2":{"274":2}}],["hashmapfunc",{"2":{"178":1,"179":1}}],["hashmap",{"0":{"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1},"2":{"173":1,"174":2,"175":4,"178":6,"179":6,"180":7,"181":7,"182":7,"183":7,"184":7,"185":7,"186":7}}],["hash",{"2":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"125":1,"127":1}}],["has",{"0":{"535":1},"2":{"52":2,"200":1,"207":1,"223":1,"346":1,"381":1,"387":1,"505":1,"528":3,"535":5,"585":1}}],["here",{"2":{"908":1}}],["helpers",{"2":{"888":1}}],["helloworld",{"2":{"794":2}}],["hello",{"2":{"42":8,"74":4,"84":2,"85":4,"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":2,"101":2,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"122":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"131":4,"132":4,"463":4,"464":4,"474":4,"475":4,"493":4,"494":6,"498":4,"781":4,"785":2,"786":2,"787":2,"792":6,"793":6,"794":4,"855":2,"908":2}}],["headers",{"2":{"581":4}}],["header",{"2":{"578":4,"581":10,"586":8,"587":8,"588":8,"589":4,"590":8,"591":4}}],["head",{"2":{"211":1,"227":1,"291":1,"292":1,"303":1,"304":1,"314":1,"315":1,"326":1}}],["heap",{"0":{"187":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1},"2":{"11":1,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"187":2,"188":1,"189":4,"192":1,"193":6,"194":7,"195":8,"196":8,"197":7,"198":7,"199":7}}],["heapsort",{"0":{"11":1},"2":{"4":1,"11":4}}],["hex",{"2":{"65":1,"66":1}}],["v9",{"2":{"843":4,"845":4,"847":4,"849":4}}],["v8",{"2":{"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v7",{"2":{"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v6",{"2":{"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v5",{"2":{"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v4",{"2":{"823":4,"825":4,"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v3",{"2":{"819":4,"821":4,"823":4,"825":4,"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v+1",{"2":{"662":2}}],["very",{"2":{"704":1}}],["version",{"2":{"618":1,"906":5}}],["verbose",{"2":{"582":2}}],["vtype",{"2":{"525":1}}],["variable",{"2":{"695":1,"803":1,"804":1,"805":1}}],["var",{"2":{"80":2,"348":2,"495":2,"498":2,"501":2,"507":2,"508":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"572":2,"583":2,"584":2,"626":2,"662":2,"663":2}}],["validation",{"2":{"850":1}}],["validator",{"0":{"850":1},"1":{"851":1,"852":1,"853":1,"854":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1},"2":{"0":1,"84":4,"850":1,"851":2,"852":2,"855":8,"856":8,"857":8,"858":8,"859":8,"860":8,"861":8,"862":12,"863":6,"864":6,"865":6,"866":6,"867":6,"868":8,"869":6,"870":8,"871":10,"872":10,"873":10,"874":10,"875":10,"876":10,"877":10,"878":6,"879":10,"880":6,"881":6,"882":6,"883":8,"884":6,"885":10,"886":4,"887":12}}],["valid",{"2":{"84":2,"85":2,"741":1,"744":1,"864":1,"868":1,"877":1,"886":1,"905":1}}],["val",{"2":{"83":4,"180":4,"181":4,"182":8,"195":4,"196":4,"314":4,"326":4,"340":8,"354":4,"365":4,"366":4,"374":4,"375":4,"495":2,"530":2,"531":2,"532":4,"534":6,"550":3,"697":4,"905":2}}],["value3",{"2":{"718":2}}],["value2",{"2":{"718":2}}],["value1",{"2":{"718":2}}],["valuefunc",{"2":{"493":1,"494":1}}],["valueof",{"0":{"155":1,"246":1},"1":{"156":1},"2":{"83":2,"136":1,"155":2,"156":2,"241":1,"246":4}}],["valuesfunc",{"2":{"585":1}}],["valuesby",{"0":{"521":1},"2":{"505":1,"521":4}}],["valuestream",{"2":{"45":2}}],["values",{"0":{"186":1,"209":1,"225":1,"337":1,"519":1,"901":1},"2":{"23":1,"24":1,"29":1,"40":3,"41":3,"45":1,"176":1,"186":9,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"204":1,"205":1,"209":4,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"221":2,"225":4,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"236":2,"323":1,"333":1,"335":2,"336":2,"337":4,"338":2,"339":2,"340":2,"341":2,"350":2,"351":2,"352":2,"353":4,"495":6,"505":1,"511":4,"514":2,"519":11,"521":6,"523":1,"573":1,"581":6,"585":2,"586":2,"587":4,"588":2,"589":2,"590":2,"640":2,"645":1,"646":2,"654":1,"668":1,"672":1,"673":1,"683":1,"691":1,"698":1,"709":1,"815":1,"819":1,"823":1,"827":1,"831":1,"835":1,"839":1,"843":1,"847":1,"891":1,"893":2,"895":6,"898":2,"901":6,"903":2}}],["value",{"0":{"746":1},"2":{"17":2,"23":1,"24":1,"25":2,"26":2,"27":2,"28":2,"52":6,"59":1,"68":1,"71":4,"72":4,"73":2,"75":3,"76":3,"77":2,"78":4,"83":5,"119":1,"120":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"147":1,"155":1,"173":1,"180":1,"181":4,"182":1,"184":7,"192":2,"194":3,"195":2,"196":1,"200":1,"207":1,"209":1,"210":3,"211":3,"212":3,"213":1,"214":1,"215":1,"216":2,"218":2,"222":6,"223":1,"225":1,"226":3,"227":3,"228":3,"229":1,"230":1,"231":1,"233":2,"244":3,"246":1,"247":3,"248":3,"250":1,"251":3,"252":1,"253":1,"254":1,"255":3,"256":3,"264":1,"298":3,"302":2,"309":3,"313":2,"321":3,"354":1,"364":2,"373":2,"380":6,"381":1,"389":1,"390":1,"403":1,"430":1,"471":1,"481":4,"493":1,"494":1,"508":7,"509":11,"512":6,"514":1,"515":1,"521":1,"522":2,"523":2,"524":7,"525":9,"526":2,"529":2,"530":3,"531":1,"532":4,"533":1,"534":2,"535":1,"536":7,"542":1,"546":1,"547":1,"548":1,"549":1,"556":2,"557":2,"566":1,"601":1,"602":1,"603":1,"604":2,"605":3,"636":1,"646":2,"652":1,"657":2,"659":2,"667":1,"669":2,"678":1,"700":2,"718":2,"725":1,"726":1,"727":1,"738":1,"740":2,"743":2,"746":5,"749":1,"766":1,"803":1,"804":3,"871":1,"872":1,"873":1,"885":4,"898":3,"901":1,"905":1}}],["val2",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4}}],["val1",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4}}],["vfunc",{"2":{"74":1,"275":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"517":1,"518":1,"519":1,"522":1}}],["v",{"2":{"17":16,"38":4,"39":4,"40":4,"42":4,"43":2,"44":4,"45":4,"46":4,"73":2,"74":5,"78":6,"83":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"246":4,"249":1,"252":4,"253":4,"275":5,"354":2,"482":2,"483":2,"508":6,"509":7,"510":5,"511":7,"512":7,"513":5,"514":7,"515":5,"516":4,"517":5,"518":5,"519":5,"520":4,"521":10,"522":7,"523":10,"524":10,"525":9,"526":4,"527":4,"528":4,"529":4,"530":4,"531":4,"532":6,"533":2,"534":4,"535":2,"536":4,"601":2,"645":4,"657":2,"659":2,"662":2,"672":4,"673":2,"674":2,"678":2,"679":2,"689":2,"699":4,"741":2,"762":4,"763":4,"764":4,"765":4,"766":2,"767":4,"768":4,"773":4,"774":4,"784":2,"814":4,"815":4,"817":4,"818":6,"819":6,"821":6,"822":8,"823":8,"825":8,"826":10,"827":10,"829":10,"830":12,"831":12,"833":12,"834":14,"835":14,"837":14,"838":16,"839":16,"841":16,"842":18,"843":18,"845":18,"846":20,"847":20,"849":20,"871":2,"872":2,"873":2,"905":4}}],["v10",{"2":{"847":4,"849":4}}],["v1",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"526":6,"547":12,"549":12,"646":4,"677":4,"815":4,"817":4,"819":4,"821":4,"823":4,"825":4,"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4,"906":5}}],["v2func",{"2":{"526":1}}],["v2",{"2":{"3":2,"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"17":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"189":2,"193":6,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":6,"326":6,"327":6,"328":6,"329":6,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"383":2,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"396":6,"397":6,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":7,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":14,"548":2,"549":14,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":4,"593":2,"594":2,"595":2,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"622":2,"625":2,"626":2,"627":2,"628":2,"629":2,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":6,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":6,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"811":2,"814":2,"815":6,"816":2,"817":6,"818":2,"819":6,"820":2,"821":6,"822":2,"823":6,"824":2,"825":6,"826":2,"827":6,"828":2,"829":6,"830":2,"831":6,"832":2,"833":6,"834":2,"835":6,"836":2,"837":6,"838":2,"839":6,"840":2,"841":6,"842":2,"843":6,"844":2,"845":6,"846":2,"847":6,"848":2,"849":6,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":6,"907":2,"908":2}}],["u0000",{"2":{"887":2}}],["u00a0",{"2":{"781":2}}],["u200bworld",{"2":{"781":2}}],["uuid",{"2":{"618":5}}],["uuidv4",{"0":{"618":1},"2":{"609":1,"618":4}}],["urlencoded",{"2":{"587":2}}],["urladdr",{"2":{"573":4}}],["urlstr",{"2":{"573":2}}],["url",{"2":{"572":1,"573":1,"581":6,"585":3,"586":8,"587":8,"588":8,"589":8,"590":8,"591":4,"592":3,"883":1}}],["uints",{"2":{"688":1}}],["uintfunc",{"2":{"545":1}}],["uint",{"2":{"483":2,"545":3,"627":2,"689":2,"690":3,"776":2}}],["uint64",{"2":{"179":6,"486":2,"487":2}}],["uppersnakecase",{"0":{"774":1},"2":{"756":1,"774":4}}],["upperfirst",{"0":{"768":1},"2":{"756":1,"768":4}}],["upperkebabcase",{"0":{"764":1},"2":{"756":1,"764":5}}],["upper",{"2":{"614":1,"764":1,"765":1,"768":1,"774":1,"858":1,"860":1,"901":1}}],["upload",{"2":{"593":1}}],["uploadfile",{"0":{"593":1},"2":{"570":1,"593":4}}],["up",{"2":{"551":1,"552":1,"760":1,"761":1}}],["update",{"2":{"256":1,"700":1}}],["updateat",{"0":{"256":1,"700":1},"2":{"241":1,"256":8,"633":1,"700":12}}],["uptime",{"2":{"82":8}}],["unbox",{"0":{"815":1,"819":1,"823":1,"827":1,"831":1,"835":1,"839":1,"843":1,"847":1},"2":{"812":9,"815":5,"819":5,"823":5,"827":5,"831":5,"835":5,"839":5,"843":5,"847":5}}],["unordered",{"2":{"788":1}}],["unwarpordefault",{"0":{"604":1},"2":{"599":1,"604":8}}],["unwarpor",{"0":{"603":1},"2":{"599":1,"603":8}}],["unwrapped",{"2":{"895":1}}],["unwrap",{"0":{"602":1,"778":1,"895":1,"897":1},"2":{"599":1,"602":6,"756":1,"778":13,"891":2,"895":4,"897":4,"905":1}}],["underlying",{"2":{"605":1,"746":1}}],["under",{"2":{"484":1,"485":1}}],["unzip10",{"0":{"849":1},"2":{"812":1,"849":4}}],["unzip9",{"0":{"845":1},"2":{"812":1,"845":4}}],["unzip8",{"0":{"841":1},"2":{"812":1,"841":4}}],["unzip7",{"0":{"837":1},"2":{"812":1,"837":4}}],["unzip6",{"0":{"833":1},"2":{"812":1,"833":4}}],["unzip5",{"0":{"829":1},"2":{"812":1,"829":4}}],["unzip4",{"0":{"825":1},"2":{"812":1,"825":4}}],["unzip3",{"0":{"821":1},"2":{"812":1,"821":4}}],["unzip2",{"0":{"817":1},"2":{"812":1,"817":4}}],["unzip",{"0":{"467":1},"2":{"449":1,"467":5}}],["unit",{"2":{"871":1}}],["unix",{"2":{"429":3,"430":5,"431":3,"432":3,"433":1,"470":1}}],["unionby",{"0":{"699":1},"2":{"633":1,"699":5}}],["union",{"0":{"267":1,"350":1,"698":1},"2":{"241":1,"267":4,"333":1,"350":4,"633":1,"698":4,"699":1}}],["uniqueby",{"0":{"697":1},"2":{"633":1,"697":4}}],["unique",{"0":{"266":1,"696":1},"2":{"241":1,"266":4,"633":1,"668":1,"696":4,"698":1}}],["unmarshal",{"2":{"82":1}}],["unexported",{"2":{"81":5}}],["until",{"2":{"38":1,"39":1,"40":1,"42":1,"44":1,"46":1,"497":1,"499":1,"620":1,"629":1}}],["utf",{"2":{"886":2}}],["utf8data",{"2":{"84":6,"85":6}}],["utf8",{"2":{"84":3,"85":3,"886":1}}],["utf8togbk",{"0":{"84":1},"2":{"63":1,"84":4,"85":2}}],["util",{"2":{"596":1,"910":1}}],["utility",{"2":{"0":1,"911":1}}],["utc",{"2":{"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"428":6}}],["ufunc",{"2":{"59":1,"672":1,"673":1,"674":1,"678":1,"679":1}}],["u",{"2":{"53":4,"54":4,"55":4,"56":4,"57":4,"58":4,"59":7,"82":4,"653":6,"665":6,"672":5,"673":5,"674":5,"678":9,"679":9,"702":6}}],["using",{"2":{"547":1,"549":1,"698":1,"725":1}}],["username",{"2":{"896":4,"897":4,"903":4}}],["users",{"2":{"689":8,"690":6,"906":2}}],["userid",{"2":{"581":2,"583":4,"584":4,"585":8,"587":2,"588":4,"590":4,"591":4}}],["user",{"2":{"483":8,"689":6,"690":4}}],["uses",{"2":{"133":1}}],["useing",{"2":{"131":1,"132":1}}],["used",{"2":{"82":14,"323":1,"501":1,"528":1,"581":1,"582":1}}],["use",{"0":{"440":1,"656":1,"658":1,"666":1,"667":1,"690":1,"692":1},"2":{"67":1,"82":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"114":1,"116":1,"118":1,"257":1,"529":1,"583":1,"586":1,"587":1,"588":1,"589":1,"590":1,"677":1,"688":1,"741":4,"807":2,"906":2,"907":2}}],["useful",{"2":{"47":1}}],["usage",{"0":{"3":1,"20":1,"32":1,"49":1,"62":1,"88":1,"175":1,"189":1,"202":1,"240":1,"280":1,"332":1,"357":1,"383":1,"400":1,"448":1,"478":1,"490":1,"569":1,"598":1,"608":1,"622":1,"632":1,"706":1,"737":1,"755":1,"797":1,"811":1,"852":1,"890":1,"907":1}}],["bits",{"2":{"808":1}}],["bin",{"2":{"807":1}}],["binarybytes",{"0":{"485":1},"2":{"479":1,"485":10}}],["binary",{"2":{"187":1,"192":1,"387":1,"389":1,"390":1,"395":1,"397":1,"485":1}}],["binaryiterativesearch",{"0":{"15":1},"2":{"4":1,"15":7}}],["binarysearch",{"0":{"14":1},"2":{"4":1,"14":7}}],["bcde",{"2":{"776":2}}],["bcd",{"2":{"776":2}}],["bfoo",{"2":{"771":2}}],["bfooba",{"2":{"769":2}}],["bfoob",{"2":{"769":2}}],["bf",{"2":{"576":2}}],["b=",{"2":{"573":4}}],["b=2",{"2":{"572":2}}],["b2",{"2":{"523":2}}],["break",{"2":{"348":1,"663":1}}],["bridge",{"0":{"38":1},"2":{"34":1,"38":4}}],["bstree",{"0":{"385":1,"387":1},"1":{"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"382":1,"387":2,"388":9,"389":8,"390":10,"391":8,"392":8,"393":8,"394":8,"395":8,"396":4,"397":8}}],["bs",{"2":{"84":2,"85":2}}],["beginfrom",{"2":{"411":2}}],["begin",{"2":{"410":1,"411":1,"658":1}}],["beginning",{"2":{"408":1,"411":1,"412":1,"413":1,"419":1,"789":1}}],["beginofyear",{"0":{"413":1},"2":{"401":1,"413":4}}],["beginofmonth",{"0":{"412":1},"2":{"401":1,"412":4}}],["beginofminute",{"0":{"408":1},"2":{"401":1,"408":4}}],["beginofweek",{"0":{"411":1},"2":{"401":1,"411":4}}],["beginofday",{"0":{"410":1},"2":{"401":1,"410":4}}],["beginofhour",{"0":{"409":1},"2":{"401":1,"409":4}}],["beforelast",{"0":{"761":1},"2":{"756":1,"761":10}}],["before",{"0":{"494":1,"760":1},"2":{"491":1,"494":4,"756":1,"760":10}}],["before1year",{"2":{"407":4}}],["before2minutes",{"2":{"406":4}}],["before2hours",{"2":{"405":4}}],["below",{"2":{"403":1,"906":3,"907":1}}],["betweenseconds",{"0":{"438":1},"2":{"401":1,"438":6}}],["between",{"2":{"169":1,"210":1,"226":1,"254":1,"255":1,"256":1,"276":1,"438":1,"612":1}}],["be",{"2":{"73":1,"77":1,"80":1,"81":2,"82":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"213":1,"229":1,"268":1,"351":1,"403":1,"431":1,"457":1,"465":1,"471":1,"500":1,"582":1,"586":8,"587":8,"588":8,"589":8,"590":8,"664":1,"670":1,"671":1,"673":1,"689":1,"690":2,"719":1,"720":1,"762":1,"763":1,"764":1,"773":1,"774":1,"886":1,"901":1,"903":1,"908":1}}],["blue",{"2":{"65":2,"66":2}}],["blob",{"2":{"2":3,"19":2,"31":1,"48":1,"61":1,"87":2,"134":2,"174":1,"188":1,"201":2,"239":1,"279":4,"331":1,"356":2,"382":1,"399":2,"447":1,"477":2,"489":2,"503":1,"538":1,"568":2,"597":1,"607":1,"621":1,"631":1,"705":1,"736":2,"754":1,"796":1,"810":1,"851":1,"889":1}}],["bucket",{"2":{"593":2}}],["buffer",{"2":{"483":2}}],["buf",{"2":{"483":6}}],["but",{"2":{"55":1,"330":1,"352":1,"353":1,"518":1,"529":1,"679":1,"693":1}}],["bubble",{"2":{"6":1}}],["bubblesort",{"0":{"6":1},"2":{"4":1,"6":4}}],["bafoo",{"2":{"771":2}}],["bafooba",{"2":{"769":2}}],["barbfoo",{"2":{"771":2}}],["barfoo",{"2":{"771":2}}],["bar大",{"2":{"767":4,"768":4}}],["bar$baz",{"2":{"762":2}}],["bar",{"2":{"758":12,"759":8,"760":4,"761":6,"763":10,"764":12,"765":4,"767":8,"768":8,"769":14,"770":14,"771":14,"773":10,"774":12,"785":4,"786":6,"787":2}}],["baidu",{"2":{"594":2,"595":4}}],["baz",{"2":{"528":4,"758":4,"759":8,"760":2,"761":2}}],["back",{"0":{"293":1,"305":1,"316":1},"2":{"282":1,"283":1,"284":1,"293":4,"305":4,"316":4}}],["background",{"2":{"38":2,"39":2,"40":2,"41":2,"42":2,"44":2,"45":2,"46":2}}],["bash",{"2":{"807":1}}],["base64str",{"2":{"100":4}}],["base64stddecode",{"0":{"101":1},"2":{"89":1,"101":4}}],["base64stdencode",{"0":{"100":1},"2":{"89":1,"100":4}}],["base64",{"2":{"86":1,"100":1,"101":1,"112":1,"114":1,"116":1,"118":1,"120":1,"122":1,"125":1,"127":1,"129":1,"863":3}}],["based",{"2":{"74":1,"78":1,"275":1,"525":1,"702":1,"894":1}}],["base",{"2":{"16":1,"133":1,"484":1,"485":1,"486":1,"487":1,"507":1,"564":3}}],["basic",{"2":{"1":1,"87":1,"446":1,"606":1}}],["bonjour",{"2":{"779":4,"780":2}}],["bodyparams",{"2":{"588":4,"590":4}}],["body",{"2":{"581":2,"586":8,"587":8,"588":8,"589":8,"590":8}}],["boilerplate",{"2":{"528":1}}],["bob",{"2":{"472":2}}],["both",{"2":{"23":1,"53":1,"55":1,"57":1,"58":1,"192":1,"268":1,"351":1,"352":1,"673":1,"693":1,"712":1}}],["boolfunc",{"2":{"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"151":1,"153":1,"157":1,"159":1,"161":1,"171":1,"183":1,"220":1,"235":1,"244":1,"257":1,"258":1,"271":1,"272":1,"290":1,"295":1,"296":1,"298":1,"307":1,"309":1,"318":1,"319":1,"321":1,"325":1,"327":1,"328":1,"339":1,"340":1,"342":1,"343":1,"346":1,"349":1,"369":1,"378":1,"396":1,"437":1,"440":1,"452":1,"458":1,"459":1,"460":1,"468":1,"499":1,"527":1,"528":1,"535":1,"559":1,"579":1,"580":1,"594":1,"595":1,"636":1,"637":1,"638":1,"652":1,"653":1,"654":1,"684":1,"685":1,"686":1,"687":1,"691":1,"730":1,"731":1,"732":1,"744":1,"747":1,"748":1,"749":1,"752":1,"766":1,"784":1,"785":1,"786":1,"792":1,"793":1,"800":1,"801":1,"802":1,"806":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"900":1}}],["bool",{"0":{"52":1},"2":{"16":4,"17":4,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"50":1,"52":26,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"67":3,"81":6,"82":2,"83":2,"144":2,"151":1,"153":1,"157":1,"159":1,"161":1,"163":2,"165":4,"166":2,"167":2,"171":1,"183":1,"195":2,"196":2,"220":1,"235":1,"244":1,"246":2,"249":6,"250":6,"252":2,"253":2,"257":1,"258":1,"271":1,"272":1,"275":4,"277":4,"290":1,"291":2,"295":1,"296":1,"298":1,"307":1,"309":1,"314":2,"318":1,"319":1,"321":1,"325":1,"326":2,"327":1,"328":1,"335":2,"339":1,"340":7,"342":1,"343":1,"346":1,"348":4,"349":1,"354":2,"369":1,"378":1,"396":1,"437":1,"440":1,"452":1,"458":1,"459":1,"460":1,"468":1,"473":2,"475":2,"499":2,"501":2,"509":4,"512":4,"524":2,"527":1,"528":1,"531":2,"532":2,"534":2,"535":1,"536":4,"547":8,"549":8,"559":1,"579":1,"580":1,"582":6,"583":2,"584":2,"591":2,"593":2,"594":1,"595":1,"636":1,"637":11,"638":1,"640":2,"643":4,"646":4,"650":8,"651":8,"652":1,"653":5,"654":5,"655":4,"656":6,"657":6,"658":6,"659":6,"663":4,"664":4,"673":4,"684":1,"685":1,"686":1,"687":1,"689":6,"690":1,"691":5,"713":6,"716":4,"723":4,"726":2,"727":2,"728":6,"729":6,"730":7,"731":7,"732":7,"744":1,"747":1,"748":1,"749":1,"752":1,"766":1,"775":2,"784":1,"785":1,"786":1,"792":1,"793":1,"794":2,"800":1,"801":1,"802":1,"806":1,"824":2,"825":2,"828":2,"829":2,"832":2,"833":2,"836":2,"837":2,"840":2,"841":2,"844":2,"845":2,"848":4,"849":4,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"900":1}}],["b",{"2":{"7":4,"16":6,"23":4,"25":2,"26":4,"27":2,"28":6,"53":3,"54":3,"55":3,"56":3,"57":4,"58":3,"65":4,"66":4,"69":2,"73":4,"78":4,"81":4,"183":2,"184":2,"185":4,"186":2,"453":5,"482":4,"495":4,"508":2,"509":4,"510":6,"511":2,"512":2,"513":4,"514":4,"515":10,"516":2,"517":4,"518":4,"519":4,"520":2,"521":8,"522":4,"523":2,"524":4,"525":4,"526":4,"527":2,"528":2,"572":2,"602":4,"603":2,"604":2,"605":4,"635":10,"636":2,"637":12,"638":6,"639":12,"640":4,"641":4,"647":10,"648":14,"649":14,"653":4,"660":4,"661":4,"667":6,"669":20,"670":2,"671":2,"676":4,"680":12,"681":4,"688":6,"689":14,"690":4,"692":6,"694":4,"695":2,"696":4,"700":18,"714":2,"723":6,"725":6,"728":7,"729":7,"775":16,"779":4,"780":2,"782":4,"783":2,"788":2,"790":6,"814":12,"815":4,"816":8,"817":6,"818":12,"819":4,"820":8,"821":6,"822":12,"823":4,"824":8,"825":6,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":16,"835":8,"836":12,"837":10,"838":16,"839":8,"840":12,"841":10,"842":16,"843":8,"844":12,"845":10,"846":16,"847":8,"848":12,"849":10,"868":2,"869":2}}],["bytestostring",{"0":{"783":1},"2":{"756":1,"783":4}}],["bytes",{"2":{"469":1,"474":3,"483":2,"486":1,"487":1,"783":6,"886":3}}],["bytesdata",{"2":{"68":4}}],["bytefunc",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"131":1,"132":1,"611":1}}],["bytedata",{"2":{"79":4,"80":4}}],["byte",{"2":{"68":3,"76":1,"79":3,"80":5,"84":6,"85":6,"91":9,"92":9,"93":9,"94":9,"95":9,"96":9,"97":9,"98":9,"99":9,"102":9,"103":9,"104":9,"105":9,"106":9,"107":9,"108":9,"109":9,"110":9,"121":5,"122":5,"131":5,"132":5,"474":4,"477":1,"484":1,"485":1,"581":2,"586":2,"587":2,"588":2,"589":2,"590":2,"611":2,"782":5,"783":5,"886":5}}],["by",{"2":{"7":2,"182":1,"187":1,"192":1,"287":1,"299":1,"310":1,"322":1,"347":1,"362":1,"371":1,"464":1,"466":1,"481":2,"500":1,"520":1,"521":1,"522":1,"523":1,"529":1,"605":1,"620":1,"629":1,"645":1,"646":1,"664":1,"668":1,"672":1,"678":1,"680":1,"681":1,"687":1,"689":3,"690":1,"713":1,"714":1,"743":1,"787":1,"788":1,"790":1,"803":1,"804":1,"806":1,"886":1,"895":1,"901":2,"910":1,"911":1}}],["guaranteed",{"2":{"689":1}}],["groupfn",{"2":{"664":2}}],["group",{"2":{"664":1,"817":1,"821":1,"825":1,"829":1,"833":1,"837":1,"841":1,"845":1,"849":1}}],["groups",{"2":{"639":1}}],["groupwith",{"0":{"665":1},"2":{"633":1,"665":4}}],["groupby",{"0":{"664":1},"2":{"633":1,"664":4}}],["great",{"2":{"911":1}}],["greatest",{"2":{"560":1}}],["greater",{"2":{"26":1,"28":1,"52":1,"192":2}}],["greaterorequal",{"0":{"28":1},"2":{"21":1,"28":16}}],["greaterthan",{"0":{"26":1},"2":{"21":1,"26":16}}],["green",{"2":{"65":2,"66":2}}],["gcd",{"0":{"560":1},"2":{"540":1,"560":13}}],["give",{"2":{"514":1,"694":1}}],["given",{"2":{"179":1,"180":1,"182":1,"183":1,"269":1,"271":1,"272":1,"273":1,"396":1,"461":1,"493":1,"510":1,"511":1,"515":1,"532":1,"547":1,"549":1,"605":1,"613":1,"642":1,"644":1,"673":1,"675":1,"693":1,"698":1,"701":1,"716":1,"717":1,"721":1,"742":1,"743":1,"772":1,"775":1,"777":1,"778":1,"816":1,"820":1,"824":1,"828":1,"832":1,"836":1,"840":1,"844":1,"848":1}}],["git",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":2,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":2,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"625":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["github",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":2,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":2,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"625":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":4,"896":2,"897":3,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["gbkdata",{"2":{"84":4,"85":4,"886":4}}],["gbk",{"2":{"84":1,"85":1,"886":6}}],["gbktoutf8",{"0":{"85":1},"2":{"63":1,"85":4}}],["g",{"2":{"65":4,"66":4,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["generator",{"2":{"713":6}}],["generater",{"2":{"713":1}}],["generatersakey",{"0":{"130":1},"2":{"89":1,"130":4,"131":2,"132":2}}],["generated",{"2":{"665":1,"713":1}}],["generate",{"0":{"41":1,"713":1},"2":{"34":1,"41":4,"606":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"645":1,"707":1,"713":4}}],["generics",{"2":{"906":1}}],["generic",{"0":{"666":1,"667":1,"692":1}}],["genvals",{"2":{"38":4}}],["gets",{"2":{"803":1}}],["getosbits",{"0":{"808":1},"2":{"798":1,"808":4}}],["getosenv",{"0":{"803":1},"2":{"798":1,"803":4,"804":2,"805":4}}],["getorset",{"0":{"532":1},"2":{"505":1,"532":4}}],["getevennumstr",{"2":{"673":4}}],["getelapsedtime",{"2":{"501":4}}],["getrequestpublicip",{"0":{"578":1},"2":{"570":1,"578":4}}],["getpublicipinfo",{"0":{"577":1},"2":{"570":1,"577":4}}],["getmacaddrs",{"0":{"576":1},"2":{"570":1,"576":4}}],["getmiddlenode",{"0":{"218":1,"233":1},"2":{"204":1,"205":1,"218":4,"233":4}}],["getips",{"0":{"575":1},"2":{"570":1,"575":4}}],["getinternalip",{"0":{"574":1},"2":{"570":1,"574":4}}],["getanddelete",{"0":{"534":1},"2":{"505":1,"534":4}}],["getnighttimestamp",{"0":{"426":1},"2":{"401":1,"426":4}}],["getnowtime",{"0":{"421":1},"2":{"401":1,"421":4}}],["getnowdatetime",{"0":{"422":1},"2":{"401":1,"422":4}}],["getnowdate",{"0":{"420":1},"2":{"401":1,"420":4}}],["getzerohourtimestamp",{"0":{"425":1},"2":{"401":1,"425":4}}],["gettodayendtime",{"0":{"424":1},"2":{"401":1,"424":4}}],["gettodaystarttime",{"0":{"423":1},"2":{"401":1,"423":4}}],["getlist",{"2":{"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2}}],["get",{"0":{"142":1,"180":1,"531":1},"1":{"143":1},"2":{"17":8,"111":1,"112":1,"113":1,"115":1,"117":1,"119":1,"123":1,"124":1,"126":1,"128":1,"129":1,"136":1,"142":2,"143":2,"176":1,"180":5,"181":2,"182":4,"218":1,"219":1,"233":1,"234":1,"289":1,"292":1,"293":1,"294":1,"301":1,"304":1,"305":1,"306":1,"312":1,"315":1,"316":1,"317":1,"324":1,"329":1,"344":1,"395":1,"420":1,"421":1,"422":1,"457":1,"501":3,"505":1,"530":2,"531":5,"534":2,"567":1,"574":1,"575":1,"576":1,"577":1,"578":3,"583":2,"584":2,"585":8,"586":1,"742":1,"743":1,"745":1,"746":1,"750":1,"751":1,"806":1,"808":1,"906":4}}],["gt",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"59":4,"81":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"222":8,"275":2,"325":2,"326":2,"327":2,"328":2,"329":2,"348":2,"380":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"469":2,"470":2,"471":2,"472":2,"483":2,"507":2,"547":6,"625":2,"663":2,"728":2,"730":4,"731":4,"732":4,"803":2,"804":2,"805":4,"882":1}}],["gogo",{"2":{"906":2}}],["golang",{"2":{"886":2}}],["go1",{"0":{"666":1,"667":1,"692":1},"2":{"906":5}}],["gounwarpordefault",{"2":{"604":1}}],["gounwarpor",{"2":{"603":1}}],["gotype",{"2":{"37":1,"138":1,"193":1,"208":1,"224":1,"243":1,"335":1,"363":1,"372":1,"429":1,"430":1,"431":1,"432":1,"495":1,"501":1,"524":1,"525":1,"581":1,"582":1,"626":1,"807":1,"814":1,"818":1,"822":1,"826":1,"830":1,"834":1,"838":1,"842":1,"846":1,"893":1}}],["goroutines",{"2":{"529":1}}],["goroutine",{"2":{"30":1}}],["gopackage",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"139":1,"141":1,"143":1,"145":1,"148":1,"150":1,"152":1,"154":1,"156":1,"158":1,"160":1,"162":1,"164":1,"166":1,"168":1,"170":1,"172":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"626":1,"627":1,"628":1,"629":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1,"908":1}}],["gofunc",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"140":1,"142":1,"144":1,"147":1,"149":1,"151":1,"153":1,"155":1,"157":1,"159":1,"161":1,"163":1,"165":1,"167":1,"169":1,"171":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"496":1,"497":1,"498":1,"499":1,"500":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"526":1,"527":1,"528":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"583":1,"584":1,"585":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":2,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"808":1,"815":1,"816":1,"817":1,"819":1,"820":1,"821":1,"823":1,"824":1,"825":1,"827":1,"828":1,"829":1,"831":1,"832":1,"833":1,"835":1,"836":1,"837":1,"839":1,"840":1,"841":1,"843":1,"844":1,"845":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["goimport",{"2":{"3":1,"20":1,"32":1,"49":1,"62":1,"88":1,"135":1,"175":1,"189":1,"202":1,"240":1,"280":1,"332":1,"357":1,"383":1,"400":1,"448":1,"478":1,"490":1,"504":1,"539":1,"569":1,"598":1,"608":1,"622":1,"625":1,"632":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"706":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"737":1,"755":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"797":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"811":1,"852":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"890":1,"907":1}}],["go",{"2":{"0":1,"2":3,"7":2,"19":2,"31":1,"38":2,"43":2,"48":1,"61":1,"87":2,"123":2,"133":1,"134":2,"174":1,"188":1,"201":2,"239":1,"279":4,"331":1,"356":2,"382":1,"399":2,"447":1,"457":2,"477":2,"489":2,"503":1,"528":1,"529":1,"530":2,"531":2,"532":2,"533":4,"534":4,"535":4,"536":2,"538":1,"568":2,"586":1,"587":1,"588":1,"589":1,"590":1,"596":1,"597":1,"607":1,"621":1,"631":1,"704":1,"705":1,"711":2,"736":2,"754":1,"796":1,"810":1,"851":1,"889":1,"902":2,"910":1,"911":1}}],["rs",{"2":{"772":4,"908":4}}],["rsadecrypt",{"0":{"132":1},"2":{"89":1,"131":2,"132":4}}],["rsaencrypt",{"0":{"131":1},"2":{"89":1,"131":4,"132":2}}],["rsa",{"2":{"86":1,"130":5,"131":8,"132":8}}],["rfc",{"2":{"618":1}}],["rint",{"2":{"612":4}}],["rightnode",{"2":{"387":1}}],["right",{"2":{"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"192":1,"381":2,"387":1,"481":1,"496":1,"679":1,"769":1,"770":1}}],["round",{"2":{"542":1,"551":1,"552":1,"553":1}}],["roundtostring",{"0":{"552":1},"2":{"540":1,"552":8}}],["roundtofloat",{"0":{"551":1},"2":{"540":1,"542":3,"551":8}}],["rootdata",{"2":{"388":2}}],["rootnode",{"2":{"387":1}}],["root",{"2":{"192":1}}],["rry",{"2":{"507":1}}],["r2",{"2":{"339":4}}],["r1",{"2":{"339":4}}],["rawurl",{"2":{"581":4,"583":2,"584":2}}],["radian",{"2":{"556":1,"557":3,"562":3,"563":3}}],["radiantoangle",{"0":{"557":1},"2":{"540":1,"557":8}}],["ras",{"2":{"131":1,"132":1}}],["randstr",{"2":{"613":4,"614":4,"615":4,"616":4,"617":4}}],["randstring",{"0":{"613":1},"2":{"609":1,"613":4,"614":2}}],["randuniqueintslice",{"0":{"619":1},"2":{"609":1,"619":4}}],["randupper",{"0":{"614":1},"2":{"609":1,"614":2}}],["randnumeralorletter",{"0":{"617":1},"2":{"609":1,"617":4}}],["randnumeral",{"0":{"616":1},"2":{"609":1,"616":4}}],["randlower",{"0":{"615":1},"2":{"609":1,"615":4}}],["randint",{"0":{"612":1},"2":{"609":1,"612":4}}],["randbytes",{"0":{"611":1},"2":{"609":1,"611":8}}],["random",{"0":{"606":1},"1":{"607":1,"608":1,"609":1,"610":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1},"2":{"0":1,"185":1,"186":1,"606":2,"607":2,"608":2,"611":5,"612":5,"613":5,"614":5,"615":5,"616":5,"617":5,"618":5,"619":7,"683":2,"911":1}}],["rangewithstep",{"0":{"555":1},"2":{"540":1,"555":10}}],["range",{"0":{"536":1,"554":1,"722":1},"2":{"38":2,"39":2,"40":2,"42":2,"44":2,"45":2,"46":2,"81":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"505":1,"536":5,"540":1,"554":10,"707":1,"722":11,"762":2,"763":2,"764":2,"765":2,"767":2,"768":2,"773":2,"774":2,"791":1,"886":2}}],["r",{"2":{"65":4,"66":4,"794":2}}],["rgb",{"2":{"65":1,"66":1}}],["runtime",{"2":{"795":1}}],["running",{"2":{"665":1,"672":1}}],["run",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":3,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["rewriten",{"2":{"906":1}}],["related",{"2":{"898":1,"907":1}}],["regex",{"2":{"878":2}}],["regexp",{"2":{"878":1}}],["regionname",{"2":{"577":4}}],["region",{"2":{"577":4}}],["remaining",{"2":{"719":1}}],["remov",{"2":{"514":1}}],["removing",{"2":{"196":1}}],["removeosenv",{"0":{"805":1},"2":{"798":1,"805":4}}],["removeemptystring",{"2":{"775":2}}],["removewhitespace",{"0":{"794":1},"2":{"756":1,"794":6}}],["removenonprintable",{"0":{"781":1},"2":{"756":1,"781":6}}],["removefile",{"0":{"462":1},"2":{"449":1,"462":4}}],["removed",{"2":{"277":1,"640":1}}],["removes",{"2":{"163":1,"165":1,"272":1,"512":1,"715":1,"794":1}}],["remove",{"0":{"146":1},"2":{"136":1,"195":1,"266":1,"267":1,"291":1,"303":1,"314":1,"326":1,"462":1,"474":2,"475":2,"696":1,"697":1,"781":1,"794":1,"805":1}}],["re",{"2":{"645":1}}],["requires",{"2":{"657":1,"659":1}}],["request",{"2":{"567":1,"578":9,"581":3,"582":5,"583":7,"584":4,"586":1,"587":1,"588":1,"589":1,"590":1}}],["req",{"2":{"578":2}}],["recommended",{"2":{"906":1}}],["recover",{"2":{"905":2}}],["record",{"2":{"501":1}}],["records",{"2":{"473":2}}],["recorded",{"2":{"355":1}}],["recently",{"2":{"355":1}}],["recursive",{"2":{"14":1,"15":1,"661":1}}],["res",{"2":{"683":2}}],["resp",{"2":{"583":6,"584":8,"586":4,"587":4,"588":4,"589":4,"590":4,"591":6}}],["response",{"2":{"583":2,"584":3,"586":2,"587":2,"588":2,"589":2,"590":2,"591":3}}],["responsetimeout",{"2":{"582":2}}],["reset",{"2":{"501":7}}],["res2",{"2":{"353":4}}],["res1",{"2":{"353":4}}],["resulting",{"2":{"718":1}}],["results",{"2":{"665":1}}],["result9",{"2":{"52":2}}],["result8",{"2":{"52":6}}],["result",{"2":{"42":1,"67":4,"73":4,"74":4,"75":4,"78":4,"80":6,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"273":8,"274":8,"275":4,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"495":4,"496":4,"500":4,"509":4,"510":4,"511":4,"512":4,"513":4,"514":4,"517":4,"518":4,"520":1,"521":1,"522":4,"523":4,"524":10,"525":4,"526":4,"542":1,"605":4,"619":4,"643":4,"644":4,"645":4,"646":5,"653":4,"654":4,"655":4,"656":4,"657":4,"658":4,"659":4,"660":4,"661":4,"662":8,"665":4,"666":4,"667":4,"668":4,"672":4,"673":6,"674":4,"675":4,"677":4,"678":1,"679":4,"681":4,"682":4,"683":2,"691":4,"692":4,"693":4,"694":4,"695":4,"696":4,"697":4,"698":4,"699":4,"701":4,"702":4,"724":6,"725":4,"726":4,"727":4,"775":1,"783":4,"788":4,"803":4,"804":4,"806":4,"816":4,"820":4,"824":4,"828":4,"832":4,"836":4,"840":4,"844":4,"848":4,"886":4}}],["result7",{"2":{"23":4,"26":4,"28":4,"52":4,"76":4,"769":4,"770":4,"771":4}}],["result6",{"2":{"23":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"71":4,"76":4,"769":4,"770":4,"771":4,"776":4,"779":4,"780":4}}],["result5",{"2":{"23":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"71":4,"72":4,"76":4,"560":4,"562":4,"563":4,"639":4,"669":4,"680":4,"700":4,"758":4,"759":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"778":4,"779":4,"780":4,"787":4,"862":4,"887":4}}],["result4",{"2":{"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"71":4,"72":4,"76":4,"484":4,"485":4,"486":4,"487":4,"554":4,"555":4,"559":4,"560":4,"562":4,"563":4,"603":2,"604":2,"637":4,"639":4,"640":4,"648":4,"649":4,"669":4,"680":4,"700":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"787":4,"791":4,"862":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"879":4,"885":4,"887":4}}],["result3",{"2":{"17":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"69":4,"70":4,"71":4,"72":4,"76":4,"427":4,"428":4,"439":4,"440":4,"481":4,"484":4,"485":4,"486":4,"487":4,"515":4,"543":4,"544":4,"545":4,"547":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"566":2,"603":2,"604":2,"637":4,"639":4,"640":4,"647":4,"648":4,"649":4,"650":4,"651":4,"669":4,"680":4,"684":4,"685":4,"686":4,"687":4,"700":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"784":4,"787":4,"789":4,"791":4,"793":4,"855":4,"856":4,"857":4,"858":4,"859":4,"860":4,"861":4,"862":4,"868":4,"870":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"879":4,"883":4,"885":4,"887":4}}],["result2",{"2":{"14":4,"15":4,"16":4,"17":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"59":4,"69":4,"70":4,"71":4,"72":4,"76":4,"427":4,"428":4,"437":4,"438":4,"439":4,"440":4,"441":2,"481":4,"482":4,"484":4,"485":4,"486":4,"487":4,"515":4,"527":4,"528":4,"542":4,"543":4,"544":4,"545":4,"546":4,"547":4,"548":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"565":4,"566":2,"594":4,"595":4,"601":4,"602":4,"603":2,"604":2,"635":4,"636":4,"637":4,"638":4,"639":4,"640":4,"641":4,"642":4,"647":4,"648":4,"649":4,"650":4,"651":4,"652":4,"669":4,"670":4,"671":4,"678":4,"680":4,"684":4,"685":4,"686":4,"687":4,"700":4,"703":4,"730":4,"731":4,"732":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"781":4,"782":4,"784":4,"785":4,"786":4,"787":4,"789":4,"790":4,"791":4,"792":4,"793":4,"794":4,"805":4,"855":4,"856":4,"857":4,"858":4,"859":4,"860":4,"861":4,"862":4,"863":4,"864":4,"865":4,"866":4,"867":4,"868":4,"869":4,"870":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"878":4,"879":4,"880":4,"881":4,"882":4,"883":4,"884":4,"885":4,"887":4,"905":4}}],["result1",{"2":{"14":4,"15":4,"16":4,"17":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"59":4,"69":4,"70":4,"71":4,"72":4,"76":4,"427":4,"428":4,"437":4,"438":4,"439":4,"440":4,"441":4,"481":4,"482":4,"484":4,"485":4,"486":4,"487":4,"515":4,"527":4,"528":4,"542":4,"543":4,"544":4,"545":4,"546":4,"547":4,"548":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"558":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"565":4,"566":4,"594":4,"595":4,"601":4,"602":4,"603":2,"604":2,"635":4,"636":4,"637":4,"638":4,"639":4,"640":4,"641":4,"642":4,"647":4,"648":4,"649":4,"650":4,"651":4,"652":4,"669":4,"670":4,"671":4,"678":4,"680":4,"684":4,"685":4,"686":4,"687":4,"700":4,"703":4,"730":4,"731":4,"732":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"781":4,"782":6,"784":4,"785":4,"786":4,"787":4,"789":4,"790":4,"791":4,"792":4,"793":4,"794":4,"805":4,"855":4,"856":4,"857":4,"858":4,"859":4,"860":4,"861":4,"862":4,"863":4,"864":4,"865":4,"866":4,"867":4,"868":4,"869":4,"870":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"878":4,"879":4,"880":4,"881":4,"882":4,"883":4,"884":4,"885":4,"887":4,"905":4}}],["rear",{"2":{"278":1}}],["readall",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["readable",{"2":{"484":1,"485":1,"486":1,"487":1}}],["reads",{"2":{"472":1}}],["readcsvfile",{"0":{"472":1},"2":{"449":1,"472":4,"473":2}}],["readfilebyline",{"0":{"464":1},"2":{"449":1,"464":4}}],["readfiletostring",{"0":{"463":1},"2":{"449":1,"463":4,"474":2,"475":2}}],["reading",{"2":{"133":1}}],["readin",{"2":{"43":1}}],["read",{"2":{"43":1,"44":1,"70":1,"133":1,"464":1}}],["reversed",{"2":{"772":1}}],["reverse",{"0":{"217":1,"232":1,"265":1,"676":1,"721":1,"772":1},"2":{"204":1,"205":1,"217":5,"232":5,"241":1,"265":5,"633":1,"676":5,"707":1,"721":9,"756":1,"772":4,"908":4}}],["repalceall",{"2":{"794":3}}],["replacechar",{"2":{"791":2}}],["replacewithmap",{"0":{"788":1},"2":{"756":1,"788":4}}],["replaced",{"2":{"680":1,"681":1,"788":1}}],["replaceall",{"0":{"681":1},"2":{"633":1,"681":4}}],["replacement",{"0":{"666":1,"667":1,"690":1,"692":1},"2":{"586":1,"587":1,"588":1,"589":1,"590":1}}],["replace",{"0":{"680":1},"2":{"528":1,"633":1,"680":12,"791":1}}],["replaces",{"2":{"144":1,"788":6,"794":1}}],["represents",{"2":{"486":1,"487":1,"814":1,"818":1,"822":1,"826":1,"830":1,"834":1,"838":1,"842":1,"846":1}}],["repeatedly",{"2":{"620":1,"629":1}}],["repeatly",{"2":{"40":1,"42":1}}],["repeatfn",{"0":{"42":1},"2":{"34":1,"42":4}}],["repeat",{"0":{"40":1,"682":1},"2":{"34":1,"39":2,"40":4,"44":2,"46":2,"619":1,"633":1,"682":4}}],["references",{"2":{"646":1}}],["referred",{"2":{"387":1}}],["refers",{"2":{"47":1}}],["reflect",{"2":{"83":5,"257":1,"493":2,"494":2,"695":2,"751":2,"782":2,"905":2}}],["reduction",{"2":{"725":1}}],["reduced",{"2":{"725":1}}],["reducedeprecated",{"2":{"633":1}}],["reducer",{"2":{"678":3,"679":2}}],["reduceright",{"0":{"679":1},"2":{"633":1,"679":5}}],["reduce",{"0":{"677":1,"725":1},"2":{"677":5,"707":1,"725":4}}],["reduceby",{"0":{"678":1},"2":{"633":1,"677":1,"678":6,"679":1}}],["red",{"2":{"65":2,"66":2}}],["retries",{"2":{"628":1}}],["retrytimes",{"0":{"627":1},"2":{"623":1,"627":4}}],["retryduration",{"0":{"628":1},"2":{"623":1,"625":2,"626":2,"628":4,"629":2}}],["retryfunc",{"0":{"626":1},"2":{"623":1,"626":4,"629":5}}],["retry",{"0":{"620":1,"629":1},"1":{"621":1,"622":1,"623":1,"624":1,"625":1,"626":1,"627":1,"628":1,"629":1},"2":{"0":1,"620":1,"621":2,"622":2,"623":1,"625":12,"626":11,"627":11,"628":8,"629":10,"911":1}}],["retain2",{"2":{"271":4}}],["retain1",{"2":{"271":4}}],["retain",{"2":{"271":4,"550":1}}],["retains",{"2":{"271":1}}],["retainall",{"0":{"271":1},"2":{"241":1,"271":8}}],["returntwo",{"2":{"673":1}}],["returning",{"2":{"656":1,"657":1,"658":1,"659":1}}],["returns",{"2":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"75":1,"138":1,"140":1,"142":1,"147":1,"149":1,"151":1,"155":1,"171":1,"196":1,"247":1,"248":1,"249":1,"250":1,"274":1,"276":1,"277":1,"339":2,"340":3,"439":1,"469":1,"470":1,"471":1,"484":1,"485":1,"486":1,"487":1,"500":1,"512":1,"516":1,"519":1,"532":2,"534":1,"536":1,"562":1,"563":1,"564":1,"565":1,"566":1,"601":1,"602":1,"603":1,"604":1,"605":1,"637":1,"642":1,"643":1,"650":1,"651":1,"664":1,"670":1,"671":1,"673":1,"680":1,"681":1,"695":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"758":1,"759":1,"760":1,"761":1,"776":1,"787":1,"788":1,"815":1,"819":1,"823":1,"827":1,"831":1,"835":1,"839":1,"843":1,"847":1,"895":2,"901":1,"902":1,"903":1,"905":1}}],["returned",{"2":{"14":1,"15":1,"16":1,"52":2,"499":1,"719":1}}],["return",{"2":{"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":7,"15":7,"16":4,"38":2,"42":2,"43":2,"59":2,"71":1,"72":1,"73":1,"74":2,"78":2,"80":2,"82":2,"114":1,"116":1,"118":1,"120":1,"121":1,"122":1,"125":1,"127":1,"131":2,"132":2,"166":2,"181":1,"185":1,"186":1,"193":1,"195":2,"196":1,"197":1,"198":1,"208":1,"209":1,"224":1,"225":1,"243":1,"245":1,"246":1,"247":1,"248":1,"249":5,"250":5,"252":1,"253":1,"260":1,"261":1,"262":1,"263":1,"269":1,"275":2,"277":2,"288":1,"290":1,"291":1,"300":1,"303":1,"311":1,"313":1,"314":1,"323":1,"325":1,"326":1,"337":1,"340":4,"348":5,"354":2,"363":1,"365":2,"366":1,"367":1,"368":1,"372":1,"374":2,"375":1,"376":1,"377":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"423":1,"424":1,"425":1,"426":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"438":1,"441":1,"442":1,"443":1,"444":1,"445":1,"452":1,"455":1,"456":1,"463":1,"464":1,"473":4,"474":6,"475":6,"481":1,"495":4,"496":5,"500":6,"509":3,"510":1,"511":1,"512":2,"515":1,"520":2,"521":8,"522":2,"523":2,"524":2,"526":2,"534":1,"536":2,"542":1,"546":1,"547":7,"548":1,"549":7,"552":1,"560":1,"561":1,"583":4,"584":4,"618":2,"625":2,"626":6,"627":4,"628":6,"629":6,"637":9,"643":2,"645":2,"646":2,"650":6,"651":6,"653":2,"654":3,"655":3,"656":2,"657":4,"658":2,"659":4,"663":5,"664":2,"665":3,"670":1,"671":1,"672":2,"673":4,"674":2,"677":2,"678":4,"679":2,"687":6,"689":4,"690":2,"691":3,"697":2,"699":2,"700":1,"702":2,"713":4,"716":2,"717":2,"723":2,"725":2,"728":2,"729":2,"730":4,"731":4,"732":4,"772":1,"780":1,"792":1,"793":1,"806":2,"807":1,"808":1}}],["reusable",{"2":{"0":1,"910":1}}],["multipart",{"2":{"581":2}}],["multiple",{"2":{"38":1,"39":1,"529":1,"561":1}}],["m3",{"2":{"515":4,"527":4}}],["m3hsjl1i83hdltrq0+o9czgb+8kjdkra4t",{"2":{"129":2}}],["m2",{"2":{"515":6,"517":4,"518":4,"527":4,"741":4}}],["m1",{"2":{"515":8,"517":4,"518":4,"527":6,"741":4}}],["m",{"2":{"508":6,"509":8,"510":6,"511":6,"512":6,"513":6,"514":6,"516":6,"519":6,"520":6,"521":6,"522":6,"523":6,"524":6,"526":6,"528":8,"572":4}}],["mtime",{"0":{"470":1},"2":{"449":1,"470":8}}],["mmddyy",{"2":{"403":1}}],["mm",{"2":{"403":24,"420":1,"421":1,"422":2,"423":1,"424":1,"427":10,"428":10,"431":2,"434":2,"441":8}}],["minimum",{"2":{"548":1,"549":1,"729":1}}],["minby",{"0":{"549":1},"2":{"540":1,"549":8}}],["min",{"0":{"548":1,"729":1},"2":{"540":1,"548":6,"612":4,"619":2,"707":1,"729":8}}],["minute",{"2":{"406":2,"408":1,"414":1}}],["minutes",{"2":{"406":1}}],["minus",{"0":{"353":1,"518":1},"2":{"333":1,"353":6,"505":1,"518":4}}],["mime",{"2":{"457":1}}],["mimetype",{"0":{"457":1},"2":{"449":1,"457":6}}],["microsecond",{"2":{"497":2,"625":2,"626":2,"628":2,"629":2}}],["micro",{"2":{"444":1}}],["milliseconds",{"2":{"501":2}}],["millisecond",{"2":{"497":4}}],["mill",{"2":{"443":1}}],["midnode",{"2":{"218":4,"233":4}}],["middle",{"2":{"218":1,"233":1,"392":1}}],["mvu5pe6ymgk6ccti4f1zpfn2yzbw14btqwwydqwf3nu=",{"2":{"116":2}}],["md5str",{"2":{"119":4,"120":4,"121":4,"122":4}}],["md5stringwithbase64",{"0":{"120":1},"2":{"89":1,"120":4}}],["md5string",{"0":{"119":1},"2":{"89":1,"119":4}}],["md5file",{"0":{"123":1},"2":{"89":1,"123":4}}],["md5bytewithbase64",{"0":{"122":1},"2":{"89":1,"122":4}}],["md5byte",{"0":{"121":1},"2":{"89":1,"121":4}}],["md5",{"2":{"86":1,"111":1,"112":1,"119":1,"120":1,"121":1,"122":1,"123":1}}],["msg",{"2":{"74":6}}],["meaningful",{"2":{"780":1}}],["meaning",{"2":{"355":1}}],["meet",{"2":{"210":1,"226":1}}],["messages",{"2":{"74":4}}],["message",{"2":{"74":6,"893":3,"894":3,"896":1,"903":2}}],["methods",{"2":{"911":1}}],["method",{"2":{"52":3,"578":2,"581":4,"583":2,"584":2}}],["memory",{"2":{"782":1,"783":1}}],["mem",{"2":{"17":1}}],["merged",{"2":{"901":1}}],["merge",{"0":{"261":1,"517":1,"675":1},"2":{"12":1,"39":1,"241":1,"261":5,"505":1,"517":5,"633":1,"675":5}}],["mergesort",{"0":{"12":1},"2":{"4":1,"12":4}}],["mandarin",{"2":{"855":1}}],["manipulating",{"2":{"522":1,"523":1,"911":1}}],["manipulates",{"2":{"674":1}}],["manipulate",{"2":{"502":1,"630":1,"753":1}}],["match",{"2":{"655":1,"716":1,"730":1,"731":1,"732":1,"878":1}}],["matched",{"2":{"643":1,"657":1,"659":1,"900":1}}],["math",{"2":{"537":1,"557":6,"562":4,"563":4,"665":2,"911":1}}],["mathutil",{"0":{"537":1},"1":{"538":1,"539":1,"540":1,"541":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1},"2":{"0":1,"537":1,"538":2,"539":2,"542":8,"543":8,"544":8,"545":8,"546":6,"547":8,"548":6,"549":8,"550":8,"551":8,"552":8,"553":8,"554":10,"555":10,"556":8,"557":8,"558":4,"559":10,"560":12,"561":8,"562":12,"563":12,"564":12,"565":6,"566":2}}],["macos",{"2":{"802":1}}],["macaddrs",{"2":{"576":4}}],["mac",{"2":{"576":1,"807":2}}],["maxsize",{"2":{"720":3}}],["maximum",{"2":{"547":1,"728":1}}],["maxby",{"0":{"547":1},"2":{"540":1,"547":8}}],["max",{"0":{"546":1,"728":1},"2":{"540":1,"546":7,"612":4,"619":2,"707":1,"713":4,"728":8}}],["maxheap",{"0":{"192":1},"2":{"188":1,"190":1,"192":1,"193":8,"194":6,"195":6,"196":8,"197":6,"198":6,"199":6}}],["male",{"2":{"472":4,"473":4}}],["marshal",{"2":{"76":1,"82":1,"588":2,"590":2}}],["maybe",{"2":{"542":1}}],["may",{"2":{"47":1,"530":2,"531":2,"532":2,"612":1}}],["makes",{"2":{"911":1}}],["make",{"2":{"38":4,"39":2,"43":2,"45":2,"178":1,"179":1,"221":1,"236":1,"263":2,"273":2,"274":2,"345":1,"388":1,"495":1,"711":2}}],["mapping",{"2":{"673":2}}],["mapper",{"2":{"520":3,"521":3,"717":2}}],["mapb",{"2":{"518":3,"527":2}}],["mapa",{"2":{"518":3,"527":2}}],["mapvalues",{"0":{"523":1},"2":{"505":1,"523":4}}],["mapkeys",{"0":{"522":1},"2":{"505":1,"522":4}}],["mapto",{"0":{"507":1},"2":{"505":1,"507":4}}],["maptoslice",{"0":{"78":1},"2":{"63":1,"78":4}}],["maps",{"2":{"52":1,"515":4,"517":3,"527":1}}],["map",{"0":{"672":1,"717":1},"2":{"23":4,"73":2,"74":5,"76":1,"77":5,"78":5,"81":4,"173":1,"275":5,"335":2,"482":2,"502":1,"503":1,"507":5,"508":5,"509":10,"510":10,"511":10,"512":9,"513":9,"514":8,"515":17,"516":5,"517":10,"518":11,"519":5,"520":5,"521":5,"522":10,"523":10,"524":5,"525":5,"526":10,"527":8,"528":7,"529":1,"531":1,"535":1,"536":1,"572":5,"586":6,"587":6,"588":6,"589":4,"590":6,"591":2,"633":1,"665":7,"672":4,"702":5,"707":1,"717":4,"741":9,"788":5,"842":4,"843":4,"846":4,"847":4,"893":2,"901":3}}],["maputil",{"0":{"502":1},"1":{"503":1,"504":1,"505":1,"506":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1},"2":{"0":1,"502":1,"503":1,"504":2,"507":2,"508":4,"509":6,"510":4,"511":4,"512":4,"513":4,"514":4,"515":8,"516":4,"517":4,"518":4,"519":4,"520":4,"521":4,"522":4,"523":4,"524":4,"525":4,"526":2,"527":6,"528":6,"529":4,"530":4,"531":4,"532":4,"533":4,"534":4,"535":4,"536":4}}],["main",{"2":{"2":3,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":4,"19":2,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"31":1,"37":4,"38":4,"39":4,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":4,"48":1,"52":4,"53":4,"54":4,"55":4,"56":4,"57":4,"58":4,"59":4,"61":1,"65":4,"66":4,"67":4,"68":4,"69":4,"70":4,"71":4,"72":4,"73":4,"74":4,"75":4,"76":4,"77":4,"78":4,"79":4,"80":4,"81":4,"82":4,"83":4,"84":4,"85":4,"87":2,"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"101":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":4,"119":4,"120":4,"121":4,"122":4,"123":6,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"130":4,"131":4,"132":4,"134":2,"139":4,"141":4,"143":4,"145":4,"148":4,"150":4,"152":4,"154":4,"156":4,"158":4,"160":4,"162":4,"164":4,"166":4,"168":4,"170":4,"172":4,"174":1,"178":4,"179":4,"180":4,"181":4,"182":4,"183":4,"184":4,"185":4,"186":4,"188":1,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"201":2,"208":4,"209":4,"210":4,"211":4,"212":4,"213":4,"214":4,"215":4,"216":4,"217":4,"218":4,"219":4,"220":4,"221":4,"222":4,"224":4,"225":4,"226":4,"227":4,"228":4,"229":4,"230":4,"231":4,"232":4,"233":4,"234":4,"235":4,"236":4,"237":4,"239":1,"243":4,"244":4,"245":4,"246":4,"247":4,"248":4,"249":4,"250":4,"251":4,"252":4,"253":4,"254":4,"255":4,"256":4,"257":4,"258":4,"259":4,"260":4,"261":4,"262":4,"263":4,"264":4,"265":4,"266":4,"267":4,"268":4,"269":4,"270":4,"271":4,"272":4,"273":4,"274":4,"275":4,"276":4,"277":4,"279":4,"288":4,"289":4,"290":4,"291":4,"292":4,"293":4,"294":4,"295":4,"296":4,"297":4,"298":4,"300":4,"301":4,"302":4,"303":4,"304":4,"305":4,"306":4,"307":4,"308":4,"309":4,"311":4,"312":4,"313":4,"314":4,"315":4,"316":4,"317":4,"318":4,"319":4,"320":4,"321":4,"323":4,"324":4,"325":4,"326":4,"327":4,"328":4,"329":4,"331":1,"335":4,"336":4,"337":4,"338":4,"339":4,"340":4,"341":4,"342":4,"343":4,"344":4,"345":4,"346":4,"347":4,"348":4,"349":4,"350":4,"351":4,"352":4,"353":4,"354":4,"356":2,"363":4,"364":4,"365":4,"366":4,"367":4,"368":4,"369":4,"370":4,"372":4,"373":4,"374":4,"375":4,"376":4,"377":4,"378":4,"379":4,"380":4,"382":1,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"399":2,"404":4,"405":4,"406":4,"407":4,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":4,"421":4,"422":4,"423":4,"424":4,"425":4,"426":4,"427":4,"428":4,"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4,"437":4,"438":4,"439":4,"440":4,"441":4,"442":4,"443":4,"444":4,"445":4,"447":1,"451":4,"452":4,"453":4,"454":4,"455":4,"456":4,"457":4,"458":4,"459":4,"460":4,"461":4,"462":4,"463":4,"464":4,"465":4,"466":4,"467":4,"468":4,"469":4,"470":4,"471":4,"472":4,"473":4,"474":4,"475":4,"477":2,"481":4,"482":4,"483":4,"484":4,"485":4,"486":4,"487":4,"489":2,"493":4,"494":4,"495":4,"496":4,"497":4,"498":4,"499":4,"500":4,"501":4,"503":1,"507":4,"508":4,"509":4,"510":4,"511":4,"512":4,"513":4,"514":4,"515":4,"516":4,"517":4,"518":4,"519":4,"520":4,"521":4,"522":4,"523":4,"524":4,"525":4,"526":4,"527":4,"528":4,"529":4,"530":4,"531":4,"532":4,"533":4,"534":4,"535":4,"536":4,"538":1,"542":4,"543":4,"544":4,"545":4,"546":4,"547":4,"548":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"558":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"565":4,"566":4,"568":2,"572":4,"573":4,"574":4,"575":4,"576":4,"577":4,"578":4,"579":4,"580":4,"581":4,"582":4,"583":4,"584":4,"585":4,"586":4,"587":4,"588":4,"589":4,"590":4,"591":4,"592":4,"593":4,"594":4,"595":4,"597":1,"601":4,"602":4,"603":4,"604":4,"605":4,"607":1,"611":4,"612":4,"613":4,"614":4,"615":4,"616":4,"617":4,"618":4,"619":4,"621":1,"625":2,"626":4,"627":8,"628":4,"629":4,"631":1,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"740":4,"741":4,"742":4,"743":4,"744":4,"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"752":4,"754":1,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"814":4,"815":4,"816":4,"817":4,"818":4,"819":4,"820":4,"821":4,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"851":1,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"893":4,"894":4,"895":4,"896":4,"897":4,"898":4,"899":4,"900":4,"901":4,"902":4,"903":4,"904":4,"905":4,"908":4}}],["mobilenum",{"2":{"864":2}}],["mobile",{"2":{"864":1}}],["modified",{"2":{"470":1}}],["mode",{"2":{"456":5}}],["module",{"2":{"0":1}}],["month",{"2":{"412":1,"418":1}}],["most",{"2":{"355":1}}],["more",{"0":{"909":1},"2":{"0":2,"43":1,"47":1,"493":1,"699":1}}],["cd",{"2":{"789":6}}],["c1",{"2":{"747":8}}],["city",{"2":{"577":4}}],["circular",{"2":{"310":1}}],["circularqueue",{"0":{"284":1,"310":1},"2":{"278":1,"279":1,"311":5,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2}}],["c=3",{"2":{"572":2}}],["cmd",{"2":{"807":2}}],["cm",{"2":{"529":2,"530":8,"531":8,"532":6,"533":8,"534":10,"535":8,"536":8}}],["c3",{"2":{"523":2}}],["cf",{"2":{"495":2}}],["cfb",{"2":{"96":1,"107":1}}],["curry",{"2":{"495":1}}],["curryfn",{"0":{"495":1},"2":{"491":1,"495":6}}],["currentpath",{"0":{"455":1},"2":{"449":1,"455":4}}],["currenttime",{"2":{"421":4}}],["currentdate",{"2":{"420":4}}],["current",{"2":{"130":1,"420":1,"421":1,"422":5,"429":1,"441":1,"442":1,"443":1,"444":1,"445":1,"455":1,"800":1,"801":1,"802":1,"808":1}}],["csv",{"2":{"472":2,"473":3}}],["client",{"2":{"582":2,"583":2,"584":2,"586":4,"587":4,"588":4,"589":4,"590":4}}],["clean",{"2":{"297":1,"308":1,"320":1}}],["clearfile",{"0":{"451":1},"2":{"449":1,"451":4}}],["clear",{"0":{"221":1,"236":1,"259":1,"297":1,"308":1,"320":1,"370":1,"379":1},"2":{"204":1,"205":1,"221":5,"222":2,"236":5,"237":2,"241":1,"259":5,"282":1,"283":1,"284":1,"297":4,"308":4,"320":4,"359":1,"360":1,"370":5,"379":5,"451":1}}],["clonelist",{"2":{"260":4}}],["cloned",{"2":{"81":8}}],["clone",{"0":{"260":1,"345":1},"2":{"81":1,"241":1,"260":4,"333":1,"345":4}}],["closed",{"2":{"43":1}}],["close",{"2":{"38":4,"42":1,"43":3,"44":1,"45":2,"464":2,"473":2,"474":2,"475":2,"499":3,"711":2}}],["ctr",{"2":{"95":1,"106":1}}],["ctx",{"2":{"38":6,"39":10,"40":8,"41":6,"42":8,"44":10,"45":6,"46":10,"625":6}}],["cbc",{"2":{"93":1,"94":1,"97":1,"104":1,"105":1,"108":1}}],["cpu",{"2":{"82":10}}],["creditcart",{"2":{"867":2}}],["credit",{"2":{"867":1}}],["createdir",{"0":{"453":1},"2":{"449":1,"453":4}}],["createfile",{"0":{"452":1},"2":{"449":1,"452":4,"458":2,"463":2,"464":2,"473":2}}],["creates",{"2":{"41":1,"81":1,"267":1,"268":1,"493":1,"494":1,"497":1,"518":1,"520":1,"521":1,"525":1,"554":1,"555":1,"639":1,"640":1,"641":1,"644":1,"668":1,"672":1,"682":1,"683":1,"694":1,"698":1,"701":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"893":1,"894":1,"896":1}}],["create",{"2":{"37":1,"40":1,"42":1,"45":1,"130":1,"335":1,"336":1,"350":1,"351":1,"352":1,"353":1,"452":2,"453":3,"465":1,"474":2,"475":2,"529":4,"693":1,"816":1,"817":1,"820":1,"821":1,"824":1,"825":1,"828":1,"829":1,"832":1,"833":1,"836":1,"837":1,"840":1,"841":1,"844":1,"845":1,"848":1,"849":1}}],["criteria",{"2":{"664":1}}],["criterion",{"2":{"645":1}}],["crypto",{"2":{"87":1,"911":1}}],["cryptor",{"0":{"86":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1},"2":{"0":1,"86":1,"87":2,"88":2,"91":6,"92":6,"93":6,"94":6,"95":6,"96":6,"97":6,"98":6,"99":6,"100":4,"101":4,"102":6,"103":6,"104":6,"105":6,"106":6,"107":6,"108":6,"109":6,"110":6,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":4,"119":4,"120":4,"121":4,"122":4,"123":4,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"130":4,"131":8,"132":8}}],["chinese",{"2":{"855":1,"864":1,"865":1,"866":1,"886":1}}],["child",{"2":{"387":2,"747":4}}],["children",{"2":{"387":1}}],["chunk",{"0":{"639":1},"2":{"633":1,"639":12}}],["ch",{"2":{"70":8,"711":8}}],["chainable",{"2":{"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1}}],["chars",{"2":{"791":1,"882":1,"887":1}}],["charset=utf",{"2":{"457":4}}],["charactermask",{"2":{"789":2,"790":2}}],["characters",{"2":{"779":1,"780":1,"781":1,"789":2,"794":2}}],["character",{"2":{"765":1,"767":1,"768":1,"886":1}}],["char",{"2":{"69":1,"481":1,"758":2,"759":2,"760":2,"761":2,"772":1,"862":1}}],["change",{"2":{"261":1,"530":2,"531":2,"532":2,"778":1}}],["chanel",{"2":{"46":1}}],["chan",{"2":{"38":16,"39":6,"40":2,"41":2,"42":2,"43":8,"44":4,"45":6,"46":6,"70":2,"82":2,"499":3,"711":4}}],["chanstream",{"2":{"38":2}}],["channels",{"2":{"38":1,"39":9,"43":3,"46":1}}],["channel",{"0":{"34":1,"36":1},"1":{"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1},"2":{"30":1,"31":1,"37":5,"38":3,"39":3,"40":4,"41":4,"42":4,"43":4,"44":6,"45":4,"46":2,"70":1,"711":1}}],["ch2",{"2":{"46":4}}],["ch1",{"2":{"46":4}}],["chs",{"2":{"39":4}}],["checker",{"2":{"340":2}}],["check",{"2":{"23":1,"24":1,"244":1,"258":1,"295":1,"296":1,"298":1,"307":1,"309":1,"318":1,"319":1,"321":1,"327":1,"328":1,"342":1,"346":1,"349":1,"369":1,"378":1,"396":1,"437":1,"636":1,"638":1,"652":1,"653":1,"744":1,"747":1,"748":1,"749":1,"752":1,"766":1,"800":1,"801":1,"802":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"886":2,"899":1,"909":1}}],["checks",{"2":{"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"59":1,"183":1,"220":1,"235":1,"339":1,"340":1,"343":1,"440":1,"458":1,"459":1,"460":1,"468":1,"527":1,"528":1,"535":1,"559":1,"579":1,"580":1,"594":1,"595":1,"684":1,"685":1,"686":1,"687":1,"784":1,"785":1,"786":1,"862":1,"884":1,"885":1,"886":1,"887":1,"900":1}}],["cause",{"2":{"893":2,"894":2,"896":2,"903":6,"906":1}}],["card",{"2":{"867":1}}],["carlmjohnson",{"2":{"47":2}}],["camelcase",{"0":{"762":1},"2":{"756":1,"762":5}}],["caculates",{"2":{"558":1}}],["cache",{"2":{"2":1,"17":17}}],["calculate",{"2":{"543":1,"544":1,"545":1,"550":1}}],["calculation",{"2":{"537":1}}],["callback",{"2":{"673":1,"702":1}}],["calls",{"2":{"536":1,"790":1}}],["called",{"2":{"52":1,"493":1,"494":1,"886":1}}],["call",{"2":{"14":1,"15":1,"76":1,"347":1,"542":1,"697":1,"886":1}}],["case",{"2":{"403":1,"521":6,"614":1,"615":1,"763":1,"764":1,"765":1,"767":1,"768":1,"773":1,"774":1,"788":1,"857":1,"858":1,"860":1,"861":1}}],["cases",{"2":{"67":6,"81":4}}],["capitalize",{"0":{"765":1},"2":{"756":1,"765":4}}],["cap",{"0":{"263":1},"2":{"241":1,"263":6}}],["capacity",{"2":{"17":2,"178":1,"179":3,"288":3,"311":3,"323":3}}],["cannot",{"2":{"670":1,"671":1}}],["can",{"2":{"73":1,"81":3,"488":1,"501":1,"582":1,"594":1,"595":1,"625":1,"704":1,"874":1,"875":1,"876":1,"903":1}}],["canceled",{"2":{"620":1,"629":1}}],["cancel",{"2":{"38":5,"39":5,"40":5,"41":4,"42":4,"44":5,"45":4,"46":5,"625":5}}],["c",{"2":{"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"26":2,"28":2,"37":2,"38":6,"39":10,"40":8,"41":6,"42":8,"43":12,"44":10,"45":6,"46":10,"69":2,"73":4,"78":4,"142":2,"144":2,"147":2,"149":2,"151":2,"153":2,"155":2,"157":2,"159":2,"161":2,"163":2,"165":2,"167":2,"169":2,"171":2,"184":2,"185":4,"186":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"482":4,"508":2,"509":2,"510":2,"511":4,"512":4,"513":4,"514":4,"515":6,"516":2,"517":2,"518":4,"519":4,"521":8,"522":4,"523":2,"524":4,"525":4,"526":4,"527":2,"528":2,"572":2,"603":4,"604":4,"605":4,"635":4,"636":2,"637":2,"638":4,"639":12,"641":4,"647":12,"648":14,"649":12,"660":4,"661":4,"667":6,"669":20,"670":2,"671":2,"676":4,"680":12,"681":4,"688":6,"689":4,"690":4,"692":6,"694":4,"700":18,"775":16,"779":4,"780":2,"782":2,"783":2,"790":6,"807":1,"818":12,"819":4,"820":8,"821":6,"822":12,"823":4,"824":8,"825":6,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":16,"839":8,"840":12,"841":10,"842":16,"843":8,"844":12,"845":10,"846":16,"847":8,"848":12,"849":10}}],["corresponding",{"2":{"907":1}}],["correspond",{"2":{"816":1,"820":1,"824":1,"828":1,"832":1,"836":1,"840":1,"844":1,"848":1}}],["cosine",{"2":{"562":1}}],["cos",{"0":{"562":1},"2":{"540":1,"562":12}}],["could",{"2":{"465":1}}],["countby",{"0":{"643":1},"2":{"633":1,"643":4}}],["countrycode",{"2":{"577":4}}],["country",{"2":{"577":4}}],["count++",{"2":{"497":2,"499":2}}],["count",{"0":{"642":1,"733":1},"2":{"13":1,"277":1,"497":6,"499":4,"529":2,"554":3,"633":1,"642":6,"707":1,"733":7}}],["countsort",{"0":{"13":1},"2":{"4":1,"13":4}}],["copied",{"2":{"133":1}}],["copies",{"2":{"82":1}}],["copyfile",{"0":{"454":1},"2":{"449":1,"454":4}}],["copyonwritelisttype",{"2":{"138":1}}],["copyonwritelist",{"0":{"133":1},"1":{"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1},"2":{"133":1,"134":2,"138":4,"140":3,"142":2,"144":2,"147":2,"149":2,"151":2,"153":3,"155":2,"157":2,"159":2,"161":2,"163":2,"165":2,"167":2,"169":2,"171":2}}],["copy",{"2":{"81":1,"260":1,"345":1,"454":3,"680":1,"681":1,"788":1,"896":1}}],["copyproperties",{"0":{"82":1},"2":{"63":1,"82":4}}],["code",{"2":{"74":8,"501":1,"528":1,"886":1,"907":1}}],["collection",{"2":{"70":1,"159":1,"355":1,"381":1}}],["colorhex",{"2":{"65":6,"66":4}}],["colorhextorgb",{"0":{"65":1},"2":{"63":1,"65":4}}],["color",{"2":{"65":2,"66":2}}],["colorrgbtohex",{"0":{"66":1},"2":{"63":1,"66":4}}],["command",{"2":{"795":1,"807":9}}],["comma",{"0":{"481":1},"2":{"479":1,"481":9}}],["common",{"2":{"287":1,"299":1,"322":1,"527":1,"560":1,"561":1,"910":1}}],["com",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":2,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":2,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":6,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":4,"582":2,"583":4,"584":4,"585":2,"586":4,"587":4,"588":4,"589":4,"590":4,"591":4,"592":4,"593":4,"594":6,"595":6,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"625":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":8,"869":6,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":6,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":4,"896":2,"897":3,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["compatible",{"2":{"897":1,"902":1}}],["compact",{"0":{"640":1},"2":{"633":1,"640":10}}],["comparisons",{"2":{"698":1}}],["comparison",{"2":{"18":1}}],["comparable",{"2":{"17":2,"74":2,"78":2,"275":2,"335":4,"336":2,"508":2,"509":2,"510":2,"511":4,"512":2,"513":2,"514":4,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":4,"523":2,"524":4,"525":4,"526":4,"527":2,"528":2,"529":2,"635":2,"636":2,"638":2,"640":2,"642":2,"644":2,"645":2,"652":2,"665":2,"668":2,"670":2,"671":2,"680":2,"681":2,"693":2,"696":2,"697":2,"698":2,"699":2,"701":2,"702":2}}],["comparator",{"2":{"6":10,"7":12,"8":10,"9":10,"10":10,"11":10,"12":10,"13":10,"14":10,"15":10,"193":6,"323":6,"325":4,"326":4,"327":4,"328":4,"329":4,"387":1,"388":6,"547":3,"549":3,"646":3,"653":3}}],["compareosenv",{"0":{"806":1},"2":{"798":1,"806":4}}],["comparedenv",{"2":{"806":3}}],["comparedslice",{"2":{"644":2,"645":2,"646":2}}],["comparedset",{"2":{"353":2}}],["compared",{"2":{"353":1,"645":1}}],["compare",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1},"2":{"0":1,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"18":1,"19":4,"23":16,"24":10,"25":14,"26":16,"27":14,"28":16,"29":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"257":1,"323":1,"325":2,"326":2,"327":2,"328":2,"329":2,"387":1,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"398":1,"646":1,"806":1}}],["compressed",{"2":{"582":2}}],["comprehensive",{"2":{"0":1}}],["composed",{"2":{"496":1,"665":1}}],["compose",{"0":{"496":1},"2":{"491":1,"496":5}}],["completed",{"2":{"583":4,"584":4,"585":2,"591":4}}],["complete",{"2":{"133":1,"807":1}}],["convenient",{"2":{"741":1}}],["conversion",{"2":{"399":1}}],["convertmaptoquerystring",{"0":{"572":1},"2":{"570":1,"572":4}}],["converts",{"2":{"83":1,"84":1,"85":1,"275":1,"556":1,"557":1,"702":1,"782":1,"783":1}}],["converted",{"2":{"73":1}}],["convert",{"2":{"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"76":2,"77":2,"78":1,"572":1,"585":2,"666":1,"667":1,"692":1,"741":1,"765":1,"767":1,"768":1,"874":1,"875":1,"876":1}}],["convertion",{"2":{"60":1}}],["convertor",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"0":1,"60":1,"61":2,"62":2,"65":4,"66":2,"67":4,"68":4,"69":8,"70":4,"71":14,"72":12,"73":2,"74":4,"75":4,"76":16,"77":4,"78":2,"79":4,"80":4,"81":4,"82":4,"83":4,"84":4,"85":6}}],["concatenated",{"2":{"714":1}}],["concatenating",{"2":{"641":1}}],["concat",{"0":{"641":1,"714":1},"2":{"633":1,"641":6,"707":1,"714":4}}],["concurrentmap",{"0":{"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1},"2":{"505":7,"529":7,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2}}],["concurrent",{"2":{"30":1,"529":1}}],["concurrency",{"0":{"30":1},"1":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1},"2":{"0":2,"30":1,"31":1,"32":2,"37":4,"38":4,"39":4,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":4,"911":1}}],["config",{"2":{"582":9,"625":1}}],["configurations",{"2":{"582":1}}],["consecutive",{"2":{"794":1}}],["constructor",{"2":{"740":1,"741":2}}],["constraints",{"2":{"7":2,"29":4,"481":4,"542":4,"546":4,"548":4,"554":4,"555":4,"560":2,"561":2,"565":4,"566":4,"684":2,"685":2,"686":2,"687":2,"688":2,"712":4}}],["consumed",{"2":{"718":1}}],["consumer",{"2":{"273":2,"718":2}}],["consisting",{"2":{"716":1,"717":1,"718":1,"719":1,"720":1,"723":1}}],["contrast",{"2":{"657":1,"659":1}}],["control",{"2":{"488":1}}],["contents",{"2":{"464":4}}],["content",{"2":{"451":1,"463":5,"472":5,"473":5,"474":6,"475":6,"581":2,"586":2,"587":2,"588":2,"590":2,"591":2}}],["context",{"0":{"625":1},"2":{"38":11,"39":11,"40":11,"41":10,"42":11,"43":2,"44":11,"45":10,"46":11,"620":1,"623":1,"625":16,"629":1}}],["containfile",{"2":{"902":4}}],["containupper",{"0":{"858":1},"2":{"853":1,"858":8}}],["containlower",{"0":{"857":1},"2":{"853":1,"857":8}}],["containletter",{"0":{"856":1},"2":{"853":1,"856":8}}],["containchinese",{"0":{"855":1},"2":{"853":1,"855":8}}],["containby",{"0":{"637":1},"2":{"633":1,"637":10}}],["containall",{"0":{"343":1},"2":{"333":1,"343":6,"345":2}}],["container",{"2":{"330":1}}],["contained",{"2":{"268":1,"271":1,"272":1,"351":1}}],["contain",{"0":{"153":1,"244":1,"298":1,"309":1,"321":1,"342":1,"636":1},"1":{"154":1},"2":{"30":1,"136":1,"149":1,"151":1,"153":2,"154":2,"241":1,"244":6,"267":1,"282":1,"283":1,"284":1,"298":6,"309":6,"321":6,"333":1,"342":6,"350":1,"612":1,"633":1,"635":1,"636":6,"638":1,"855":1,"856":1,"857":1,"858":1}}],["containsany",{"0":{"793":1},"2":{"756":1,"793":8}}],["containsall",{"0":{"792":1},"2":{"756":1,"792":6}}],["containsubslice",{"0":{"638":1},"2":{"633":1,"638":6}}],["contains",{"0":{"183":1},"2":{"0":1,"47":1,"60":1,"86":1,"153":1,"176":1,"183":6,"343":1,"476":1,"509":1,"567":1,"596":1,"613":1,"719":1,"753":1,"775":1,"779":1,"780":1,"792":1,"793":1,"795":1,"850":1,"859":1,"902":2}}],["conditions",{"2":{"210":1,"226":1}}],["conditionfalse",{"2":{"59":4}}],["conditiontrue",{"2":{"59":4}}],["conditional",{"2":{"47":1}}],["condition",{"0":{"47":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1},"2":{"0":1,"20":2,"47":1,"48":2,"49":2,"52":20,"53":10,"54":10,"55":10,"56":10,"57":10,"58":10,"59":6}}],["covert",{"2":{"763":1,"764":1}}],["coverts",{"2":{"762":1,"773":1,"774":1}}],["cover",{"2":{"0":1}}],["ignores",{"2":{"790":1}}],["ignored",{"2":{"762":1,"763":1,"764":1,"773":1,"774":1}}],["ioutil",{"2":{"586":4,"587":4,"588":4,"589":4,"590":4,"591":2}}],["io",{"2":{"483":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["ival",{"2":{"83":6}}],["ipv6",{"2":{"881":1}}],["ipv4",{"2":{"575":1,"880":1}}],["ip3",{"2":{"579":4,"580":4}}],["ip2",{"2":{"579":4,"580":4}}],["ip1",{"2":{"579":4,"580":4}}],["ipstr",{"2":{"879":2,"880":2,"881":2}}],["ips",{"2":{"575":4}}],["ip",{"2":{"82":12,"574":5,"577":3,"578":5,"579":5,"580":5,"879":1}}],["idxfrom",{"2":{"787":2}}],["id",{"0":{"899":1},"2":{"82":12,"583":6,"584":6,"585":8,"588":4,"590":4,"591":4,"865":3,"887":2,"891":1,"893":2,"896":1,"899":11,"900":7,"903":4}}],["i++",{"2":{"38":2,"39":2,"67":2,"325":2,"326":2,"327":2,"328":2,"329":2,"501":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"711":2}}],["i",{"2":{"38":6,"39":8,"67":6,"166":4,"250":1,"264":2,"273":4,"277":1,"325":6,"326":6,"327":6,"328":6,"329":6,"501":6,"524":4,"530":6,"531":6,"532":6,"533":6,"534":6,"535":6,"536":6,"643":2,"645":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"664":2,"673":2,"674":2,"691":2,"711":6,"779":4,"780":2,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["it",{"2":{"165":1,"167":1,"195":1,"196":2,"221":1,"236":1,"252":1,"253":1,"278":1,"291":1,"303":1,"314":1,"326":1,"339":3,"340":3,"354":1,"365":1,"374":1,"454":1,"467":1,"486":1,"487":1,"493":1,"494":1,"522":1,"523":1,"532":1,"582":1,"620":1,"629":1,"635":1,"674":1,"679":1,"699":1,"704":1,"769":1,"770":1,"771":1,"790":1,"806":1,"809":1,"886":1,"905":1,"906":1,"907":1}}],["its",{"2":{"83":1,"133":1,"272":1,"657":1,"659":1}}],["itself",{"2":{"14":1,"15":1}}],["item2",{"2":{"677":2}}],["item1",{"2":{"677":2}}],["items",{"2":{"262":1,"266":1,"335":2,"336":2,"338":3,"341":2,"355":1,"657":1,"659":1,"694":3,"695":2,"701":3,"715":1}}],["item",{"2":{"81":7,"182":1,"265":1,"274":4,"290":2,"325":2,"339":4,"340":4,"341":1,"342":3,"347":6,"348":2,"520":2,"521":2,"585":4,"635":3,"637":2,"642":3,"643":2,"645":2,"650":2,"651":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"662":2,"663":2,"664":2,"670":4,"671":4,"672":2,"673":2,"674":2,"678":10,"679":6,"682":3,"687":2,"691":2,"697":3,"699":2,"702":2,"703":1,"713":2,"716":2,"717":2,"718":2,"724":6,"730":10,"731":10,"732":10}}],["iterating",{"2":{"911":1}}],["iteration",{"2":{"536":1}}],["iterates",{"2":{"348":1,"509":1,"510":1,"511":1,"515":1,"643":1,"656":1,"657":1,"658":1,"659":1,"662":1,"663":1,"664":1,"679":1}}],["iterate",{"0":{"184":1,"347":1},"2":{"176":1,"184":4,"333":1,"347":4}}],["iteratee",{"2":{"74":3,"78":3,"184":3,"275":3,"348":3,"508":3,"522":2,"523":2,"526":2,"645":3,"662":2,"663":3,"665":3,"672":2,"673":3,"674":2,"677":2,"687":3,"697":3,"699":1,"702":2}}],["iterator",{"0":{"274":1},"2":{"0":1,"241":1,"274":15,"536":4}}],["iterators",{"2":{"0":1}}],["itoa",{"2":{"78":2,"522":2,"523":2,"526":2}}],["ifvalue",{"2":{"59":3}}],["if",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":5,"15":5,"16":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"52":4,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"68":2,"71":1,"72":1,"73":3,"80":2,"82":2,"130":2,"131":2,"132":2,"147":1,"149":1,"151":1,"153":1,"165":1,"167":1,"171":1,"183":1,"193":2,"194":2,"195":3,"196":3,"197":2,"198":2,"199":2,"210":1,"220":1,"226":1,"235":1,"244":1,"247":1,"248":1,"249":1,"250":1,"254":1,"255":1,"258":1,"290":1,"295":1,"296":1,"298":1,"307":1,"309":1,"313":1,"318":1,"319":1,"321":1,"325":3,"326":2,"327":3,"328":3,"329":2,"339":2,"340":2,"342":1,"343":1,"346":1,"348":2,"349":1,"354":1,"365":1,"369":1,"374":1,"378":1,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":3,"397":2,"437":1,"440":1,"451":2,"452":1,"454":3,"456":2,"458":1,"459":1,"460":1,"462":2,"465":2,"466":2,"467":2,"468":1,"473":4,"474":6,"475":6,"481":1,"527":1,"528":3,"531":1,"532":1,"534":1,"535":1,"536":1,"559":1,"573":2,"577":2,"579":1,"580":1,"583":4,"584":4,"586":2,"587":2,"588":2,"589":2,"590":2,"591":4,"594":1,"595":1,"603":1,"604":1,"618":2,"625":2,"626":4,"627":4,"628":4,"629":4,"635":1,"636":1,"637":1,"638":1,"652":1,"653":1,"654":1,"657":1,"659":1,"663":2,"670":1,"671":1,"673":2,"684":1,"685":1,"686":1,"687":1,"688":1,"690":3,"691":1,"700":1,"704":1,"719":1,"725":1,"726":1,"727":1,"744":1,"747":1,"748":1,"749":1,"752":1,"766":1,"769":1,"770":1,"771":1,"784":1,"785":1,"786":1,"787":1,"792":1,"793":1,"800":1,"801":1,"802":1,"806":2,"807":3,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"895":1,"900":1,"905":2,"907":1}}],["initial",{"2":{"677":2,"678":2,"679":2,"725":2}}],["increament",{"2":{"717":4}}],["increasenumber",{"2":{"625":4,"626":4,"627":4,"628":4,"629":4}}],["increase",{"2":{"499":4}}],["includes",{"2":{"278":1,"502":1}}],["included",{"2":{"169":2,"644":1,"668":1,"673":1,"712":1,"722":1}}],["inclusive",{"2":{"276":1}}],["input",{"2":{"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4}}],["inordertraverse",{"0":{"392":1},"2":{"385":1,"392":4}}],["invoke",{"2":{"498":1,"499":1}}],["invoked",{"2":{"497":1,"520":1,"521":1,"645":1,"646":1,"699":1}}],["invokes",{"2":{"348":1,"493":1,"494":1,"662":1,"663":1}}],["invoking",{"2":{"497":1}}],["invalid",{"2":{"71":3,"72":3,"481":1,"896":4,"897":4,"903":4}}],["inner",{"2":{"263":1}}],["infomation",{"2":{"456":1}}],["info",{"0":{"903":1},"2":{"222":1,"237":1,"891":1,"903":4}}],["information",{"2":{"47":1,"567":1,"574":1,"577":1,"903":1}}],["indicatorvo",{"2":{"82":14}}],["indicator",{"2":{"82":8}}],["indelta",{"0":{"29":1},"2":{"21":1,"29":14}}],["indexes",{"2":{"169":1}}],["indexoffset",{"0":{"787":1},"2":{"756":1,"787":12}}],["indexoffunc",{"0":{"249":1},"2":{"241":1,"249":7}}],["indexof",{"0":{"147":1,"247":1,"670":1},"1":{"148":1},"2":{"136":1,"147":2,"148":2,"241":1,"247":6,"633":1,"670":6}}],["index",{"0":{"4":1,"21":1,"33":1,"50":1,"63":1,"89":1,"176":1,"190":1,"203":1,"241":1,"281":1,"333":1,"358":1,"384":1,"401":1,"449":1,"479":1,"491":1,"505":1,"540":1,"570":1,"599":1,"609":1,"623":1,"633":1,"707":1,"738":1,"756":1,"798":1,"812":1,"853":1,"891":1},"1":{"34":1,"204":1,"205":1,"282":1,"283":1,"284":1,"285":1,"359":1,"360":1,"385":1},"2":{"14":1,"15":1,"16":2,"142":2,"144":2,"147":1,"149":1,"155":3,"161":2,"163":2,"210":4,"211":1,"212":1,"213":3,"214":1,"215":1,"218":1,"226":4,"227":1,"228":1,"229":3,"230":1,"231":1,"233":1,"246":3,"247":1,"248":1,"249":1,"250":1,"254":4,"255":4,"256":4,"264":1,"643":2,"645":2,"647":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"662":2,"663":2,"664":2,"669":3,"670":1,"671":1,"672":2,"673":2,"674":2,"677":2,"678":2,"679":2,"691":2,"700":5,"787":1}}],["inspired",{"2":{"910":1}}],["install",{"2":{"906":6}}],["installation",{"0":{"906":1},"1":{"907":1,"908":1,"909":1}}],["instances",{"2":{"680":1,"681":1}}],["instanced",{"2":{"582":1}}],["instance",{"2":{"37":1,"80":1,"178":1,"179":1,"193":1,"208":1,"224":1,"335":1,"388":1,"787":1,"893":1,"894":1}}],["instead",{"0":{"440":1}}],["insert",{"0":{"389":1},"2":{"210":1,"211":1,"212":1,"226":1,"227":1,"228":1,"255":1,"278":1,"385":1,"389":11,"390":8,"391":8,"392":8,"393":8,"394":8,"395":8,"396":14,"397":8,"669":1}}],["insertattail",{"0":{"212":1,"228":1},"2":{"204":1,"205":1,"209":6,"212":8,"213":8,"214":8,"215":6,"216":8,"217":6,"218":6,"219":6,"220":6,"221":6,"222":6,"225":6,"228":8,"229":8,"230":8,"231":6,"232":6,"233":6,"234":6,"235":6,"236":6,"237":6}}],["insertathead",{"0":{"211":1,"227":1},"2":{"204":1,"205":1,"211":8,"227":8}}],["insertat",{"0":{"210":1,"226":1,"255":1,"669":1},"2":{"204":1,"205":1,"210":12,"226":12,"241":1,"255":10,"633":1,"669":12}}],["inserts",{"2":{"161":1}}],["insertion",{"2":{"7":1}}],["insertionsort",{"0":{"7":1},"2":{"4":1,"7":4}}],["in",{"2":{"16":1,"46":2,"47":1,"130":1,"142":1,"144":1,"147":1,"149":1,"155":1,"163":1,"180":1,"181":1,"182":1,"183":1,"198":1,"209":1,"214":1,"215":1,"216":1,"217":1,"219":1,"221":1,"225":1,"230":1,"231":1,"232":1,"234":1,"236":1,"244":1,"246":1,"247":1,"248":1,"250":1,"264":1,"266":1,"267":1,"268":1,"269":2,"271":2,"272":1,"274":2,"294":1,"297":1,"298":1,"306":1,"308":1,"309":1,"317":1,"320":1,"321":1,"323":1,"329":1,"339":2,"340":2,"341":1,"342":1,"344":1,"351":1,"352":2,"353":2,"355":1,"367":1,"368":1,"370":1,"376":1,"377":1,"379":1,"387":3,"391":1,"392":1,"393":1,"394":1,"403":1,"452":1,"453":1,"461":1,"469":1,"508":1,"514":1,"515":1,"518":2,"527":1,"531":1,"536":2,"592":1,"636":1,"642":1,"644":1,"654":1,"657":1,"659":1,"670":1,"671":1,"672":1,"676":1,"689":1,"691":1,"693":2,"696":1,"698":1,"704":1,"720":1,"722":1,"733":1,"734":1,"741":1,"758":1,"759":1,"787":2,"788":1,"791":1,"807":2,"815":1,"819":1,"823":1,"827":1,"831":1,"835":1,"839":1,"843":1,"847":1,"899":1,"906":1}}],["intranet",{"2":{"580":1}}],["intslice",{"0":{"666":1},"2":{"666":4}}],["intslicedeprecated",{"2":{"633":1}}],["ints",{"2":{"516":2,"520":2,"688":1}}],["intstream",{"2":{"40":4,"41":8,"42":4,"44":4,"45":4,"46":4}}],["intable",{"2":{"72":1}}],["into",{"2":{"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"46":1,"82":1,"161":1,"194":1,"210":1,"211":1,"212":1,"226":1,"227":1,"228":1,"255":1,"290":1,"302":1,"313":1,"325":1,"364":1,"373":1,"389":1,"472":1,"486":1,"487":1,"500":1,"524":1,"584":1,"639":1,"669":1,"675":1,"779":1,"907":1}}],["intersect",{"0":{"515":1},"2":{"505":1,"515":8}}],["intersection",{"0":{"268":1,"351":1,"668":1},"2":{"241":1,"268":4,"269":2,"270":3,"333":1,"351":4,"633":1,"668":4}}],["interfaceslice",{"0":{"667":1},"2":{"667":4}}],["interfaceslicedeprecated",{"2":{"633":1}}],["interface",{"2":{"73":1,"81":4,"83":3,"185":2,"186":2,"387":1,"507":5,"591":1,"605":1,"666":3,"667":3,"692":3,"904":1}}],["internalip",{"2":{"574":4}}],["internal",{"2":{"19":1,"574":1,"886":1}}],["integers",{"2":{"560":3,"561":3}}],["integer",{"2":{"29":2,"52":2,"481":2,"542":2,"546":2,"548":2,"554":2,"555":2,"560":2,"561":2,"565":2,"566":2,"712":2,"871":1,"873":1,"874":1}}],["int64func",{"2":{"425":1,"426":1,"433":1,"438":1,"442":1,"443":1,"444":1,"445":1,"543":1}}],["int64",{"2":{"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"72":3,"82":2,"404":2,"405":2,"406":2,"407":2,"425":1,"426":1,"429":2,"430":5,"431":2,"432":2,"433":1,"438":1,"442":1,"443":1,"444":1,"445":1,"469":2,"470":2,"501":8,"543":3,"673":2,"674":2,"844":2,"845":2,"848":2,"849":2}}],["intfunc",{"2":{"14":1,"15":1,"16":1,"17":1,"140":1,"147":1,"149":1,"198":1,"219":1,"234":1,"247":1,"248":1,"249":1,"250":1,"262":1,"263":1,"277":1,"294":1,"306":1,"317":1,"329":1,"344":1,"368":1,"377":1,"395":1,"439":1,"544":1,"612":1,"619":1,"642":1,"643":1,"666":1,"670":1,"671":1,"733":1,"780":1,"787":1,"808":1}}],["int",{"2":{"6":8,"7":4,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":11,"15":11,"16":5,"17":7,"23":12,"24":2,"37":2,"38":8,"39":4,"40":2,"41":2,"44":2,"45":6,"46":2,"52":2,"65":2,"66":2,"70":2,"73":2,"74":4,"76":2,"77":2,"78":4,"81":8,"82":2,"130":2,"139":2,"140":1,"141":2,"142":2,"143":2,"144":2,"145":2,"147":1,"148":2,"149":1,"150":2,"152":2,"154":2,"155":2,"156":2,"158":2,"160":4,"161":2,"162":2,"163":2,"164":2,"166":4,"168":2,"169":4,"170":2,"172":4,"193":8,"194":12,"195":10,"196":10,"197":12,"198":11,"199":10,"208":4,"209":4,"210":6,"211":4,"212":4,"213":6,"214":4,"215":4,"216":4,"217":4,"218":2,"219":3,"220":2,"221":2,"222":2,"224":4,"225":4,"226":6,"227":4,"228":4,"229":6,"230":4,"231":4,"232":4,"233":2,"234":3,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":4,"247":3,"248":3,"249":7,"250":7,"251":4,"252":2,"253":2,"254":4,"255":4,"256":4,"257":6,"258":4,"259":2,"260":2,"261":4,"262":3,"263":3,"264":4,"265":2,"266":2,"267":4,"268":4,"269":4,"270":4,"271":12,"272":12,"273":6,"274":4,"275":8,"276":6,"277":7,"288":12,"289":2,"290":2,"291":2,"292":2,"293":2,"294":3,"295":2,"296":2,"297":2,"298":2,"300":4,"301":2,"302":2,"303":2,"304":2,"305":2,"306":3,"307":2,"308":2,"309":2,"311":10,"312":2,"313":2,"314":2,"315":2,"316":2,"317":3,"318":2,"319":2,"320":2,"321":2,"323":6,"324":2,"325":8,"326":8,"327":8,"328":8,"329":9,"335":2,"336":2,"337":2,"338":2,"339":2,"340":6,"341":2,"342":2,"344":1,"347":4,"348":4,"354":2,"363":4,"364":4,"365":4,"366":4,"367":4,"368":3,"369":2,"370":4,"372":4,"373":4,"374":4,"375":4,"376":4,"377":3,"378":2,"379":4,"380":2,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":7,"396":6,"397":6,"437":2,"439":1,"471":2,"482":2,"484":2,"485":2,"493":2,"494":2,"495":10,"500":12,"507":4,"508":6,"509":6,"510":2,"511":4,"512":4,"513":2,"514":4,"515":6,"516":2,"517":4,"518":4,"519":2,"520":6,"521":2,"522":4,"523":4,"524":4,"525":2,"526":4,"527":6,"528":2,"529":6,"530":6,"531":6,"532":4,"533":6,"534":6,"535":6,"536":6,"544":3,"550":2,"551":2,"552":2,"553":2,"554":2,"559":2,"562":2,"563":2,"583":4,"584":4,"585":4,"588":4,"590":4,"591":4,"603":2,"604":2,"606":1,"611":2,"612":4,"613":2,"614":2,"615":2,"616":2,"617":2,"619":4,"636":2,"637":2,"639":2,"640":4,"641":4,"642":3,"643":7,"644":4,"645":12,"646":6,"647":4,"648":2,"649":2,"650":6,"651":8,"652":6,"653":6,"654":6,"655":6,"656":6,"657":6,"658":6,"659":6,"662":10,"663":8,"664":6,"666":4,"668":4,"669":2,"670":1,"671":1,"672":10,"673":6,"674":8,"675":4,"677":10,"678":18,"679":8,"680":2,"682":2,"683":2,"684":6,"685":6,"686":6,"687":6,"688":2,"689":4,"690":1,"691":6,"693":4,"697":6,"698":4,"699":6,"700":2,"701":2,"702":2,"703":2,"710":2,"711":2,"713":4,"714":4,"715":2,"716":4,"717":6,"718":4,"719":4,"720":4,"721":2,"722":4,"723":4,"724":4,"725":6,"726":2,"727":2,"728":4,"729":4,"730":6,"731":6,"732":6,"733":5,"747":2,"748":2,"749":2,"750":2,"751":4,"752":4,"769":2,"770":2,"771":2,"776":2,"780":1,"787":3,"791":2,"808":1,"816":2,"817":2,"820":2,"821":2,"824":2,"825":2,"828":4,"829":4,"832":4,"833":4,"836":4,"837":4,"840":4,"841":4,"842":2,"843":2,"844":4,"845":4,"846":2,"847":2,"848":4,"849":4,"871":1,"882":2,"884":2}}],["intcomparator",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"193":6,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6,"325":6,"326":6,"327":6,"328":6,"329":6,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"396":8,"397":6}}],["implemented",{"2":{"187":1,"192":1,"238":1,"243":1,"287":1,"299":1,"310":1,"322":1,"362":1,"371":1,"886":1}}],["implementation",{"2":{"47":2,"133":1}}],["implements",{"2":{"1":1,"6":1,"7":3,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"17":1,"387":1,"446":1,"537":1,"606":1,"630":1,"704":1,"809":1,"888":1,"904":1}}],["imported",{"2":{"908":1}}],["import",{"2":{"3":1,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"20":1,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"32":1,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"49":1,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"62":1,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":2,"85":2,"88":1,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"135":1,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"175":1,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"189":1,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"202":1,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"240":1,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"280":1,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"332":1,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"357":1,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"383":1,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"400":1,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"448":1,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"478":1,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"490":1,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"504":1,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"539":1,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"569":1,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"598":1,"601":2,"602":2,"603":2,"604":2,"605":2,"608":1,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"622":1,"625":1,"626":2,"627":2,"628":2,"629":2,"632":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"706":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"737":1,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"755":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"797":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"811":1,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"852":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"890":1,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"907":3,"908":2}}],["isurl",{"0":{"883":1},"2":{"853":1,"883":8}}],["isipv6",{"0":{"881":1},"2":{"853":1,"881":6}}],["isipv4",{"0":{"880":1},"2":{"853":1,"880":6}}],["isip",{"0":{"879":1},"2":{"853":1,"879":10}}],["isintstr",{"0":{"874":1},"2":{"853":1,"874":10}}],["isint",{"0":{"871":1},"2":{"853":1,"871":10}}],["isinternalip",{"0":{"580":1},"2":{"570":1,"580":8}}],["isregexmatch",{"0":{"878":1},"2":{"853":1,"878":6}}],["isjson",{"0":{"877":1},"2":{"853":1,"877":10}}],["isnumberstr",{"0":{"876":1},"2":{"853":1,"876":10}}],["isnumber",{"0":{"873":1},"2":{"853":1,"873":10}}],["iscreditcard",{"0":{"867":1},"2":{"853":1,"867":6}}],["iscreatedsucceed",{"2":{"452":4}}],["ischinesephone",{"0":{"866":1},"2":{"853":1,"866":6}}],["ischineseidnum",{"0":{"865":1},"2":{"853":1,"865":6}}],["ischinesemobile",{"0":{"864":1},"2":{"853":1,"864":6}}],["isbase64",{"0":{"863":1},"2":{"853":1,"863":6}}],["isblank",{"0":{"784":1},"2":{"756":1,"784":8}}],["isascii",{"0":{"862":1},"2":{"853":1,"862":12}}],["isascending",{"0":{"684":1},"2":{"633":1,"684":8}}],["isalllower",{"0":{"861":1},"2":{"853":1,"861":8}}],["isallupper",{"0":{"860":1},"2":{"853":1,"860":8}}],["isalpha",{"0":{"859":1},"2":{"853":1,"859":8}}],["isosmac",{"2":{"802":4}}],["isoslinux",{"2":{"801":4}}],["isoswindows",{"2":{"800":4}}],["iso8601",{"2":{"432":3,"436":1}}],["ismac",{"0":{"802":1},"2":{"798":1,"802":4}}],["isweakpassword",{"0":{"884":1},"2":{"853":1,"884":6}}],["isweekend",{"0":{"440":1},"2":{"440":8}}],["isweekenddeprecated",{"2":{"401":1}}],["iswindows",{"0":{"800":1},"2":{"798":1,"800":4}}],["isstrongpassword",{"0":{"882":1},"2":{"853":1,"882":6}}],["isstring",{"0":{"766":1},"2":{"756":1,"766":12}}],["isstruct",{"0":{"744":1},"2":{"738":1,"744":4}}],["isslice",{"0":{"752":1},"2":{"738":1,"752":4}}],["issortedbykey",{"0":{"687":1},"2":{"633":1,"687":8}}],["issorted",{"0":{"686":1},"2":{"633":1,"686":8}}],["isdns",{"0":{"868":1},"2":{"853":1,"868":8}}],["isdouble",{"2":{"646":4,"653":4}}],["isdescending",{"0":{"685":1},"2":{"633":1,"685":8}}],["isdisjoint",{"0":{"527":1},"2":{"505":1,"527":6}}],["isdir",{"0":{"460":1},"2":{"449":1,"460":14}}],["istelnetconnected",{"0":{"595":1},"2":{"570":1,"595":6}}],["istrue",{"2":{"59":2}}],["isprintable",{"0":{"887":1},"2":{"853":1,"887":12}}],["isprime",{"0":{"559":1},"2":{"540":1,"559":10}}],["isp",{"2":{"577":4}}],["ispingconnected",{"0":{"594":1},"2":{"570":1,"594":6}}],["ispublicip",{"0":{"579":1},"2":{"570":1,"579":8}}],["ispointerequal",{"2":{"81":4}}],["isfloatstr",{"0":{"875":1},"2":{"853":1,"875":10}}],["isfloat",{"0":{"872":1},"2":{"853":1,"872":10}}],["isfileexist",{"2":{"458":4}}],["isfull",{"0":{"296":1,"319":1,"328":1},"2":{"282":1,"284":1,"285":1,"296":6,"319":6,"328":6,"329":2}}],["iszip",{"2":{"468":4}}],["iszipfile",{"0":{"468":1},"2":{"449":1,"468":4}}],["iszerovalue",{"0":{"885":1},"2":{"853":1,"885":10}}],["iszero",{"0":{"749":1},"2":{"52":1,"738":1,"749":6}}],["islinux",{"0":{"801":1},"2":{"798":1,"801":4}}],["islinkfile",{"2":{"459":4}}],["islink",{"0":{"459":1},"2":{"449":1,"459":4}}],["isleapyear",{"0":{"437":1},"2":{"401":1,"437":6}}],["isexported",{"0":{"748":1},"2":{"738":1,"748":6}}],["isexist",{"0":{"458":1},"2":{"449":1,"458":4}}],["isemail",{"0":{"869":1},"2":{"853":1,"869":6}}],["isembedded",{"0":{"747":1},"2":{"738":1,"747":6}}],["isemptystring",{"0":{"870":1},"2":{"853":1,"870":8}}],["isempty",{"0":{"151":1,"220":1,"235":1,"258":1,"295":1,"307":1,"318":1,"327":1,"349":1,"369":1,"378":1},"1":{"152":1},"2":{"136":1,"151":2,"152":2,"204":1,"205":1,"220":6,"235":6,"241":1,"258":6,"282":1,"283":1,"284":1,"285":1,"295":6,"297":2,"307":6,"308":2,"318":6,"320":2,"327":6,"333":1,"349":6,"359":1,"360":1,"369":6,"378":6}}],["isequal",{"2":{"695":4}}],["iseven",{"2":{"509":4,"512":4,"643":4,"654":4,"655":4,"656":4,"657":4,"658":4,"659":4,"664":4,"691":4,"716":4}}],["isgbk",{"0":{"886":1},"2":{"84":2,"853":1,"886":5}}],["is",{"0":{"900":1,"910":1},"1":{"911":1},"2":{"0":1,"14":2,"15":2,"16":2,"43":1,"52":2,"54":1,"55":1,"56":1,"71":1,"72":1,"133":4,"171":1,"173":1,"178":1,"183":1,"187":1,"192":2,"195":1,"196":1,"220":1,"223":1,"235":1,"238":1,"243":1,"254":1,"255":1,"258":1,"278":1,"290":1,"295":1,"296":1,"298":1,"307":1,"309":1,"313":1,"318":1,"319":1,"321":1,"323":1,"325":1,"327":1,"328":1,"330":2,"342":1,"349":1,"352":1,"354":1,"355":2,"362":1,"365":1,"369":1,"371":1,"374":1,"378":1,"381":1,"387":1,"396":1,"420":1,"421":1,"422":1,"435":1,"437":1,"439":1,"440":1,"459":1,"460":1,"468":1,"481":1,"484":1,"485":1,"501":1,"512":1,"520":1,"521":1,"528":1,"529":6,"554":1,"559":1,"579":1,"580":1,"581":1,"582":1,"585":1,"586":8,"587":8,"588":8,"589":8,"590":8,"603":1,"604":1,"620":1,"627":1,"628":1,"636":1,"645":1,"646":1,"657":1,"659":1,"670":1,"671":1,"679":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"693":1,"699":2,"704":2,"713":1,"726":1,"727":1,"735":1,"744":1,"745":1,"747":1,"748":1,"749":1,"752":1,"766":1,"772":1,"784":1,"787":1,"788":1,"791":1,"794":1,"800":1,"801":1,"802":1,"807":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"877":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":3,"887":1,"891":1,"899":5,"900":7,"901":2,"902":1,"905":2,"906":2,"910":1}}],["dns",{"2":{"868":3}}],["dn8sycadrxse9lvw2mog3ahlsvfja9t+ogqa0wm2fywpvwkigs",{"2":{"118":2}}],["dropwhile",{"0":{"650":1},"2":{"633":1,"650":8}}],["droprightwhile",{"0":{"651":1},"2":{"633":1,"651":8}}],["dropright",{"0":{"649":1},"2":{"633":1,"649":10}}],["drop",{"0":{"648":1},"2":{"633":1,"648":11,"649":1,"650":1,"651":1}}],["d1",{"2":{"576":2}}],["d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870",{"2":{"471":2}}],["dda3cf10c5a6ff6c6659a497bf7261b287af2bc7",{"2":{"471":2}}],["dd",{"2":{"403":12,"420":1,"422":1,"423":1,"424":1,"427":6,"428":6,"431":1,"434":1,"441":4}}],["dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc",{"2":{"117":2}}],["day",{"2":{"404":2,"408":1,"409":1,"410":1,"414":1,"415":1,"416":1,"439":1}}],["days",{"2":{"404":1}}],["dayofyear",{"0":{"439":1},"2":{"401":1,"439":8}}],["data2",{"2":{"715":4}}],["data1",{"2":{"715":4}}],["data",{"0":{"197":1,"245":1,"289":1,"301":1,"312":1,"324":1,"367":1,"376":1},"2":{"60":1,"68":2,"79":3,"80":3,"84":2,"85":2,"86":1,"91":7,"92":5,"93":7,"94":5,"95":7,"96":7,"97":5,"98":7,"99":5,"102":7,"103":5,"104":7,"105":5,"106":7,"107":7,"108":5,"109":7,"110":5,"121":2,"122":2,"131":7,"132":7,"138":2,"173":1,"190":1,"194":2,"197":4,"241":1,"243":4,"245":9,"250":1,"251":2,"252":2,"253":2,"254":9,"255":9,"256":6,"259":3,"260":2,"261":2,"262":1,"263":5,"264":2,"265":3,"266":2,"267":2,"268":2,"269":2,"270":2,"271":6,"272":6,"273":2,"274":2,"277":3,"282":1,"283":1,"284":1,"285":1,"288":2,"289":5,"290":2,"291":2,"292":2,"293":2,"297":1,"300":2,"301":5,"302":2,"303":2,"304":2,"305":2,"308":1,"311":2,"312":5,"313":2,"314":2,"315":2,"316":2,"320":1,"323":2,"324":5,"325":2,"326":2,"330":1,"337":1,"355":1,"359":1,"360":1,"364":2,"365":2,"366":2,"367":5,"370":2,"373":2,"374":2,"375":2,"376":5,"379":2,"387":1,"389":2,"390":2,"473":4,"476":1,"482":1,"483":1,"581":2,"709":4,"710":4,"711":4,"712":4,"713":4,"714":4,"718":8,"734":4,"766":1,"809":1,"850":1,"886":3}}],["datastructure",{"2":{"0":1,"134":2,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":4,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":4,"219":2,"220":2,"221":2,"222":2,"224":4,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":4,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":6,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":4,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":4,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["date3",{"2":{"439":4,"440":4}}],["date2",{"2":{"439":4,"440":4}}],["date1",{"2":{"439":4,"440":4}}],["datetime",{"0":{"398":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1},"2":{"0":1,"398":1,"399":3,"400":2,"404":6,"405":6,"406":6,"407":6,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":4,"421":4,"422":4,"423":4,"424":4,"425":4,"426":4,"427":8,"428":8,"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4,"437":6,"438":10,"439":8,"440":8,"441":7,"442":4,"443":4,"444":4,"445":4}}],["date",{"2":{"0":1,"398":1,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":1,"422":1,"439":7,"440":6}}],["dir",{"2":{"807":3}}],["directy",{"2":{"460":1}}],["directly",{"2":{"133":1}}],["directory",{"2":{"130":1,"453":1,"458":1,"465":1,"466":1}}],["dividetwo",{"2":{"699":4}}],["divisor",{"2":{"560":1}}],["discarding",{"2":{"719":1}}],["distinct",{"0":{"715":1},"2":{"707":1,"715":8}}],["distance",{"2":{"558":1}}],["disjoint",{"2":{"527":1}}],["diskvo",{"2":{"82":4}}],["disk",{"2":{"82":24}}],["digits",{"2":{"484":1,"485":1}}],["diff2",{"2":{"404":4,"405":4,"406":4,"407":4}}],["diff1",{"2":{"404":4,"405":4,"406":4,"407":4}}],["differencewith",{"0":{"646":1},"2":{"633":1,"646":5}}],["differenceby",{"0":{"645":1},"2":{"633":1,"645":5}}],["difference",{"0":{"269":1,"644":1},"2":{"241":1,"269":2,"633":1,"644":4}}],["dstpath",{"2":{"454":2}}],["dst",{"2":{"82":3,"507":2}}],["download",{"2":{"592":1}}],["downloadfile",{"0":{"592":1},"2":{"570":1,"592":4}}],["double",{"2":{"500":4,"886":1}}],["doubly",{"2":{"224":1,"225":1,"226":1,"227":1,"228":1,"230":1,"231":1}}],["doublylink",{"0":{"205":1,"223":1},"2":{"201":1,"223":1,"224":4,"225":2,"226":3,"227":2,"228":2,"229":3,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2}}],["don",{"2":{"261":1}}],["done",{"2":{"43":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["do",{"2":{"210":4,"226":4,"254":1,"255":1,"534":1,"619":1,"740":2}}],["doesn",{"2":{"635":1}}],["does",{"2":{"149":1,"151":1,"339":2,"340":2,"704":1}}],["documentation",{"0":{"5":1,"22":1,"35":1,"51":1,"64":1,"90":1,"137":1,"177":1,"191":1,"206":1,"242":1,"286":1,"334":1,"361":1,"386":1,"402":1,"450":1,"480":1,"492":1,"506":1,"541":1,"571":1,"600":1,"610":1,"624":1,"634":1,"708":1,"739":1,"757":1,"799":1,"813":1,"854":1,"892":1},"1":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["duplicated",{"2":{"697":1,"715":1}}],["duplicate",{"2":{"266":1,"267":1,"330":1,"696":1}}],["duration",{"2":{"43":2,"497":5,"498":2,"499":3,"501":2,"582":4,"625":4,"626":4,"628":8,"629":4}}],["duke",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":2,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":2,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":4,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"625":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["dev",{"2":{"911":1}}],["details",{"2":{"909":1}}],["determined",{"2":{"646":1,"689":1}}],["determines",{"2":{"153":1}}],["de",{"2":{"776":4}}],["dereferencing",{"2":{"657":1,"659":1}}],["debouncedadd",{"2":{"497":12}}],["debounced",{"0":{"497":1},"2":{"491":1,"497":6}}],["deprecated",{"0":{"440":1,"656":1,"658":1,"666":1,"667":1,"690":1,"692":1},"2":{"586":1,"587":1,"588":1,"589":1,"590":1,"677":1}}],["depth",{"0":{"395":1},"2":{"385":1,"395":5}}],["dequeue",{"0":{"291":1,"303":1,"314":1,"326":1},"2":{"282":1,"283":1,"284":1,"285":1,"291":4,"303":4,"314":4,"326":4}}],["def",{"2":{"603":4}}],["default",{"2":{"178":1,"484":1,"485":1,"521":2,"604":1,"627":1,"628":1,"688":1,"690":1}}],["defer",{"2":{"38":4,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":4,"46":2,"464":2,"473":2,"474":2,"475":2,"905":2}}],["destpath",{"2":{"465":2,"466":2,"467":2}}],["dest",{"2":{"454":2,"467":1}}],["destination",{"2":{"82":1}}],["desofbdecrypt",{"0":{"110":1},"2":{"89":1,"109":2,"110":4}}],["desofbencrypt",{"0":{"109":1},"2":{"89":1,"109":4,"110":2}}],["describing",{"2":{"725":1}}],["desc",{"2":{"688":4,"690":3}}],["descending",{"2":{"685":1,"686":1,"688":1,"690":1}}],["descfbdecrypt",{"0":{"108":1},"2":{"89":1,"107":2,"108":4}}],["descfbencrypt",{"0":{"107":1},"2":{"89":1,"107":4,"108":2}}],["desctrcrypt",{"0":{"106":1},"2":{"89":1,"106":6}}],["descbcdecrypt",{"0":{"105":1},"2":{"89":1,"104":2,"105":4}}],["descbcencrypt",{"0":{"104":1},"2":{"89":1,"104":4,"105":2}}],["desecbdecrypt",{"0":{"103":1},"2":{"89":1,"102":2,"103":4}}],["desecbencrypt",{"0":{"102":1},"2":{"89":1,"102":4,"103":2}}],["des",{"2":{"86":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1}}],["deepequal",{"2":{"257":1,"695":2,"782":2,"905":2}}],["deep",{"2":{"81":1}}],["deepclone",{"0":{"81":1},"2":{"63":1,"81":4}}],["decimal",{"2":{"484":2,"485":1,"550":1,"551":1,"552":1,"553":1}}],["decimalbytes",{"0":{"484":1},"2":{"479":1,"484":10}}],["decrypt",{"2":{"92":1,"94":1,"95":1,"97":1,"99":1,"103":1,"105":1,"106":1,"108":1,"110":1,"132":1}}],["decrypted",{"2":{"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"131":4,"132":4}}],["decryption",{"2":{"0":1,"86":1}}],["decoderesponse",{"0":{"584":1},"2":{"570":1,"583":2,"584":4}}],["decode",{"2":{"80":1,"101":1,"584":1,"591":1}}],["decodebyte",{"0":{"80":1},"2":{"63":1,"80":4}}],["delimiter",{"2":{"790":2}}],["delayed",{"2":{"498":1}}],["delays",{"2":{"497":1}}],["delay",{"0":{"498":1},"2":{"491":1,"498":6}}],["del2",{"2":{"272":4}}],["del1",{"2":{"272":4}}],["del",{"2":{"272":4}}],["delta",{"2":{"29":3}}],["deleteall",{"0":{"272":1},"2":{"241":1,"272":8}}],["deleteattail",{"0":{"215":1,"231":1},"2":{"204":1,"205":1,"215":4,"231":4}}],["deleteathead",{"0":{"214":1,"230":1},"2":{"204":1,"205":1,"214":4,"230":4}}],["deleteat",{"0":{"163":1,"213":1,"229":1,"254":1,"647":1},"1":{"164":1},"2":{"136":1,"163":2,"164":2,"204":1,"205":1,"213":4,"229":4,"241":1,"254":10,"633":1,"647":8}}],["deletevalue",{"0":{"216":1},"2":{"204":1,"216":4}}],["deletes",{"2":{"167":1,"169":1}}],["deleterange",{"0":{"169":1},"1":{"170":1},"2":{"136":1,"169":2,"170":2}}],["deleteby",{"0":{"167":1},"1":{"168":1},"2":{"136":1,"167":2,"168":2}}],["deleteif",{"0":{"165":1,"277":1},"1":{"166":1},"2":{"136":1,"165":2,"166":2,"241":1,"277":5}}],["delete",{"0":{"182":1,"341":1,"390":1,"533":1},"2":{"17":4,"176":1,"182":5,"213":1,"214":1,"215":1,"216":1,"229":1,"230":1,"231":1,"252":1,"253":1,"254":1,"277":1,"278":1,"333":1,"341":5,"354":1,"365":1,"374":1,"385":1,"390":5,"505":1,"533":5,"534":1,"589":1,"647":1}}],["d",{"2":{"7":4,"499":2,"508":2,"509":4,"510":2,"511":4,"512":2,"513":4,"514":2,"515":2,"516":2,"517":2,"518":2,"519":4,"527":2,"530":4,"531":4,"532":2,"533":4,"534":6,"535":4,"536":2,"603":4,"604":4,"605":4,"628":2,"637":2,"638":2,"639":12,"641":4,"660":4,"661":4,"670":2,"671":2,"676":4,"688":6,"779":4,"780":2,"787":4,"790":6,"822":12,"823":4,"824":8,"825":6,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["fewer",{"2":{"719":1}}],["feature",{"0":{"666":1,"667":1,"692":1},"2":{"704":1}}],["female",{"2":{"472":2,"473":4}}],["flatmap",{"0":{"674":1},"2":{"633":1,"674":4}}],["flattens",{"2":{"661":1,"674":1}}],["flattendeep",{"0":{"661":1},"2":{"633":1,"661":4}}],["flatten",{"0":{"660":1},"2":{"633":1,"660":5}}],["floor",{"2":{"665":6}}],["flow",{"2":{"488":1}}],["flows",{"2":{"403":1}}],["float34",{"2":{"872":1}}],["float32",{"2":{"566":2,"832":2,"833":2,"836":2,"837":2,"840":2,"841":2,"844":2,"845":2,"848":2,"849":2,"872":1}}],["floats",{"2":{"688":1}}],["floatable",{"2":{"71":1}}],["float64func",{"2":{"550":1,"551":1,"553":1,"556":1,"557":1,"558":1,"562":1,"563":1,"564":1}}],["float64",{"2":{"29":10,"71":3,"72":2,"81":2,"82":4,"484":2,"485":2,"550":3,"551":3,"552":2,"553":3,"556":3,"557":3,"558":3,"562":3,"563":3,"564":3,"565":2,"577":4,"665":10,"816":2,"817":2,"820":2,"821":2,"824":2,"825":2,"828":2,"829":2,"832":2,"833":2,"836":2,"837":2,"840":2,"841":2,"844":2,"845":2,"848":2,"849":2}}],["float",{"2":{"29":2,"81":4,"481":2,"542":2,"546":2,"548":2,"551":1,"552":1,"553":1,"554":2,"555":2,"565":2,"566":2,"712":2,"872":1,"873":1,"875":1}}],["fc82a4199749de9cfb71e32e54f489d3",{"2":{"592":2}}],["fpath",{"2":{"465":4,"466":3,"473":10}}],["fs",{"2":{"456":2}}],["fuction",{"2":{"728":1,"729":1}}],["full",{"2":{"290":1,"296":1,"313":1,"319":1,"325":1,"328":1}}],["func1",{"2":{"627":2}}],["funcs",{"2":{"500":2}}],["funcation",{"2":{"184":1,"508":1}}],["func",{"2":{"6":5,"7":5,"8":5,"9":5,"10":5,"11":5,"12":5,"13":4,"14":4,"15":4,"16":6,"17":10,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"37":4,"38":6,"39":2,"40":2,"41":2,"42":6,"43":6,"44":2,"45":2,"46":3,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"65":3,"66":2,"67":3,"68":3,"69":2,"70":2,"71":3,"72":3,"73":3,"74":6,"75":2,"76":2,"77":3,"78":6,"79":3,"80":2,"81":2,"82":3,"83":3,"84":3,"85":3,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":3,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"138":2,"139":2,"141":2,"143":2,"144":1,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"163":1,"164":2,"165":3,"166":4,"167":1,"168":2,"169":1,"170":2,"172":2,"178":2,"179":2,"180":2,"181":2,"182":3,"183":2,"184":7,"185":2,"186":2,"193":6,"194":5,"195":5,"196":5,"197":4,"198":4,"199":5,"208":4,"209":2,"210":3,"211":3,"212":3,"213":3,"214":3,"215":3,"216":3,"217":3,"218":3,"219":2,"220":2,"221":3,"222":3,"224":4,"225":2,"226":3,"227":3,"228":3,"229":3,"230":3,"231":2,"232":3,"233":3,"234":2,"235":2,"236":3,"237":3,"243":4,"244":2,"245":2,"246":3,"247":2,"248":2,"249":8,"250":8,"251":3,"252":3,"253":3,"254":3,"255":3,"256":3,"257":2,"258":2,"259":3,"260":3,"261":3,"262":2,"263":2,"264":3,"265":3,"266":3,"267":3,"268":3,"269":3,"270":3,"271":2,"272":2,"273":7,"274":3,"275":6,"276":3,"277":6,"288":3,"289":2,"290":2,"291":3,"292":2,"293":2,"294":2,"295":2,"296":2,"297":3,"298":2,"300":3,"301":2,"302":3,"303":3,"304":3,"305":3,"306":2,"307":2,"308":3,"309":2,"311":3,"312":2,"313":2,"314":3,"315":2,"316":2,"317":2,"318":2,"319":2,"320":3,"321":2,"323":3,"324":2,"325":4,"326":5,"327":4,"328":4,"329":4,"335":4,"336":3,"337":2,"338":3,"339":2,"340":8,"341":3,"342":2,"343":2,"344":2,"345":3,"346":2,"347":7,"348":7,"349":2,"350":3,"351":3,"352":3,"353":3,"354":3,"363":4,"364":3,"365":3,"366":3,"367":2,"368":2,"369":2,"370":3,"372":4,"373":3,"374":3,"375":3,"376":2,"377":2,"378":2,"379":3,"380":3,"388":5,"389":5,"390":5,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":5,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":3,"429":4,"430":4,"431":4,"432":4,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":3,"457":2,"458":2,"459":2,"460":2,"461":3,"462":2,"463":3,"464":3,"465":2,"466":2,"467":2,"468":2,"469":3,"470":3,"471":3,"472":3,"473":2,"474":2,"475":2,"481":2,"482":3,"483":2,"484":2,"485":2,"486":3,"487":3,"493":7,"494":7,"495":12,"496":10,"497":9,"498":5,"499":4,"500":12,"501":14,"507":2,"508":7,"509":8,"510":2,"511":2,"512":6,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":6,"521":6,"522":6,"523":6,"524":6,"525":4,"526":6,"527":2,"528":2,"529":4,"530":7,"531":7,"532":5,"533":7,"534":7,"535":6,"536":9,"542":2,"543":2,"544":2,"545":2,"546":2,"547":10,"548":2,"549":10,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"572":2,"573":3,"574":2,"575":2,"576":3,"577":3,"578":2,"579":2,"580":2,"581":2,"582":6,"583":3,"584":2,"585":2,"586":4,"587":4,"588":4,"589":4,"590":4,"591":2,"592":2,"593":3,"594":2,"595":2,"601":2,"602":2,"603":2,"604":2,"605":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":3,"619":2,"625":5,"626":6,"627":5,"628":5,"629":4,"635":2,"636":2,"637":12,"638":2,"639":2,"640":2,"641":2,"642":2,"643":6,"644":2,"645":7,"646":6,"647":3,"648":2,"649":2,"650":10,"651":10,"652":2,"653":7,"654":6,"655":6,"656":7,"657":8,"658":7,"659":8,"660":2,"661":2,"662":7,"663":7,"664":7,"665":6,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":6,"673":6,"674":6,"675":2,"676":3,"677":6,"678":8,"679":6,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":10,"688":3,"689":9,"690":2,"691":6,"692":2,"693":2,"694":2,"695":2,"696":2,"697":7,"698":2,"699":6,"700":2,"701":2,"702":6,"703":2,"709":3,"710":3,"711":5,"712":3,"713":13,"714":3,"715":3,"716":7,"717":7,"718":7,"719":3,"720":3,"721":3,"722":3,"723":7,"724":7,"725":6,"726":3,"727":3,"728":7,"729":7,"730":8,"731":8,"732":8,"733":2,"734":2,"740":2,"741":4,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":3,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":6,"808":2,"814":4,"815":3,"816":3,"817":3,"818":4,"819":3,"820":3,"821":3,"822":4,"823":3,"824":3,"825":3,"826":4,"827":3,"828":3,"829":3,"830":4,"831":3,"832":3,"833":3,"834":4,"835":3,"836":3,"837":3,"838":4,"839":3,"840":3,"841":3,"842":4,"843":3,"844":3,"845":3,"846":4,"847":3,"848":3,"849":3,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"893":4,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":4,"903":2,"904":2,"905":4,"908":2}}],["functional",{"2":{"488":1}}],["functions",{"2":{"0":2,"30":1,"47":1,"60":1,"86":1,"403":1,"446":1,"476":1,"500":2,"502":1,"537":1,"567":1,"596":1,"606":1,"630":1,"735":1,"753":1,"795":1,"850":1,"906":1,"907":1}}],["function",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1},"2":{"0":3,"14":1,"15":1,"16":2,"18":1,"74":1,"78":1,"243":1,"270":1,"275":1,"340":2,"347":1,"348":1,"387":1,"488":2,"489":3,"490":2,"493":5,"494":5,"495":5,"496":6,"497":6,"498":5,"499":5,"500":5,"501":7,"509":1,"512":1,"520":1,"521":1,"528":1,"547":1,"549":1,"620":1,"626":1,"627":2,"637":1,"643":1,"650":1,"651":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"662":1,"663":1,"672":1,"673":1,"678":1,"687":1,"689":1,"691":1,"702":1,"713":1,"717":1,"723":1,"725":1,"728":1,"729":1,"740":1,"741":5,"886":1,"908":1,"910":1}}],["front",{"0":{"292":1,"304":1,"315":1},"2":{"278":1,"282":1,"283":1,"284":1,"292":4,"304":4,"315":4}}],["fromrange",{"0":{"712":1},"2":{"707":1,"712":4}}],["fromchannel",{"0":{"711":1},"2":{"707":1,"711":4}}],["fromslice",{"0":{"710":1},"2":{"707":1,"710":4,"714":4,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":4}}],["fromentries",{"0":{"525":1},"2":{"505":1,"525":4}}],["fromindex",{"2":{"169":1,"276":3}}],["from",{"2":{"45":1,"82":1,"165":1,"167":1,"169":1,"195":1,"196":1,"272":1,"336":1,"411":1,"481":1,"496":1,"554":1,"555":1,"602":1,"603":1,"604":1,"647":1,"648":1,"649":1,"650":1,"651":1,"658":1,"665":1,"678":1,"679":1,"698":1,"710":1,"711":1,"712":1,"718":1,"722":1,"778":1,"781":1,"789":1,"794":1,"817":1,"821":1,"825":1,"829":1,"833":1,"837":1,"841":1,"845":1,"849":1,"895":1}}],["f",{"2":{"249":3,"250":3,"277":3,"457":4,"463":4,"464":6,"473":4,"637":12,"743":4,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"784":2,"787":2,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["fnlist",{"2":{"496":2}}],["fn",{"2":{"42":7,"347":2,"493":8,"494":12,"497":3,"498":2,"499":2,"500":4}}],["failed",{"2":{"627":2}}],["falls",{"2":{"886":1}}],["fall",{"2":{"886":1}}],["fallback",{"2":{"603":3}}],["falsey",{"2":{"640":2}}],["false",{"2":{"17":2,"23":6,"24":2,"25":4,"26":6,"27":4,"28":6,"29":6,"52":22,"53":6,"54":3,"55":4,"56":6,"57":4,"58":3,"67":16,"76":4,"81":10,"183":2,"196":1,"220":2,"235":2,"244":2,"257":2,"258":2,"275":2,"290":1,"295":2,"296":2,"298":2,"307":2,"309":2,"318":2,"319":2,"321":2,"325":1,"327":2,"328":2,"329":2,"339":3,"340":3,"342":2,"343":2,"346":2,"348":3,"349":2,"354":1,"369":2,"378":2,"396":2,"437":2,"440":2,"459":2,"460":2,"473":2,"527":2,"528":2,"532":10,"534":3,"536":1,"559":6,"579":4,"580":2,"594":2,"595":2,"636":2,"637":4,"638":2,"640":3,"652":2,"654":2,"663":3,"673":2,"684":4,"685":4,"686":2,"687":2,"726":1,"727":1,"730":2,"731":2,"732":2,"747":2,"748":2,"749":2,"766":6,"775":4,"784":2,"785":2,"786":2,"792":2,"793":2,"794":3,"848":4,"849":4,"855":2,"856":4,"857":2,"858":2,"859":4,"860":4,"861":4,"862":4,"863":2,"864":2,"865":2,"866":2,"867":2,"868":4,"869":2,"870":4,"871":6,"872":6,"873":4,"874":4,"875":2,"876":2,"877":4,"878":2,"879":4,"880":2,"881":2,"882":2,"883":2,"884":2,"885":4,"887":2,"899":2,"900":2}}],["fatal",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2,"591":4}}],["factorial",{"0":{"545":1},"2":{"540":1,"545":9}}],["fasle",{"2":{"195":1}}],["fanin",{"0":{"39":1},"2":{"34":1,"39":4}}],["fo",{"2":{"785":2}}],["fooba",{"2":{"770":2}}],["foobarb",{"2":{"770":2}}],["foobarbaz",{"2":{"762":2}}],["foobar",{"2":{"762":4,"763":4,"764":2,"765":4,"770":2,"773":4,"774":2}}],["foob",{"2":{"769":2,"770":2}}],["foo11bar",{"2":{"762":2}}],["foo",{"2":{"637":8,"758":16,"759":18,"760":16,"761":16,"762":6,"763":12,"764":14,"765":12,"769":20,"770":20,"771":20,"772":4,"773":12,"774":14,"777":12,"778":20,"785":4,"786":4,"787":2,"803":4,"804":4,"805":8,"806":4,"846":4,"847":4}}],["folder",{"2":{"453":2}}],["followed",{"2":{"714":1}}],["following",{"2":{"528":1}}],["follow",{"2":{"355":1}}],["found",{"2":{"14":1,"15":1,"16":1,"147":1,"247":1,"248":1,"249":1,"250":1,"670":2,"671":2}}],["form",{"2":{"581":2,"587":2}}],["formdata",{"2":{"581":4}}],["formatint",{"2":{"673":2,"674":2}}],["formatstrtotime",{"0":{"428":1},"2":{"401":1,"428":8}}],["formatting",{"2":{"476":1}}],["formattimetostr",{"0":{"427":1},"2":{"401":1,"427":8}}],["formatter",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1},"2":{"0":1,"476":1,"477":3,"478":2,"481":8,"482":6,"483":4,"484":10,"485":10,"486":10,"487":10}}],["format",{"2":{"398":1,"403":1,"420":1,"421":1,"422":1,"423":1,"424":1,"427":3,"428":3,"435":1,"441":3,"886":1,"893":2}}],["forwarded",{"2":{"578":2}}],["foreachwithbreak",{"0":{"663":1},"2":{"633":1,"663":4}}],["foreach",{"0":{"273":1,"508":1,"662":1,"724":1},"2":{"241":1,"273":4,"505":1,"508":4,"633":1,"662":4,"707":1,"724":4}}],["for",{"0":{"666":1,"667":1,"690":1,"692":1},"2":{"14":1,"15":1,"38":4,"39":4,"40":2,"42":2,"44":2,"45":2,"46":2,"47":1,"60":1,"67":2,"76":2,"81":2,"82":1,"86":1,"184":1,"273":1,"274":2,"325":2,"326":2,"327":2,"328":2,"329":2,"348":2,"446":1,"476":1,"484":1,"485":1,"501":3,"508":1,"512":1,"529":1,"530":3,"531":3,"532":3,"533":5,"534":6,"535":5,"536":3,"537":1,"578":2,"586":1,"587":1,"588":1,"589":1,"590":1,"620":1,"645":1,"662":1,"663":2,"698":1,"699":1,"711":2,"724":1,"735":1,"762":2,"763":2,"764":2,"765":2,"767":2,"768":2,"773":2,"774":2,"850":1,"888":1,"906":2,"907":1,"909":1,"911":1}}],["fibonacci",{"0":{"544":1},"2":{"540":1,"544":9}}],["filtering",{"2":{"673":1}}],["filtermap",{"0":{"673":1},"2":{"633":1,"673":4}}],["filterbyvalues",{"0":{"511":1},"2":{"505":1,"511":4,"514":1}}],["filterbykeys",{"0":{"510":1},"2":{"505":1,"510":4,"513":1}}],["filter",{"0":{"509":1,"655":1,"716":1},"2":{"505":1,"509":6,"512":1,"633":1,"655":4,"707":1,"716":4}}],["filenames",{"2":{"461":4}}],["filesize",{"0":{"469":1},"2":{"449":1,"469":4}}],["filemode",{"0":{"456":1},"2":{"449":1,"456":6}}],["filepath",{"2":{"123":2,"468":2,"470":2,"471":2,"472":2,"473":2,"474":12,"475":12,"592":2,"593":2}}],["fileutil",{"0":{"446":1},"1":{"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1},"2":{"0":1,"446":1,"447":1,"448":2,"451":4,"452":4,"453":4,"454":4,"455":2,"456":4,"457":6,"458":6,"459":4,"460":6,"461":4,"462":4,"463":6,"464":6,"465":4,"466":4,"467":4,"468":4,"469":4,"470":4,"471":8,"472":4,"473":8,"474":6,"475":6}}],["file",{"2":{"0":1,"123":1,"130":1,"131":1,"132":1,"446":1,"447":1,"451":2,"452":1,"454":3,"456":1,"457":7,"458":1,"459":1,"461":1,"462":1,"463":1,"464":1,"465":2,"466":2,"467":1,"468":2,"469":1,"470":1,"471":1,"472":1,"473":1,"474":5,"475":5,"592":2,"593":1,"902":2}}],["fifo",{"2":{"355":1}}],["first",{"2":{"165":1,"167":1,"211":1,"214":1,"227":1,"230":1,"249":1,"252":1,"355":2,"544":2,"646":1,"656":1,"657":1,"670":1,"680":1,"681":1,"714":1,"719":1,"726":1,"758":1,"760":1,"765":1,"767":1,"768":1,"787":1,"886":1}}],["findfirst",{"0":{"726":1},"2":{"707":1,"726":4}}],["findlast",{"0":{"658":1,"727":1},"2":{"657":1,"658":4,"659":1,"707":1,"727":4}}],["findlastby",{"0":{"658":1,"659":1},"2":{"633":1,"659":5}}],["findlastdeprecated",{"2":{"633":1}}],["findby",{"0":{"656":1,"657":1},"2":{"633":1,"657":4}}],["finddeprecated",{"2":{"633":1}}],["find",{"0":{"656":1},"2":{"47":1,"656":4,"657":1,"659":1}}],["fieldj",{"2":{"846":4,"849":2}}],["fieldi",{"2":{"842":4,"845":2,"846":4,"849":2}}],["fieldh",{"2":{"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldg",{"2":{"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldf",{"2":{"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldfunc",{"2":{"742":1,"743":1}}],["fielde",{"2":{"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldd",{"2":{"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldc",{"2":{"818":4,"821":2,"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldb",{"2":{"814":4,"817":2,"818":4,"821":2,"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fielda",{"2":{"814":4,"817":2,"818":4,"821":2,"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fields",{"0":{"742":1},"2":{"82":1,"738":1,"742":10}}],["field",{"0":{"743":1},"2":{"7":2,"77":2,"81":1,"82":1,"585":1,"690":4,"736":1,"738":1,"742":2,"743":7,"745":5,"746":4,"747":8,"748":7,"749":7,"750":7,"751":7,"752":5}}],["fmt",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":6,"15":6,"16":6,"17":12,"23":16,"24":10,"25":14,"26":16,"27":14,"28":16,"29":14,"37":2,"38":4,"39":4,"40":4,"41":8,"42":4,"43":4,"44":4,"45":4,"46":6,"52":20,"53":10,"54":10,"55":10,"56":10,"57":10,"58":10,"59":6,"65":4,"66":4,"67":4,"68":6,"69":8,"70":8,"71":14,"72":12,"73":6,"74":4,"75":4,"76":16,"77":4,"78":4,"79":4,"80":4,"81":4,"82":8,"83":8,"84":6,"85":6,"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"101":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":2,"119":4,"120":2,"121":2,"122":2,"123":4,"124":4,"125":2,"126":4,"127":2,"128":4,"129":2,"130":4,"131":4,"132":4,"139":4,"141":4,"143":4,"145":4,"148":4,"150":4,"152":4,"154":4,"156":4,"158":2,"160":4,"162":4,"164":4,"166":4,"168":4,"170":4,"172":4,"178":4,"179":4,"180":4,"181":4,"182":6,"183":6,"184":6,"185":4,"186":4,"193":4,"194":4,"195":6,"196":6,"197":4,"198":4,"199":4,"208":4,"209":4,"210":4,"211":4,"212":4,"213":4,"214":4,"215":4,"216":4,"217":4,"218":4,"219":4,"220":6,"221":4,"222":2,"224":4,"225":4,"226":4,"227":4,"228":4,"229":4,"230":4,"231":6,"232":4,"233":4,"234":4,"235":6,"236":4,"237":2,"243":4,"244":6,"245":4,"246":6,"247":6,"248":6,"249":6,"250":6,"251":4,"252":8,"253":8,"254":10,"255":10,"256":8,"257":6,"258":6,"259":4,"260":4,"261":4,"262":4,"263":4,"264":4,"265":4,"266":4,"267":4,"268":4,"269":4,"270":4,"271":8,"272":8,"273":4,"274":4,"275":4,"276":4,"277":6,"288":4,"289":4,"290":4,"291":6,"292":6,"293":6,"294":4,"295":6,"296":6,"297":4,"298":6,"300":4,"301":4,"302":4,"303":6,"304":6,"305":6,"306":4,"307":6,"308":4,"309":6,"311":4,"312":4,"313":4,"314":6,"315":6,"316":6,"317":4,"318":6,"319":6,"320":4,"321":6,"323":4,"324":4,"325":4,"326":6,"327":6,"328":6,"329":6,"335":4,"336":4,"337":4,"338":4,"339":8,"340":8,"341":4,"342":6,"343":6,"344":4,"345":6,"346":6,"347":4,"348":4,"349":6,"350":4,"351":4,"352":4,"353":6,"354":6,"363":4,"364":4,"365":8,"366":8,"367":4,"368":4,"369":6,"370":4,"372":4,"373":4,"374":8,"375":8,"376":4,"377":4,"378":6,"379":4,"380":2,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":6,"397":4,"404":6,"405":6,"406":6,"407":6,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":4,"421":4,"422":4,"423":4,"424":4,"425":4,"426":4,"427":8,"428":8,"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4,"437":6,"438":6,"439":8,"440":8,"441":6,"442":4,"443":4,"444":4,"445":4,"451":4,"452":4,"453":4,"454":4,"455":4,"456":6,"457":6,"458":4,"459":4,"460":6,"461":4,"462":4,"463":4,"464":4,"465":4,"466":4,"467":4,"468":4,"469":6,"470":6,"471":10,"472":6,"473":4,"474":4,"475":4,"481":8,"482":6,"483":6,"484":10,"485":10,"486":10,"487":10,"493":4,"494":4,"495":4,"496":4,"497":6,"498":4,"499":4,"500":4,"501":6,"507":6,"508":4,"509":4,"510":4,"511":4,"512":4,"513":4,"514":4,"515":8,"516":4,"517":4,"518":4,"519":4,"520":4,"521":4,"522":4,"523":4,"524":4,"525":4,"526":4,"527":6,"528":8,"529":2,"530":6,"531":6,"532":6,"533":6,"534":12,"535":8,"536":6,"542":6,"543":8,"544":8,"545":8,"546":6,"547":8,"548":6,"549":8,"550":8,"551":8,"552":8,"553":8,"554":10,"555":10,"556":8,"557":8,"558":4,"559":10,"560":12,"561":8,"562":12,"563":12,"564":8,"565":6,"566":2,"572":2,"573":6,"574":4,"575":4,"576":4,"577":6,"578":4,"579":8,"580":8,"581":2,"582":2,"583":4,"584":4,"585":10,"586":4,"587":4,"588":4,"589":4,"590":4,"591":4,"592":4,"593":6,"594":6,"595":6,"601":6,"602":6,"603":2,"604":2,"605":4,"611":4,"612":4,"613":4,"614":4,"615":4,"616":4,"617":4,"618":4,"619":4,"625":4,"626":4,"627":4,"628":4,"629":4,"635":6,"636":6,"637":10,"638":6,"639":12,"640":10,"641":6,"642":6,"643":4,"644":4,"645":4,"646":4,"647":8,"648":10,"649":10,"650":8,"651":8,"652":6,"653":4,"654":4,"655":4,"656":6,"657":6,"658":6,"659":6,"660":4,"661":4,"662":4,"663":4,"664":6,"665":4,"666":4,"667":4,"668":4,"669":12,"670":6,"671":6,"672":4,"673":4,"674":4,"675":4,"676":4,"677":4,"678":8,"679":6,"680":12,"681":4,"682":4,"683":4,"684":8,"685":8,"686":8,"687":8,"688":10,"689":6,"690":4,"691":4,"692":4,"693":4,"694":4,"695":4,"696":4,"697":4,"698":4,"699":4,"700":12,"701":4,"702":4,"703":6,"709":4,"710":4,"711":4,"712":4,"713":4,"714":4,"715":6,"716":4,"717":4,"718":10,"719":10,"720":10,"721":4,"722":10,"723":6,"724":4,"725":4,"726":6,"727":6,"728":6,"729":6,"730":6,"731":6,"732":6,"733":6,"734":4,"741":6,"742":4,"743":4,"744":4,"745":4,"746":4,"747":6,"748":6,"749":6,"750":6,"751":6,"752":4,"758":12,"759":12,"760":10,"761":10,"762":4,"763":4,"764":4,"765":4,"766":12,"767":4,"768":4,"769":16,"770":16,"771":16,"772":6,"773":4,"774":4,"775":12,"776":14,"777":10,"778":12,"779":14,"780":14,"781":6,"782":6,"783":4,"784":8,"785":6,"786":6,"787":12,"788":4,"789":8,"790":6,"791":10,"792":6,"793":8,"794":6,"800":4,"801":4,"802":4,"803":6,"804":6,"805":10,"806":4,"807":16,"808":4,"814":4,"815":4,"816":4,"817":4,"818":4,"819":4,"820":4,"821":4,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"855":8,"856":8,"857":8,"858":8,"859":8,"860":8,"861":8,"862":12,"863":6,"864":6,"865":6,"866":6,"867":6,"868":8,"869":6,"870":8,"871":10,"872":10,"873":10,"874":10,"875":10,"876":10,"877":10,"878":6,"879":10,"880":6,"881":6,"882":6,"883":8,"884":6,"885":10,"886":4,"887":12,"893":4,"894":4,"895":4,"896":2,"897":4,"898":4,"899":6,"900":6,"901":4,"902":8,"903":10,"904":4,"905":6,"908":4}}],["etc",{"2":{"911":2}}],["e003",{"2":{"899":2,"900":2}}],["e001",{"2":{"899":4,"900":4,"903":4}}],["email",{"2":{"869":3}}],["embedded",{"2":{"747":1}}],["empty",{"2":{"138":1,"195":1,"196":1,"220":1,"221":1,"235":1,"236":1,"258":1,"259":2,"295":1,"307":1,"318":1,"327":1,"349":1,"354":1,"363":1,"365":1,"369":1,"372":1,"374":1,"378":1,"451":1,"481":1,"719":1,"726":1,"727":1,"775":1,"784":1,"790":1,"870":1}}],["even",{"2":{"664":4,"716":4}}],["every",{"0":{"654":1},"2":{"184":1,"257":1,"347":1,"481":1,"499":1,"508":1,"520":1,"521":1,"633":1,"654":4,"697":1,"790":1}}],["e6",{"2":{"576":6}}],["ee",{"2":{"576":6}}],["easier",{"2":{"911":1}}],["eapsedtime",{"2":{"501":4}}],["eachwithbreak",{"0":{"348":1},"2":{"333":1,"348":4}}],["each",{"2":{"82":1,"273":1,"348":2,"381":1,"387":1,"536":2,"645":1,"662":1,"663":2,"664":1,"665":1,"672":1,"678":1,"699":2,"713":1,"718":1,"724":1,"886":1}}],["est",{"2":{"441":2}}],["e834306eab892d872525d4918a7a639a",{"2":{"111":2}}],["env",{"2":{"806":1}}],["environment",{"2":{"803":1,"804":1,"805":1}}],["entity",{"2":{"581":1}}],["entry",{"0":{"524":1},"2":{"524":4,"525":6}}],["entries",{"2":{"505":1,"524":4,"525":2}}],["enqueue",{"0":{"290":1,"302":1,"313":1,"325":1},"2":{"282":1,"283":1,"284":1,"285":1,"290":8,"291":6,"292":6,"293":6,"294":6,"295":6,"296":6,"297":6,"298":6,"302":8,"303":6,"304":6,"305":6,"306":6,"307":6,"308":6,"309":6,"313":8,"314":6,"315":6,"316":6,"317":6,"318":6,"319":6,"320":6,"321":6,"325":4,"326":2,"327":2,"328":2,"329":2}}],["ends",{"2":{"786":1}}],["endtime",{"2":{"424":4}}],["endwith",{"2":{"417":2}}],["endofyear",{"0":{"419":1},"2":{"401":1,"419":4}}],["endofmonth",{"0":{"418":1},"2":{"401":1,"418":4}}],["endofminute",{"0":{"414":1},"2":{"401":1,"414":4}}],["endofweek",{"0":{"417":1},"2":{"401":1,"417":4}}],["endofday",{"0":{"416":1},"2":{"401":1,"416":4}}],["endofhour",{"0":{"415":1},"2":{"401":1,"415":4}}],["end",{"2":{"157":1,"159":1,"169":2,"414":1,"415":1,"416":1,"417":2,"418":1,"424":1,"555":3,"647":3,"649":1,"651":1,"658":1,"712":5,"722":3,"789":1,"791":4}}],["enecrypt",{"2":{"98":1,"109":1}}],["encrypted",{"2":{"91":4,"92":6,"93":4,"94":6,"95":4,"96":4,"97":6,"98":4,"99":6,"102":4,"103":6,"104":4,"105":6,"106":4,"107":4,"108":6,"109":4,"110":6,"131":4,"132":4}}],["encrypt",{"2":{"91":1,"93":1,"95":1,"96":1,"102":1,"104":1,"106":1,"107":1,"131":1}}],["encryption",{"2":{"0":1,"86":1}}],["encoding",{"2":{"84":2,"85":2,"100":1,"587":2,"588":2,"589":2,"590":2,"591":2,"886":8}}],["encodeurl",{"0":{"573":1},"2":{"570":1,"573":4}}],["encodedurl",{"2":{"573":4}}],["encoded",{"2":{"101":1}}],["encode",{"2":{"79":1,"100":1,"483":1,"573":1}}],["encodebyte",{"0":{"79":1},"2":{"63":1,"79":4}}],["ecb",{"2":{"91":1,"92":1,"102":1,"103":1}}],["elemnets",{"2":{"814":1,"818":1,"822":1,"826":1,"830":1,"834":1,"838":1,"842":1,"846":1}}],["elems",{"2":{"709":2}}],["element",{"2":{"142":1,"144":2,"149":2,"153":1,"157":1,"161":1,"163":1,"165":1,"167":1,"196":1,"197":1,"257":1,"267":1,"268":1,"269":1,"273":1,"290":1,"291":1,"292":1,"293":1,"302":1,"303":1,"304":1,"305":1,"313":1,"314":1,"315":1,"316":1,"325":1,"326":1,"340":2,"347":1,"348":1,"350":1,"351":1,"352":1,"353":1,"354":1,"364":1,"365":1,"366":1,"373":1,"374":1,"375":1,"520":1,"521":1,"554":1,"644":1,"645":1,"647":1,"662":1,"663":1,"664":1,"665":1,"669":1,"672":1,"673":1,"678":1,"690":1,"693":1,"699":1,"700":1,"713":1,"718":1,"724":1,"726":1,"727":1,"728":1,"729":1,"790":1}}],["elements",{"2":{"70":1,"151":1,"159":1,"169":1,"198":1,"267":1,"271":1,"272":1,"274":1,"277":1,"294":1,"306":1,"317":1,"329":1,"330":1,"344":1,"346":1,"348":1,"355":2,"368":1,"377":1,"512":1,"513":1,"514":1,"639":1,"643":2,"646":1,"648":1,"649":1,"650":1,"651":1,"652":1,"655":1,"656":1,"657":1,"658":1,"659":1,"662":1,"663":1,"664":1,"676":1,"679":1,"682":1,"696":1,"704":1,"709":1,"714":3,"716":1,"717":2,"718":2,"719":3,"720":1,"721":1,"722":1,"723":1,"725":1,"730":1,"731":1,"732":1,"733":1,"734":1,"790":1,"816":2,"820":2,"824":2,"828":2,"832":2,"836":2,"840":2,"844":2,"848":2}}],["elapsed",{"2":{"497":1,"501":3}}],["elments",{"2":{"370":1,"379":1}}],["elsevalue",{"2":{"59":3}}],["else",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":3,"15":3,"16":1,"59":1,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"339":1,"340":1,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["errinfo",{"2":{"903":11}}],["errinfofunc",{"2":{"903":1}}],["err3",{"2":{"899":4,"900":4}}],["errlevel",{"2":{"898":4,"901":4}}],["err2",{"2":{"805":4,"896":2,"897":4,"899":4,"900":4}}],["err1",{"2":{"805":4,"895":4,"896":4,"897":4,"899":6,"900":6}}],["err",{"2":{"68":6,"71":4,"72":4,"73":6,"80":4,"82":6,"130":6,"131":4,"132":4,"231":4,"365":4,"366":4,"374":4,"375":4,"431":2,"432":2,"451":6,"453":4,"454":6,"456":6,"462":6,"465":6,"466":6,"467":6,"469":4,"470":4,"471":4,"472":4,"473":8,"474":12,"475":12,"483":4,"507":4,"573":6,"577":6,"583":8,"584":8,"586":6,"587":6,"588":6,"589":6,"590":6,"591":12,"592":4,"593":4,"618":4,"626":4,"627":6,"628":4,"629":4,"690":4,"803":4,"804":4,"806":4,"807":18,"893":4,"894":4,"895":7,"897":4,"898":4,"901":4,"902":4,"903":4,"904":4,"905":9}}],["errortype",{"2":{"626":1}}],["errors",{"2":{"625":4,"626":4,"627":4,"628":4,"629":4,"888":1,"895":5,"896":4,"897":3,"900":1,"902":1,"903":2}}],["errorfunc",{"2":{"80":1,"130":1,"231":1,"313":1,"451":1,"453":1,"454":1,"462":1,"465":1,"466":1,"467":1,"473":1,"474":1,"475":1,"483":1,"507":1,"584":1,"591":1,"592":1,"629":1,"690":1,"804":1,"805":1,"897":1}}],["error",{"0":{"904":1},"2":{"67":2,"68":2,"71":3,"72":3,"73":3,"77":2,"79":2,"80":1,"82":2,"84":2,"85":2,"123":2,"130":1,"231":1,"303":2,"304":2,"305":2,"313":2,"365":3,"366":2,"374":3,"375":2,"428":2,"431":2,"432":2,"451":1,"453":1,"454":1,"456":2,"461":2,"462":1,"463":2,"464":2,"465":1,"466":1,"467":1,"469":2,"470":2,"471":2,"472":2,"473":1,"474":1,"475":1,"482":2,"483":1,"486":2,"487":2,"507":1,"573":2,"577":2,"583":2,"584":1,"586":2,"587":2,"588":2,"589":2,"590":2,"591":1,"592":1,"593":2,"618":2,"625":4,"626":5,"627":4,"628":4,"629":5,"690":1,"700":1,"741":4,"804":1,"805":1,"807":8,"891":1,"893":8,"894":9,"895":4,"896":8,"897":5,"898":2,"899":6,"900":10,"901":3,"902":2,"903":4,"904":10,"905":6}}],["extension",{"2":{"886":1}}],["extractpointer",{"0":{"605":1},"2":{"599":1,"605":4}}],["extracts",{"2":{"513":1}}],["exe",{"2":{"807":1}}],["exec",{"2":{"807":2}}],["execcommand",{"0":{"807":1},"2":{"798":1,"807":8}}],["execute",{"2":{"807":3}}],["executes",{"2":{"184":1,"508":1,"626":1,"629":1}}],["executing",{"2":{"620":1}}],["executiontype",{"2":{"501":1}}],["execution",{"2":{"488":1,"501":2}}],["explore",{"2":{"704":1}}],["experiment",{"2":{"704":1}}],["expect",{"2":{"695":4}}],["exponent",{"0":{"543":1},"2":{"540":1,"543":8}}],["exported",{"2":{"77":1,"585":1,"748":1}}],["existing",{"2":{"466":1,"532":1,"534":1}}],["exist",{"2":{"339":1,"454":1,"592":1}}],["exists",{"2":{"165":1,"167":1,"339":1,"340":2,"458":1}}],["excluded",{"2":{"722":1}}],["excluding",{"2":{"701":1}}],["exclusive",{"2":{"276":1}}],["excuting",{"2":{"501":4}}],["excution",{"2":{"501":1}}],["excutes",{"2":{"42":1}}],["example",{"0":{"139":1,"141":1,"143":1,"145":1,"148":1,"150":1,"152":1,"154":1,"156":1,"158":1,"160":1,"162":1,"164":1,"166":1,"168":1,"170":1,"172":1,"504":1,"539":1,"908":1},"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":2,"887":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1,"907":1,"908":1}}],["equality",{"2":{"698":1,"899":1}}],["equalwith",{"0":{"653":1},"2":{"633":1,"653":4}}],["equalvalue",{"0":{"24":1},"2":{"21":1,"24":10}}],["equalfunc",{"2":{"16":6}}],["equal",{"0":{"23":1,"171":1,"257":1,"346":1,"652":1},"1":{"172":1},"2":{"16":3,"21":1,"23":17,"24":1,"27":1,"28":1,"29":1,"136":1,"171":3,"172":2,"192":2,"241":1,"257":6,"333":1,"346":6,"633":1,"652":8,"653":1,"807":2,"899":4,"900":4}}],["e",{"2":{"7":4,"144":2,"147":2,"149":2,"153":2,"157":2,"159":2,"161":2,"167":2,"171":2,"509":2,"510":2,"511":2,"512":4,"513":4,"514":2,"515":2,"639":12,"688":6,"776":2,"779":4,"780":2,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2}}],["eg",{"2":{"1":1,"30":1,"47":1,"911":1}}],["efficient",{"2":{"0":1,"910":1}}],["snake",{"2":{"773":1}}],["snakecase",{"0":{"773":1},"2":{"756":1,"773":4}}],["s4",{"2":{"719":4,"720":4,"722":4}}],["s3",{"2":{"652":4,"719":4,"720":4,"722":4}}],["s2",{"2":{"644":4,"645":4,"646":4,"652":4,"653":4,"714":4,"719":4,"720":4,"722":4,"733":4}}],["s1",{"2":{"644":4,"645":4,"646":4,"652":6,"653":4,"714":4,"719":4,"720":4,"722":4,"733":4,"741":4}}],["switch",{"2":{"521":2}}],["swap",{"0":{"264":1},"2":{"241":1,"264":5}}],["square",{"2":{"500":4}}],["schedule",{"0":{"499":1},"2":{"491":1,"499":4}}],["sslenabled",{"2":{"582":4}}],["ss",{"2":{"403":6,"421":1,"422":1,"427":4,"428":4,"431":1,"434":1,"441":4}}],["skip",{"0":{"719":1},"2":{"707":1,"719":10}}],["sk",{"2":{"363":4,"364":10,"365":12,"366":12,"367":10,"368":10,"369":12,"370":12,"372":4,"373":10,"374":12,"375":12,"376":10,"377":10,"378":12,"379":12,"380":10}}],["save",{"2":{"467":1}}],["saturday",{"2":{"417":1}}],["satisfying",{"2":{"249":1,"250":1,"277":1}}],["saerch",{"2":{"395":1,"397":1}}],["same",{"2":{"346":1,"652":1}}],["safe",{"2":{"133":1,"529":1}}],["suffixes",{"2":{"786":2}}],["suis",{"2":{"779":4,"780":2}}],["successful",{"2":{"620":1,"629":1}}],["succeed",{"2":{"452":1}}],["sunday",{"2":{"411":1}}],["supertree",{"2":{"396":6}}],["supporting",{"2":{"704":1}}],["supports",{"2":{"398":1}}],["support",{"2":{"30":1,"86":1,"488":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1}}],["sum",{"0":{"565":1},"2":{"348":6,"508":6,"509":2,"540":1,"565":7,"663":6,"677":4}}],["substrs",{"2":{"792":2,"793":2}}],["substr",{"2":{"787":4}}],["substrings",{"2":{"792":1,"793":1}}],["substring",{"0":{"776":1},"2":{"756":1,"758":1,"759":1,"760":1,"761":1,"776":15}}],["subslice",{"2":{"638":3}}],["sub",{"2":{"276":1,"396":1,"404":5,"405":5,"406":5,"407":5}}],["sublist",{"0":{"276":1},"2":{"241":1,"276":5}}],["subtree",{"2":{"192":2,"396":8}}],["special",{"2":{"882":1}}],["specify",{"2":{"703":1}}],["specifies",{"2":{"484":1,"485":1,"789":1}}],["specified",{"2":{"142":1,"144":2,"149":1,"157":1,"159":1,"161":2,"163":1,"165":1,"167":1,"171":1,"276":1,"430":1,"431":1,"432":1,"435":1,"554":1,"555":1,"591":1,"594":1,"595":1,"709":1,"758":1,"759":1,"760":1,"761":1,"776":2,"785":1,"786":1}}],["specification",{"2":{"427":1,"428":1,"886":1}}],["specific",{"2":{"213":1,"229":1,"288":1,"311":1,"323":1,"441":1,"529":2}}],["space",{"2":{"794":1}}],["sprint",{"2":{"718":2}}],["sprintf",{"2":{"530":4,"531":4,"532":2,"533":4,"534":6,"535":4,"536":2,"678":2,"679":2}}],["splits",{"2":{"779":1,"790":1}}],["splitandtrim",{"0":{"790":1},"2":{"756":1,"790":6}}],["splitwords",{"0":{"779":1},"2":{"756":1,"779":14}}],["splitex",{"0":{"775":1},"2":{"756":1,"775":12}}],["split",{"2":{"46":1,"639":1,"775":1}}],["srcpath",{"2":{"454":2}}],["src",{"2":{"81":2,"82":3,"454":1,"507":2}}],["symbol",{"2":{"459":1,"481":3}}],["symmetricdifference",{"0":{"270":1,"352":1,"693":1},"2":{"241":1,"270":2,"333":1,"352":4,"633":1,"693":4}}],["sync",{"2":{"138":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["syntax",{"2":{"71":2,"72":2}}],["system",{"0":{"795":1},"1":{"796":1,"797":1,"798":1,"799":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1},"2":{"0":1,"795":1,"796":1,"797":2,"800":4,"801":4,"802":4,"803":6,"804":6,"805":6,"806":6,"807":8,"808":4}}],["s",{"2":{"47":1,"52":1,"67":2,"69":2,"100":2,"101":2,"119":2,"120":2,"123":4,"185":1,"186":1,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":6,"349":2,"350":3,"351":3,"352":2,"353":2,"354":12,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"457":1,"493":1,"494":1,"498":4,"516":1,"519":1,"520":1,"521":1,"522":1,"523":1,"674":4,"687":12,"699":1,"703":2,"704":1,"709":4,"710":4,"711":4,"712":4,"713":4,"714":4,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":6,"740":2,"741":2,"742":6,"743":6,"744":6,"745":4,"746":4,"747":6,"748":6,"749":6,"750":6,"751":7,"752":4,"758":2,"759":2,"760":2,"761":2,"762":6,"763":6,"764":6,"765":6,"766":1,"767":6,"768":6,"769":1,"770":1,"771":1,"772":8,"773":6,"774":6,"775":2,"776":2,"779":2,"780":2,"855":2,"859":2,"870":2,"874":2,"875":2,"876":2,"878":2,"908":4,"911":1}}],["simplifiedchinese",{"2":{"886":4}}],["side",{"2":{"769":1,"770":1,"771":1}}],["siqbew",{"2":{"615":2}}],["sine",{"2":{"563":1}}],["sin",{"0":{"563":1},"2":{"540":1,"563":12}}],["single",{"2":{"466":1,"805":1}}],["singly",{"2":{"208":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1}}],["singlylink",{"0":{"204":1,"207":1},"2":{"201":1,"207":1,"208":5,"209":2,"210":3,"211":2,"212":2,"213":3,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2}}],["since",{"2":{"43":2,"497":1}}],["size",{"0":{"140":1,"198":1,"219":1,"234":1,"262":1,"294":1,"306":1,"317":1,"329":1,"344":1,"368":1,"377":1},"1":{"141":1},"2":{"136":1,"140":2,"141":2,"179":3,"190":1,"196":2,"198":4,"204":1,"205":1,"219":4,"234":4,"241":1,"256":1,"262":4,"282":1,"283":1,"284":1,"285":1,"294":4,"306":4,"317":4,"329":4,"333":1,"344":4,"345":4,"359":1,"360":1,"368":4,"377":4,"469":5,"484":3,"485":3,"486":3,"487":3,"639":2,"769":3,"770":3,"771":3}}],["sig",{"2":{"43":8}}],["signature",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["std",{"2":{"807":12}}],["stderr",{"2":{"807":17}}],["stdout",{"2":{"807":15}}],["step",{"2":{"554":1,"555":3,"712":2}}],["stored",{"2":{"531":1}}],["stops",{"2":{"536":1}}],["stoptime",{"2":{"501":2}}],["stop",{"2":{"82":2,"499":4,"501":7}}],["static",{"2":{"741":3}}],["statuscode",{"2":{"583":2,"584":2}}],["status",{"2":{"577":4,"585":6}}],["stable",{"2":{"689":1}}],["standard",{"2":{"484":1,"485":1,"904":1}}],["stacks",{"2":{"902":10}}],["stacktracefunc",{"2":{"902":1}}],["stacktrace",{"0":{"902":1},"2":{"891":1,"902":3}}],["stacknode",{"2":{"372":6}}],["stack",{"0":{"355":1},"1":{"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1},"2":{"355":1,"356":2,"357":4,"362":1,"363":6,"364":7,"365":8,"366":7,"367":7,"368":7,"369":7,"370":7,"371":1,"372":6,"373":7,"374":8,"375":7,"376":7,"377":7,"378":7,"379":7,"380":7,"893":4,"902":1}}],["starts",{"2":{"785":1}}],["starting",{"2":{"776":1}}],["starttime",{"2":{"423":4,"501":2}}],["start",{"2":{"43":4,"169":2,"423":1,"501":7,"554":3,"555":3,"647":3,"648":1,"650":1,"712":5,"722":3,"791":4}}],["st",{"2":{"335":4,"336":4,"337":4,"338":6,"339":10,"340":10,"341":6,"342":8}}],["strong",{"2":{"882":1}}],["stripped",{"2":{"789":1}}],["strips",{"2":{"789":1}}],["stringtobytes",{"0":{"782":1},"2":{"756":1,"782":4}}],["stringslice",{"0":{"692":1},"2":{"692":4}}],["stringslicedeprecated",{"2":{"633":1}}],["strings",{"2":{"496":4,"519":2,"521":2,"688":10,"762":4,"763":4,"764":4,"765":4,"767":4,"768":4,"773":4,"774":4,"785":1,"786":1,"902":2,"911":1}}],["stringfunc",{"2":{"66":1,"69":1,"76":1,"100":1,"101":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"420":1,"421":1,"422":1,"423":1,"424":1,"427":1,"434":1,"435":1,"436":1,"441":1,"455":1,"457":1,"481":1,"484":1,"485":1,"552":1,"572":1,"574":1,"575":1,"578":1,"613":1,"614":1,"615":1,"616":1,"617":1,"692":1,"703":1,"750":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"781":1,"783":1,"788":1,"789":1,"790":1,"791":1,"794":1,"803":1,"904":1}}],["string",{"2":{"0":1,"7":2,"23":4,"42":4,"52":2,"65":2,"66":1,"67":5,"69":4,"73":5,"74":4,"76":4,"77":4,"78":8,"80":2,"81":6,"82":28,"83":2,"85":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":4,"101":4,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":4,"119":4,"120":4,"121":2,"122":2,"123":4,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"130":2,"131":4,"132":4,"403":1,"420":2,"421":2,"422":2,"423":1,"424":1,"427":6,"428":5,"431":3,"432":3,"434":2,"435":4,"436":2,"441":5,"442":2,"443":2,"444":2,"445":2,"451":3,"452":2,"453":2,"454":4,"455":1,"456":2,"457":2,"458":2,"459":2,"460":2,"461":4,"462":2,"463":5,"464":6,"465":4,"466":4,"467":4,"468":2,"469":2,"470":2,"471":4,"472":4,"473":6,"474":2,"475":5,"481":7,"482":7,"483":2,"484":1,"485":1,"486":3,"487":3,"496":8,"498":2,"507":10,"508":4,"509":6,"510":4,"511":2,"512":4,"513":4,"514":2,"515":6,"516":2,"517":4,"518":4,"519":2,"520":2,"521":6,"522":6,"523":6,"524":2,"525":2,"526":8,"527":6,"528":2,"529":4,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":4,"547":12,"549":12,"552":2,"572":6,"573":5,"574":1,"575":1,"576":2,"577":20,"578":1,"581":4,"583":2,"584":2,"585":4,"586":14,"587":14,"588":16,"589":10,"590":16,"591":6,"592":4,"593":4,"594":2,"595":4,"603":2,"604":2,"606":1,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"635":4,"636":2,"637":8,"638":8,"639":2,"640":2,"641":6,"647":6,"648":8,"649":8,"660":2,"661":2,"667":2,"669":12,"670":2,"671":2,"673":4,"674":6,"676":2,"678":4,"679":4,"680":2,"681":2,"687":12,"688":6,"689":2,"690":7,"692":4,"695":2,"696":2,"700":10,"702":4,"703":3,"718":2,"740":4,"741":6,"742":2,"743":4,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":3,"751":4,"752":2,"753":1,"754":1,"758":5,"759":5,"760":5,"761":5,"762":7,"763":6,"764":6,"765":6,"766":3,"767":6,"768":6,"769":6,"770":6,"771":6,"772":5,"773":6,"774":6,"775":5,"776":3,"777":7,"778":8,"779":4,"780":2,"781":4,"782":3,"783":2,"784":3,"785":9,"786":9,"787":7,"788":11,"789":6,"790":7,"791":6,"792":9,"793":11,"794":4,"803":3,"804":2,"805":2,"806":2,"807":6,"820":2,"821":2,"824":2,"825":2,"828":2,"829":2,"832":2,"833":2,"836":4,"837":4,"840":6,"841":6,"842":2,"843":2,"844":6,"845":6,"846":4,"847":4,"848":6,"849":6,"855":3,"856":3,"857":3,"858":3,"859":3,"860":3,"861":3,"862":3,"863":4,"864":3,"865":3,"866":3,"867":3,"868":3,"869":3,"870":3,"874":3,"875":3,"876":3,"877":3,"878":3,"879":3,"880":3,"881":3,"882":3,"883":3,"884":3,"887":3,"893":8,"898":2,"899":2,"901":2,"904":1,"907":1,"908":2,"911":1}}],["str2",{"2":{"695":6}}],["str1",{"2":{"695":6}}],["street",{"2":{"507":6}}],["stream",{"0":{"704":1},"1":{"705":1,"706":1,"707":1,"708":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1},"2":{"0":2,"38":8,"704":2,"705":2,"706":2,"709":7,"710":7,"711":7,"712":7,"713":7,"714":13,"715":9,"716":10,"717":11,"718":11,"719":13,"720":10,"721":10,"722":10,"723":10,"724":7,"725":7,"726":8,"727":8,"728":7,"729":7,"730":7,"731":7,"732":7,"733":9,"734":7,"911":1}}],["strs",{"2":{"496":8,"667":4,"670":6,"671":6,"676":6,"680":12,"692":4}}],["str",{"2":{"81":4,"101":4,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":6,"119":4,"124":6,"125":2,"126":6,"127":2,"128":6,"129":2,"428":2,"702":4,"777":2,"778":2,"781":2,"782":2,"784":2,"785":2,"786":2,"787":18,"788":6,"789":8,"790":8,"791":10,"792":8,"793":10,"794":8,"856":2,"857":2,"858":2,"860":2,"861":2,"862":2,"877":2,"883":2,"886":4,"887":2}}],["strconv",{"2":{"67":1,"71":2,"72":2,"78":2,"522":4,"523":4,"526":4,"673":2,"674":2,"905":8}}],["structfunc",{"2":{"740":1}}],["structtourlvalues",{"0":{"585":1},"2":{"570":1,"585":4}}],["structtomap",{"0":{"77":1},"2":{"63":1,"77":4}}],["structure",{"2":{"173":1,"199":1,"380":1,"387":1,"397":1,"907":1}}],["struct",{"2":{"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"37":2,"52":4,"74":2,"76":1,"77":4,"81":7,"82":11,"138":2,"193":4,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"208":4,"224":4,"243":2,"288":2,"300":4,"311":2,"323":2,"325":2,"326":2,"327":2,"328":2,"329":2,"363":2,"372":4,"388":6,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"429":2,"430":2,"431":2,"432":2,"483":2,"501":2,"507":5,"524":2,"525":2,"577":2,"581":3,"582":5,"583":2,"584":2,"585":3,"588":2,"590":2,"591":2,"637":2,"689":2,"690":4,"735":2,"736":1,"740":3,"741":5,"742":6,"743":5,"744":5,"745":3,"746":2,"747":4,"748":2,"749":2,"750":2,"751":2,"752":2,"814":2,"818":2,"822":2,"826":2,"830":2,"834":2,"838":2,"842":2,"846":4,"847":2,"893":2}}],["structs",{"0":{"735":1},"1":{"736":1,"737":1,"738":1,"739":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1},"2":{"0":1,"74":1,"736":2,"737":2,"740":4,"741":6,"742":4,"743":4,"744":4,"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"752":4}}],["strutil",{"0":{"753":1},"1":{"754":1,"755":1,"756":1,"757":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1},"2":{"0":1,"753":1,"754":1,"755":2,"758":12,"759":12,"760":10,"761":10,"762":4,"763":4,"764":4,"765":4,"766":12,"767":4,"768":4,"769":16,"770":16,"771":16,"772":4,"773":4,"774":4,"775":12,"776":14,"777":10,"778":12,"779":14,"780":14,"781":6,"782":4,"783":4,"784":8,"785":6,"786":6,"787":12,"788":4,"789":8,"790":6,"791":10,"792":6,"793":8,"794":6,"907":3,"908":5}}],["slicing",{"2":{"133":1}}],["slice2",{"2":{"652":2,"653":2}}],["slice1",{"2":{"652":2,"653":2}}],["slices",{"2":{"52":1,"138":1,"641":3,"652":1,"653":1,"664":1,"668":3,"675":3,"693":4,"695":1,"698":3,"699":2}}],["slice",{"0":{"630":1},"1":{"631":1,"632":1,"633":1,"634":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1},"2":{"0":2,"6":3,"7":5,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":1,"15":1,"16":3,"52":2,"68":1,"69":1,"74":1,"76":1,"78":1,"79":1,"121":1,"122":1,"133":3,"185":1,"186":1,"187":1,"192":1,"209":1,"225":1,"238":1,"243":1,"245":1,"287":1,"310":1,"322":1,"336":1,"337":1,"362":1,"367":1,"376":1,"464":1,"472":1,"501":6,"514":1,"516":1,"519":1,"520":1,"521":1,"524":2,"525":1,"547":3,"549":3,"554":1,"555":1,"611":1,"619":1,"630":2,"631":2,"632":2,"635":10,"636":9,"637":12,"638":9,"639":15,"640":13,"641":10,"642":9,"643":7,"644":8,"645":7,"646":8,"647":11,"648":13,"649":13,"650":11,"651":11,"652":6,"653":4,"654":7,"655":6,"656":7,"657":7,"658":7,"659":7,"660":7,"661":7,"662":7,"663":7,"664":7,"665":7,"666":8,"667":7,"668":5,"669":15,"670":9,"671":9,"672":8,"673":8,"674":8,"675":5,"676":7,"677":7,"678":9,"679":7,"680":15,"681":7,"682":5,"683":7,"684":11,"685":11,"686":11,"687":11,"688":13,"689":9,"690":8,"691":6,"692":8,"693":5,"694":5,"695":4,"696":7,"697":7,"698":5,"699":5,"700":16,"701":7,"702":7,"703":7,"710":1,"752":1,"782":1,"783":1,"790":2,"816":2,"817":2,"820":2,"821":2,"824":2,"825":2,"828":2,"829":2,"832":2,"833":2,"836":2,"837":2,"840":2,"841":2,"844":2,"845":2,"848":2,"849":2,"911":2}}],["sleep",{"2":{"43":2,"497":4,"499":2}}],["shorter",{"2":{"769":1,"770":1,"771":1}}],["shoud",{"2":{"256":1}}],["should",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"77":1,"80":1,"82":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"210":1,"213":1,"226":1,"229":1,"387":1,"403":1,"431":1,"457":1,"471":1,"586":8,"587":8,"588":8,"589":8,"590":8,"673":2,"690":2,"886":1,"906":1}}],["shuffled",{"2":{"683":1}}],["shuffle",{"0":{"683":1},"2":{"633":1,"683":4}}],["shards",{"2":{"536":1}}],["shardcount",{"2":{"529":2}}],["shard",{"2":{"529":2}}],["shatype",{"2":{"471":2}}],["sha",{"0":{"471":1},"2":{"125":1,"449":1,"471":9}}],["sha512withbase64",{"0":{"129":1},"2":{"89":1,"129":4}}],["sha512",{"0":{"128":1},"2":{"89":1,"117":1,"118":1,"128":5,"129":1,"471":4}}],["sha256withbase64",{"0":{"127":1},"2":{"89":1,"127":4}}],["sha256",{"0":{"126":1},"2":{"89":1,"115":1,"116":1,"126":5,"127":2,"471":4}}],["sha1withbase64",{"0":{"125":1},"2":{"89":1,"125":4}}],["sha1",{"0":{"124":1},"2":{"89":1,"113":1,"114":1,"124":5,"125":1,"471":4}}],["shell",{"2":{"9":1,"795":1,"807":1}}],["shellsort",{"0":{"9":1},"2":{"4":1,"9":4}}],["sep",{"2":{"775":2}}],["separator",{"2":{"703":3}}],["several",{"2":{"735":1}}],["server",{"2":{"593":3}}],["serves",{"2":{"355":1}}],["sendrequest",{"0":{"583":1},"2":{"570":1,"583":4,"584":2,"586":1,"587":1,"588":1,"589":1,"590":1}}],["send",{"2":{"567":1,"582":1,"583":1,"586":1,"587":1,"588":1,"589":1,"590":1}}],["sensitively",{"2":{"788":1}}],["sensitive",{"2":{"403":1}}],["sequential",{"2":{"704":1}}],["sequentially",{"2":{"536":1}}],["sequence",{"2":{"274":1,"544":1,"704":1}}],["see",{"2":{"427":1,"428":1}}],["setosenv",{"0":{"804":1},"2":{"798":1,"803":2,"804":4,"805":2,"806":2}}],["sets",{"2":{"346":1,"532":1,"804":1,"899":1}}],["set3",{"2":{"343":4,"346":4,"350":4,"351":4,"352":4,"353":4}}],["set2",{"2":{"343":4,"345":6,"346":4,"349":4,"350":4,"351":4,"352":6,"353":6}}],["set1",{"2":{"343":6,"344":4,"345":8,"346":6,"347":2,"349":4,"350":4,"351":4,"352":6,"353":4}}],["set",{"0":{"144":1,"330":1,"530":1},"1":{"145":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1},"2":{"77":1,"82":1,"136":1,"144":2,"145":2,"330":2,"331":2,"332":4,"335":11,"336":9,"337":9,"338":9,"339":11,"340":11,"341":11,"342":9,"343":16,"344":9,"345":11,"346":14,"347":11,"348":9,"349":11,"350":16,"351":16,"352":15,"353":19,"354":10,"505":1,"530":5,"531":2,"533":2,"534":2,"535":2,"536":2,"625":1,"627":1,"628":1,"688":1,"690":1,"794":1,"901":1}}],["seconds",{"2":{"438":1}}],["second",{"2":{"25":2,"26":2,"27":2,"28":2,"43":6,"442":1,"443":1,"444":1,"445":1,"498":2,"499":4,"544":2,"582":2,"628":1,"714":1}}],["selection",{"2":{"8":1}}],["selectionsort",{"0":{"8":1},"2":{"4":1,"8":4}}],["search",{"2":{"1":1,"2":1,"14":1,"15":1,"387":1,"389":1,"390":1}}],["sold",{"2":{"355":1}}],["so",{"2":{"82":1}}],["source=172ae18b",{"2":{"592":2}}],["source",{"0":{"2":1,"19":1,"31":1,"48":1,"61":1,"87":1,"174":1,"188":1,"201":1,"239":1,"279":1,"331":1,"356":1,"382":1,"399":1,"447":1,"477":1,"489":1,"503":1,"538":1,"568":1,"597":1,"607":1,"621":1,"631":1,"705":1,"736":1,"754":1,"796":1,"810":1,"851":1,"889":1},"2":{"82":1,"710":2,"711":2,"758":1,"759":1,"760":1,"761":1,"769":2,"770":2,"771":2,"778":1,"791":1}}],["sorttype",{"2":{"690":3}}],["sortorder",{"2":{"688":2}}],["sorts",{"2":{"688":1,"689":1}}],["sortbyfield",{"0":{"690":1},"2":{"690":4}}],["sortbyfielddeprecated",{"2":{"633":1}}],["sortby",{"0":{"689":1,"690":1},"2":{"633":1,"689":6}}],["sortedslice",{"2":{"14":2,"15":2}}],["sorted",{"0":{"723":1},"2":{"14":1,"15":1,"686":1,"687":1,"707":1,"723":9}}],["sortednums",{"2":{"13":4}}],["sort",{"0":{"688":1,"690":1},"2":{"1":1,"2":1,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"516":4,"519":4,"520":4,"521":4,"524":4,"633":1,"688":12,"689":3,"690":2}}],["something",{"2":{"740":2}}],["some",{"0":{"691":1},"2":{"1":1,"30":1,"47":1,"60":1,"86":1,"446":1,"476":1,"502":1,"537":1,"582":1,"596":1,"606":1,"630":1,"633":1,"691":4,"753":1,"791":1,"795":1,"809":1,"850":1}}],["tunwarpordefault",{"2":{"604":1}}],["tunwarpor",{"2":{"603":1}}],["tuples",{"2":{"817":2,"821":2,"825":2,"829":2,"833":2,"837":2,"841":2,"845":2,"849":2}}],["tuple10",{"0":{"846":1,"847":1},"2":{"812":2,"846":5,"847":3,"848":3,"849":5}}],["tuple9",{"0":{"842":1,"843":1},"2":{"812":2,"842":5,"843":3,"844":3,"845":5}}],["tuple8",{"0":{"838":1,"839":1},"2":{"812":2,"838":5,"839":3,"840":3,"841":5}}],["tuple7",{"0":{"834":1,"835":1},"2":{"812":2,"834":5,"835":3,"836":3,"837":5}}],["tuple6",{"0":{"830":1,"831":1},"2":{"812":2,"830":5,"831":3,"832":3,"833":5}}],["tuple5",{"0":{"826":1,"827":1},"2":{"812":2,"826":5,"827":3,"828":3,"829":5}}],["tuple4",{"0":{"822":1,"823":1},"2":{"812":2,"822":5,"823":3,"824":3,"825":5}}],["tuple3",{"0":{"818":1,"819":1},"2":{"812":2,"818":5,"819":3,"820":3,"821":5}}],["tuple2",{"0":{"814":1,"815":1},"2":{"812":2,"814":5,"815":3,"816":3,"817":5}}],["tuple",{"0":{"809":1},"1":{"810":1,"811":1,"812":1,"813":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1},"2":{"0":1,"809":2,"810":2,"814":5,"815":5,"816":4,"817":6,"818":5,"819":5,"820":4,"821":6,"822":5,"823":5,"824":4,"825":6,"826":5,"827":5,"828":4,"829":6,"830":5,"831":5,"832":4,"833":6,"834":5,"835":5,"836":4,"837":6,"838":5,"839":5,"840":4,"841":6,"842":5,"843":5,"844":4,"845":6,"846":5,"847":5,"848":4,"849":6}}],["tlsconfig",{"2":{"582":2}}],["tls",{"2":{"582":6}}],["typicode",{"2":{"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["type2",{"2":{"457":4}}],["type1",{"2":{"457":4}}],["types",{"2":{"52":1}}],["type",{"2":{"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"18":1,"23":1,"37":1,"52":2,"60":1,"74":2,"76":1,"77":2,"81":2,"82":8,"83":1,"193":3,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"208":3,"224":3,"243":1,"288":2,"300":4,"311":2,"323":3,"325":2,"326":2,"327":2,"328":2,"329":2,"335":1,"355":1,"363":1,"372":3,"387":1,"388":6,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"431":1,"432":1,"457":2,"483":2,"507":3,"522":1,"523":1,"524":1,"526":1,"529":4,"577":2,"581":3,"582":2,"583":2,"584":2,"585":2,"586":10,"587":10,"588":12,"589":8,"590":12,"591":4,"605":1,"637":2,"674":1,"688":2,"689":2,"690":4,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":4,"748":2,"749":2,"750":2,"751":2,"752":2,"766":1,"807":1,"809":1,"814":1,"818":1,"822":1,"826":1,"830":1,"834":1,"838":1,"842":1,"846":3,"847":2}}],["title",{"2":{"581":2,"583":4,"584":4,"587":2,"588":4,"590":4,"591":4}}],["timer",{"2":{"501":1}}],["times",{"2":{"438":1,"493":1,"494":1,"627":4}}],["timestampnano",{"0":{"445":1},"2":{"401":1,"445":4}}],["timestampmicro",{"0":{"444":1},"2":{"401":1,"444":4}}],["timestampmilli",{"0":{"443":1},"2":{"401":1,"443":4}}],["timestamp",{"0":{"442":1},"2":{"401":1,"425":2,"426":2,"429":1,"430":1,"431":1,"432":1,"433":1,"442":5,"443":1,"444":1,"445":1,"470":1}}],["timezone",{"2":{"427":2,"428":2,"441":3,"442":2,"443":2,"444":2,"445":2}}],["timefunc",{"2":{"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1}}],["time2",{"2":{"25":4,"26":4,"27":4,"28":4}}],["time1",{"2":{"25":6,"26":6,"27":6,"28":6}}],["time",{"2":{"0":1,"25":4,"26":4,"27":4,"28":4,"43":14,"398":1,"404":12,"405":12,"406":12,"407":12,"408":14,"409":14,"410":14,"411":16,"412":14,"413":14,"414":14,"415":14,"416":14,"417":16,"418":14,"419":14,"421":1,"422":1,"423":1,"424":1,"427":9,"428":5,"429":1,"431":1,"432":1,"434":1,"435":1,"436":1,"438":10,"439":16,"440":17,"470":1,"497":13,"498":5,"499":9,"501":6,"582":8,"583":2,"584":2,"625":4,"626":2,"628":4,"629":2}}],["ttype",{"2":{"495":1}}],["txt",{"2":{"451":2,"452":2,"454":4,"456":2,"457":2,"458":4,"459":2,"460":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"469":2,"470":2,"471":6,"474":2,"475":2}}],["t2",{"2":{"438":2}}],["t1",{"2":{"438":2}}],["ts",{"2":{"435":4,"436":4,"442":4,"443":4,"444":4,"445":4}}],["tpl",{"2":{"435":3}}],["tm",{"2":{"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4}}],["tryunwrap",{"0":{"905":1},"2":{"891":1,"905":7}}],["trim",{"0":{"789":1},"2":{"756":1,"789":8,"790":2}}],["trace",{"2":{"902":1}}],["transformation",{"2":{"695":1}}],["transforms",{"2":{"522":1,"523":1,"524":1,"674":1}}],["transform",{"0":{"526":1},"2":{"496":4,"505":1,"526":5}}],["traverse",{"2":{"391":1,"392":1,"393":1,"394":1}}],["treenode",{"2":{"388":8}}],["tree",{"0":{"381":1},"1":{"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"187":1,"192":1,"199":1,"381":3,"382":1,"383":4,"387":1,"388":6,"389":7,"390":7,"391":7,"392":7,"393":7,"394":7,"395":7,"396":11,"397":7}}],["truth",{"2":{"656":1,"657":1,"658":1,"659":1}}],["truthy",{"2":{"47":2,"52":3,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1}}],["truncated",{"2":{"720":1}}],["truncround",{"0":{"553":1},"2":{"540":1,"553":8,"564":4}}],["trunc",{"2":{"463":2,"464":2,"473":2}}],["true",{"2":{"17":6,"23":8,"24":6,"25":8,"26":8,"27":8,"28":8,"29":6,"52":18,"53":3,"54":6,"55":5,"56":3,"57":5,"58":6,"59":1,"67":10,"71":2,"72":2,"76":4,"81":8,"83":2,"84":4,"85":2,"151":1,"171":1,"183":2,"195":2,"220":2,"235":2,"244":2,"246":2,"252":2,"253":2,"257":2,"258":2,"275":6,"295":2,"296":2,"297":2,"298":2,"307":2,"308":2,"309":2,"318":2,"319":2,"320":2,"321":2,"327":2,"328":2,"339":3,"340":4,"342":2,"343":2,"345":4,"346":2,"348":2,"349":2,"354":2,"369":2,"378":2,"396":2,"437":2,"440":4,"452":1,"458":2,"460":2,"475":2,"501":2,"512":1,"527":2,"528":2,"530":10,"531":10,"534":2,"535":2,"536":2,"559":2,"579":2,"580":4,"582":2,"594":2,"595":2,"636":2,"637":6,"638":2,"640":8,"650":3,"651":3,"652":2,"653":2,"654":1,"656":2,"657":2,"658":2,"659":2,"663":2,"673":2,"684":2,"685":2,"686":4,"687":4,"691":3,"695":2,"726":3,"727":3,"728":2,"729":2,"730":2,"731":2,"732":2,"744":2,"747":2,"748":2,"749":2,"752":2,"766":6,"775":6,"782":2,"784":4,"785":2,"786":2,"792":3,"793":5,"794":3,"806":2,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"855":4,"856":2,"857":4,"858":4,"859":2,"860":2,"861":2,"862":6,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":4,"874":4,"875":6,"876":6,"877":4,"878":2,"879":4,"880":2,"881":2,"882":2,"883":4,"884":2,"885":4,"886":2,"887":8,"899":2,"900":2,"905":2}}],["telnet",{"2":{"595":1}}],["text",{"2":{"457":4,"464":2,"886":2}}],["testpatchtodo",{"2":{"590":2}}],["testputtodo",{"2":{"588":2}}],["testtodo",{"2":{"587":2}}],["testitem",{"2":{"581":2}}],["testdata",{"2":{"469":2,"470":2,"471":6,"472":2}}],["test",{"2":{"77":4,"81":4,"451":2,"452":2,"454":4,"456":2,"457":2,"458":4,"459":2,"460":2,"462":2,"463":2,"465":4,"466":4,"467":4,"469":2,"470":2,"471":6,"472":2,"473":2,"475":2,"507":4,"585":4,"593":2,"656":1,"657":1,"658":1,"659":1,"877":2}}],["ternaryoperator",{"0":{"59":1},"2":{"47":1,"50":1,"59":6}}],["tee",{"0":{"46":1},"2":{"34":1,"46":4}}],["taking",{"2":{"911":1}}],["takes",{"2":{"500":1,"908":1}}],["taken",{"2":{"45":1}}],["take",{"0":{"45":1},"2":{"34":1,"39":2,"40":2,"42":2,"44":2,"45":4,"46":2}}],["table",{"2":{"238":1,"243":1,"278":3}}],["tail",{"2":{"212":1,"228":1,"293":1,"305":1,"316":1}}],["tagfunc",{"2":{"745":1}}],["tagname",{"2":{"740":2}}],["tag",{"0":{"745":1},"2":{"77":1,"82":1,"585":1,"738":1,"745":10}}],["targetstruct",{"2":{"585":2}}],["target",{"2":{"14":5,"15":5,"16":5,"80":4,"473":1,"474":1,"475":1,"584":3,"636":3,"792":1,"793":1,"900":3}}],["toslicepointer",{"0":{"695":1},"2":{"633":1,"695":4}}],["toslice",{"0":{"694":1,"734":1},"2":{"633":1,"694":4,"707":1,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":4,"716":2,"717":2,"718":4,"719":8,"720":8,"721":2,"722":8,"723":4,"734":4}}],["tostring",{"0":{"76":1},"2":{"63":1,"76":17}}],["todoresp",{"2":{"591":6}}],["todovalues",{"2":{"585":8}}],["todoquery",{"2":{"585":4}}],["todo",{"2":{"583":10,"584":10,"588":8,"590":8,"591":4,"625":2}}],["todos",{"2":{"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["today",{"2":{"423":1,"424":1,"438":10}}],["tolower",{"2":{"496":6}}],["toupper",{"2":{"496":6}}],["tounix",{"0":{"433":1},"2":{"401":1,"433":4}}],["tomorrow",{"2":{"404":4,"438":4}}],["tomap",{"0":{"74":1,"741":1},"2":{"63":1,"74":4,"738":1,"741":9}}],["toiso8601",{"0":{"436":1},"2":{"401":1,"436":4}}],["toindex",{"2":{"169":1,"276":3}}],["tointerface",{"0":{"83":1},"2":{"63":1,"83":4}}],["toint",{"0":{"72":1},"2":{"63":1,"72":12}}],["toformatfortpl",{"0":{"435":1},"2":{"401":1,"435":4}}],["toformat",{"0":{"434":1},"2":{"401":1,"434":4}}],["tofloat",{"0":{"71":1},"2":{"63":1,"71":14}}],["top",{"2":{"354":1,"365":1,"366":1,"374":1,"375":1}}],["topointer",{"0":{"75":1},"2":{"63":1,"75":4}}],["total",{"2":{"82":14,"550":3}}],["tojson",{"0":{"73":1},"2":{"63":1,"73":4}}],["tochannel",{"0":{"70":1},"2":{"63":1,"70":4}}],["tochar",{"0":{"69":1},"2":{"63":1,"69":8}}],["tobytes",{"0":{"68":1},"2":{"63":1,"68":4}}],["tobool",{"0":{"67":1},"2":{"63":1,"67":4}}],["to",{"2":{"30":1,"47":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":2,"77":1,"78":1,"79":1,"80":1,"83":1,"84":1,"85":1,"133":1,"155":1,"157":1,"159":1,"171":1,"192":2,"200":1,"207":1,"223":2,"251":1,"257":1,"275":1,"323":1,"338":1,"339":1,"340":1,"381":2,"387":1,"404":1,"405":1,"406":1,"407":1,"427":1,"428":1,"451":1,"454":1,"466":1,"467":1,"473":1,"474":1,"475":1,"481":2,"482":1,"483":1,"496":1,"502":1,"507":2,"522":1,"523":1,"526":1,"528":1,"542":1,"543":1,"550":1,"551":1,"552":1,"555":1,"556":1,"557":1,"567":1,"572":1,"581":1,"582":1,"583":1,"585":1,"591":1,"592":1,"593":1,"596":1,"601":1,"606":1,"618":1,"630":1,"635":1,"645":1,"646":2,"647":1,"657":1,"658":1,"659":1,"666":1,"667":1,"673":1,"674":1,"679":1,"688":1,"689":1,"690":1,"692":1,"695":1,"702":1,"704":1,"712":1,"717":1,"720":1,"722":1,"723":1,"728":1,"729":1,"740":2,"741":1,"753":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"767":1,"768":1,"772":1,"773":1,"774":1,"782":1,"783":1,"790":2,"807":2,"816":1,"820":1,"824":1,"828":1,"832":1,"836":1,"840":1,"844":1,"848":1,"874":1,"875":1,"876":1,"886":2,"896":1,"898":1,"899":1,"906":1,"907":1,"908":1}}],["tools",{"2":{"911":1}}],["tool",{"2":{"0":1}}],["two",{"2":{"23":1,"24":1,"29":1,"46":1,"261":1,"264":1,"346":1,"387":1,"438":1,"527":1,"558":1,"652":1,"653":1,"664":1,"900":1}}],["through",{"2":{"678":1}}],["thru",{"2":{"665":1,"672":1}}],["thread",{"2":{"133":1}}],["that",{"2":{"133":1,"149":1,"271":1,"272":1,"355":2,"493":1,"494":1,"497":1,"619":1,"626":1,"656":1,"657":1,"658":1,"659":1,"668":1,"715":1,"716":1,"717":1,"742":1,"901":1}}],["thanks",{"2":{"47":1}}],["than",{"2":{"0":1,"25":1,"26":1,"27":2,"28":1,"52":1,"192":2,"494":1,"719":1,"720":1,"769":1,"770":1,"771":1}}],["this",{"2":{"47":1,"144":1,"149":2,"151":1,"159":1,"163":1,"165":1,"167":1,"169":1,"171":1,"248":1,"250":1,"271":1,"272":1,"274":1,"278":1,"528":1,"689":1,"704":1,"716":1,"717":1,"718":1,"719":2,"720":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"886":1}}],["therefore",{"2":{"886":1}}],["thetimetype",{"2":{"429":1,"430":1}}],["thetime",{"2":{"429":3,"430":3,"431":4,"432":4,"433":2,"434":2,"435":2,"436":2}}],["their",{"2":{"52":1}}],["they",{"2":{"52":2,"527":1,"645":1}}],["then",{"2":{"41":1,"181":1,"354":1,"365":1,"374":1,"496":1,"534":1,"657":1,"659":1,"697":1,"719":1,"886":1,"905":1}}],["the",{"2":{"14":3,"15":3,"16":4,"38":1,"39":1,"40":2,"41":1,"42":2,"46":1,"47":2,"52":5,"59":1,"82":2,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"133":2,"140":2,"142":3,"144":3,"147":3,"149":3,"155":3,"157":3,"159":3,"161":3,"163":2,"165":2,"167":2,"171":1,"180":1,"185":1,"186":1,"192":6,"194":1,"195":2,"196":2,"197":1,"198":2,"199":2,"200":1,"207":1,"210":1,"218":1,"219":1,"221":1,"223":1,"226":1,"233":1,"234":1,"236":1,"244":2,"246":1,"247":2,"248":3,"249":1,"250":3,"251":1,"252":1,"253":1,"254":1,"259":1,"263":1,"264":1,"265":1,"269":2,"271":2,"272":1,"273":2,"274":1,"276":2,"278":4,"292":1,"293":1,"294":1,"298":1,"304":1,"305":1,"306":1,"309":1,"317":1,"321":1,"323":1,"339":3,"340":4,"344":1,"348":1,"349":1,"354":1,"355":2,"365":1,"366":1,"374":1,"375":1,"380":1,"387":2,"395":1,"396":1,"397":1,"403":1,"407":1,"423":1,"424":1,"435":1,"438":1,"439":2,"451":2,"460":1,"462":1,"467":1,"484":3,"485":3,"486":2,"487":2,"488":1,"496":2,"497":2,"499":1,"500":1,"501":10,"509":1,"512":3,"513":2,"514":2,"516":1,"519":1,"520":1,"521":1,"528":1,"530":1,"531":2,"532":3,"533":1,"534":4,"535":1,"536":3,"543":1,"544":1,"545":1,"547":2,"548":1,"549":2,"550":1,"562":2,"563":2,"564":1,"566":1,"585":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":2,"603":3,"604":4,"605":2,"620":1,"625":1,"629":2,"635":2,"636":2,"638":1,"639":1,"640":1,"642":3,"643":1,"644":1,"645":1,"646":2,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"654":3,"655":1,"656":1,"657":2,"658":1,"659":2,"663":1,"664":1,"665":1,"669":1,"670":3,"671":3,"673":2,"676":1,"678":2,"680":2,"681":2,"689":2,"691":3,"695":1,"700":1,"703":1,"704":1,"709":1,"713":1,"714":4,"715":1,"716":2,"717":2,"718":3,"719":3,"720":1,"722":1,"723":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":1,"731":1,"732":1,"733":2,"734":2,"740":2,"742":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":3,"759":3,"760":4,"761":4,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"775":1,"776":2,"780":1,"787":3,"789":3,"790":1,"792":1,"793":1,"803":3,"804":3,"806":1,"807":1,"816":1,"820":1,"824":1,"828":1,"832":1,"836":1,"840":1,"844":1,"848":1,"855":1,"856":1,"857":1,"858":1,"859":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":2,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"886":3,"898":1,"906":1,"907":3,"908":2,"909":1,"910":1,"911":1}}],["tfunc",{"2":{"13":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"70":1,"75":1,"78":1,"81":1,"142":1,"155":1,"197":1,"209":1,"225":1,"245":1,"289":1,"292":1,"293":1,"301":1,"312":1,"315":1,"316":1,"324":1,"337":1,"367":1,"376":1,"391":1,"392":1,"393":1,"394":1,"496":1,"500":1,"520":1,"521":1,"523":1,"542":1,"546":1,"547":1,"548":1,"549":1,"554":1,"555":1,"560":1,"561":1,"565":1,"566":1,"601":1,"602":1,"635":1,"639":1,"640":1,"641":1,"644":1,"645":1,"646":1,"648":1,"649":1,"650":1,"651":1,"655":1,"665":1,"668":1,"669":1,"675":1,"677":1,"680":1,"681":1,"682":1,"683":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"725":1,"734":1,"905":1}}],["t",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":5,"14":6,"15":6,"16":8,"29":4,"37":6,"38":5,"39":5,"40":5,"41":5,"42":5,"43":5,"44":5,"45":5,"46":8,"52":4,"53":4,"54":4,"55":4,"56":4,"57":4,"58":4,"59":4,"70":5,"73":1,"74":6,"75":5,"78":5,"81":8,"82":4,"83":2,"138":4,"140":2,"142":3,"144":6,"147":4,"149":4,"151":2,"153":4,"155":3,"157":4,"159":4,"161":4,"163":4,"165":6,"167":6,"169":2,"171":4,"193":8,"194":4,"195":4,"196":4,"197":3,"198":2,"199":2,"208":14,"209":3,"210":4,"211":4,"212":4,"213":2,"214":2,"215":2,"216":4,"217":2,"218":4,"219":2,"220":2,"221":2,"222":2,"224":16,"225":3,"226":4,"227":4,"228":4,"229":2,"230":2,"231":2,"232":2,"233":4,"234":2,"235":2,"236":2,"237":2,"243":10,"244":4,"245":3,"246":4,"247":4,"248":4,"249":4,"250":4,"251":4,"252":4,"253":4,"254":2,"255":4,"256":4,"257":4,"258":2,"259":2,"260":4,"261":7,"262":2,"263":2,"264":2,"265":2,"266":2,"267":6,"268":6,"269":6,"270":6,"271":4,"272":4,"273":4,"274":4,"275":6,"276":4,"277":4,"288":8,"289":3,"290":4,"291":4,"292":3,"293":3,"294":2,"295":2,"296":2,"297":2,"298":4,"300":16,"301":3,"302":4,"303":4,"304":4,"305":4,"306":2,"307":2,"308":2,"309":4,"311":8,"312":3,"313":4,"314":4,"315":3,"316":3,"317":2,"318":2,"319":2,"320":2,"321":4,"323":9,"324":3,"325":4,"326":4,"327":2,"328":2,"329":2,"335":10,"336":6,"337":3,"338":4,"339":4,"340":6,"341":4,"342":4,"343":4,"344":2,"345":4,"346":4,"347":4,"348":4,"349":2,"350":6,"351":6,"352":6,"353":6,"354":5,"363":8,"364":4,"365":4,"366":4,"367":3,"368":2,"369":2,"370":2,"372":14,"373":4,"374":4,"375":4,"376":3,"377":2,"378":2,"379":2,"380":2,"387":1,"388":18,"389":6,"390":6,"391":5,"392":5,"393":5,"394":5,"395":4,"396":6,"397":4,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"427":10,"431":3,"433":2,"434":2,"435":2,"436":2,"439":2,"440":2,"481":4,"495":13,"496":9,"500":9,"520":5,"521":5,"522":6,"523":5,"542":5,"546":5,"547":9,"548":5,"549":9,"554":5,"555":5,"560":5,"561":5,"565":5,"566":5,"601":5,"602":5,"603":7,"604":5,"635":8,"636":6,"637":14,"638":4,"639":5,"640":5,"641":7,"642":6,"643":6,"644":5,"645":11,"646":9,"647":4,"648":5,"649":5,"650":7,"651":7,"652":4,"653":6,"654":6,"655":7,"656":8,"657":9,"658":8,"659":9,"662":6,"663":6,"664":10,"665":7,"668":5,"669":5,"670":6,"671":6,"672":6,"673":6,"674":6,"675":5,"676":4,"677":11,"678":6,"679":6,"680":9,"681":9,"682":5,"683":5,"684":4,"685":4,"686":4,"687":6,"688":4,"689":6,"691":6,"693":5,"694":5,"695":5,"696":5,"697":9,"698":5,"699":7,"700":7,"701":7,"702":7,"703":4,"709":6,"710":6,"711":6,"712":6,"713":6,"714":6,"715":4,"716":6,"717":8,"718":6,"719":4,"720":4,"721":4,"722":4,"723":6,"724":4,"725":9,"726":4,"727":4,"728":6,"729":6,"730":4,"731":4,"732":4,"733":2,"734":3,"784":2,"794":2,"814":6,"815":6,"818":8,"819":6,"822":10,"823":6,"826":12,"827":6,"830":14,"831":6,"834":16,"835":6,"838":18,"839":6,"842":20,"843":6,"846":22,"847":6,"870":2,"905":5}}],["pkg",{"2":{"895":2,"897":1,"902":1}}],["pgwsze",{"2":{"613":2}}],["ping",{"2":{"594":1,"807":1}}],["picx",{"2":{"592":2}}],["pi",{"2":{"557":6,"562":4,"563":4}}],["pipeline",{"0":{"500":1},"2":{"491":1,"500":5}}],["places",{"2":{"550":1,"551":1,"552":1,"553":1}}],["plain",{"2":{"457":4}}],["phone",{"2":{"507":6,"866":3}}],["pq",{"2":{"326":2}}],["push",{"0":{"194":1,"251":1,"364":1,"373":1},"2":{"190":1,"194":5,"195":2,"196":2,"197":2,"198":2,"199":2,"241":1,"251":4,"359":1,"360":1,"364":9,"365":6,"366":6,"367":6,"368":6,"369":6,"370":6,"373":9,"374":6,"375":6,"376":6,"377":6,"378":6,"379":6,"380":6}}],["pubkeyfilename",{"2":{"131":2}}],["pubkeyfile",{"2":{"130":2}}],["publicip",{"2":{"578":4}}],["publicipinfo",{"2":{"577":8}}],["public",{"2":{"130":3,"131":5,"132":4,"577":1,"578":1,"579":1}}],["put",{"0":{"181":1},"2":{"17":6,"40":1,"41":1,"42":1,"176":1,"181":5,"182":2,"183":2,"184":6,"185":6,"186":6,"290":1,"302":1,"313":1,"325":1,"588":1}}],["peak",{"0":{"366":1,"375":1},"2":{"359":1,"360":1,"366":4,"375":4}}],["performing",{"2":{"718":1}}],["performs",{"2":{"273":1,"724":1,"725":1}}],["personinfo",{"2":{"507":4}}],["person",{"2":{"507":4}}],["percentage",{"2":{"550":1}}],["percent",{"0":{"550":1},"2":{"82":14,"540":1,"550":8}}],["peekstream",{"2":{"718":4}}],["peek",{"0":{"196":1,"718":1},"2":{"190":1,"196":4,"707":1,"718":4}}],["pem",{"2":{"130":4,"131":8,"132":8}}],["peoples",{"2":{"7":6}}],["peopleagecomparator",{"2":{"7":6}}],["peopleaagecomparator",{"2":{"7":2}}],["people",{"2":{"7":10,"77":4,"740":4,"741":4,"742":4,"743":4,"744":4}}],["pm",{"2":{"77":4}}],["p",{"2":{"77":4,"507":6,"602":2,"603":2,"604":2}}],["p2",{"2":{"7":6}}],["p1",{"2":{"7":6,"740":4,"741":6,"742":4,"743":4,"744":4,"745":4,"746":4,"748":4,"749":4,"750":4,"751":4,"752":4}}],["pc",{"2":{"7":2}}],["prefixes",{"2":{"785":2}}],["present",{"2":{"532":1,"534":1,"536":1,"787":1}}],["predicate",{"2":{"509":3,"512":3,"637":3,"643":3,"650":3,"651":3,"654":3,"655":2,"656":2,"657":4,"658":2,"659":4,"691":3,"699":2,"716":3,"730":3,"731":3,"732":3}}],["precision",{"2":{"484":3,"485":3,"562":2,"563":2}}],["prettytowriter",{"0":{"483":1},"2":{"479":1,"483":4}}],["pretty",{"0":{"482":1},"2":{"479":1,"482":7,"483":1}}],["preordertraverse",{"0":{"391":1},"2":{"385":1,"389":2,"390":2,"391":4}}],["previous",{"2":{"223":1,"517":1}}],["pre",{"2":{"222":6,"223":1,"224":2,"391":1}}],["prime",{"2":{"559":1}}],["principle",{"2":{"355":1}}],["printed",{"2":{"903":1}}],["printable",{"2":{"781":1,"887":1}}],["print",{"0":{"222":1,"237":1,"380":1,"397":1},"2":{"199":1,"204":1,"205":1,"222":3,"237":3,"360":1,"380":5,"385":1,"397":5,"498":4}}],["printstructure",{"0":{"199":1},"2":{"199":4}}],["printf",{"2":{"73":2,"83":4,"673":2,"674":2,"689":2,"814":2,"815":2,"817":2,"818":2,"819":2,"821":2,"822":2,"823":2,"825":2,"826":2,"827":2,"829":2,"830":2,"831":2,"833":2,"834":2,"835":2,"837":2,"838":2,"839":2,"841":2,"842":2,"843":2,"845":2,"846":2,"847":2,"849":2}}],["println",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":4,"15":4,"16":4,"17":10,"23":14,"24":8,"25":12,"26":14,"27":12,"28":14,"29":12,"38":2,"39":2,"40":2,"41":6,"42":2,"43":2,"44":2,"45":2,"46":4,"52":18,"53":8,"54":8,"55":8,"56":8,"57":8,"58":8,"59":4,"65":2,"66":2,"67":2,"68":4,"69":6,"70":6,"71":12,"72":10,"73":2,"74":2,"75":2,"76":14,"77":2,"78":2,"79":2,"80":2,"81":2,"82":6,"83":2,"84":4,"85":4,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"178":2,"179":2,"180":2,"181":2,"182":4,"183":4,"184":4,"185":2,"186":2,"193":2,"194":2,"195":4,"196":4,"197":2,"198":2,"199":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":4,"221":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":4,"232":2,"233":2,"234":2,"235":4,"236":2,"243":2,"244":4,"245":2,"246":4,"247":4,"248":4,"249":4,"250":4,"251":2,"252":6,"253":6,"254":8,"255":8,"256":6,"257":4,"258":4,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":6,"272":6,"273":2,"274":2,"275":2,"276":2,"277":4,"288":2,"289":2,"290":2,"291":4,"292":4,"293":4,"294":2,"295":4,"296":4,"297":2,"298":4,"300":2,"301":2,"302":2,"303":4,"304":4,"305":4,"306":2,"307":4,"308":2,"309":4,"311":2,"312":2,"313":2,"314":4,"315":4,"316":4,"317":2,"318":4,"319":4,"320":2,"321":4,"323":2,"324":2,"325":2,"326":4,"327":4,"328":4,"329":4,"335":2,"336":2,"337":2,"338":2,"339":6,"340":6,"341":2,"342":4,"343":4,"344":2,"345":4,"346":4,"347":2,"348":2,"349":4,"350":2,"351":2,"352":2,"353":4,"354":4,"363":2,"364":2,"365":6,"366":6,"367":2,"368":2,"369":4,"370":2,"372":2,"373":2,"374":6,"375":6,"376":2,"377":2,"378":4,"379":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":4,"397":2,"404":4,"405":4,"406":4,"407":4,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":6,"428":6,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":4,"438":4,"439":6,"440":6,"441":4,"442":2,"443":2,"444":2,"445":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":4,"457":4,"458":2,"459":2,"460":4,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":4,"470":4,"471":8,"472":4,"473":2,"474":2,"475":2,"481":6,"482":4,"483":4,"484":8,"485":8,"486":8,"487":8,"493":2,"494":2,"495":2,"496":2,"497":4,"498":2,"499":2,"500":2,"501":4,"507":4,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":6,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":4,"528":6,"530":2,"531":2,"532":2,"534":4,"535":2,"536":2,"542":4,"543":6,"544":6,"545":6,"546":4,"547":6,"548":4,"549":6,"550":6,"551":6,"552":6,"553":6,"554":8,"555":8,"556":6,"557":6,"558":2,"559":8,"560":10,"561":6,"562":10,"563":10,"564":6,"565":4,"566":6,"573":4,"574":2,"575":2,"576":2,"577":4,"578":2,"579":6,"580":6,"583":2,"584":2,"585":8,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":4,"594":4,"595":4,"601":4,"602":4,"603":8,"604":8,"605":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"625":2,"626":2,"627":2,"628":2,"629":2,"635":4,"636":4,"637":8,"638":4,"639":10,"640":8,"641":4,"642":4,"643":2,"644":2,"645":2,"646":2,"647":6,"648":8,"649":8,"650":6,"651":6,"652":4,"653":2,"654":2,"655":2,"656":4,"657":4,"658":4,"659":4,"660":2,"661":2,"662":2,"663":2,"664":4,"665":2,"666":2,"667":2,"668":2,"669":10,"670":4,"671":4,"672":2,"675":2,"676":2,"677":2,"678":4,"679":2,"680":10,"681":2,"682":2,"683":2,"684":6,"685":6,"686":6,"687":6,"688":8,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":10,"701":2,"702":2,"703":4,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":4,"716":2,"717":2,"718":6,"719":8,"720":8,"721":2,"722":8,"723":4,"724":2,"725":2,"726":4,"727":4,"728":4,"729":4,"730":4,"731":4,"732":4,"733":4,"734":2,"741":4,"742":2,"743":2,"744":2,"745":2,"746":2,"747":4,"748":4,"749":4,"750":4,"751":4,"752":2,"758":10,"759":10,"760":8,"761":8,"762":2,"763":2,"764":2,"765":2,"766":10,"767":2,"768":2,"769":14,"770":14,"771":14,"772":4,"773":2,"774":2,"775":10,"776":12,"777":8,"778":10,"779":12,"780":12,"781":4,"782":4,"783":2,"784":6,"785":4,"786":4,"787":10,"788":2,"789":6,"790":4,"791":8,"792":4,"793":6,"794":4,"800":2,"801":2,"802":2,"803":4,"804":4,"805":8,"806":2,"807":14,"808":2,"816":2,"820":2,"824":2,"828":2,"832":2,"836":2,"840":2,"844":2,"848":2,"855":6,"856":6,"857":6,"858":6,"859":6,"860":6,"861":6,"862":10,"863":4,"864":4,"865":4,"866":4,"867":4,"868":6,"869":4,"870":6,"871":8,"872":8,"873":8,"874":8,"875":8,"876":8,"877":8,"878":4,"879":8,"880":4,"881":4,"882":4,"883":6,"884":4,"885":8,"886":2,"887":10,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":4,"900":4,"901":2,"902":6,"903":8,"904":2,"905":4,"908":2}}],["priorityqueue",{"0":{"285":1,"322":1},"2":{"278":1,"279":1,"323":5,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2}}],["prikeyfile",{"2":{"130":2}}],["privatekeyfilename",{"2":{"132":2}}],["private",{"2":{"130":3,"131":4,"132":5}}],["programmeur",{"2":{"779":4,"780":2}}],["programmer",{"2":{"779":4,"780":2}}],["programming",{"2":{"30":1,"488":1}}],["provide",{"2":{"735":1}}],["provided",{"2":{"713":1,"718":1,"723":1,"728":1,"729":1,"730":1,"731":1,"732":1,"741":1}}],["provides",{"2":{"18":1}}],["produces",{"2":{"678":1}}],["produced",{"2":{"355":1}}],["proper",{"2":{"274":1}}],["processing",{"2":{"0":4}}],["panics",{"2":{"905":1}}],["padstr",{"2":{"769":2,"770":2,"771":2}}],["padstart",{"0":{"771":1},"2":{"756":1,"771":16}}],["pads",{"2":{"769":1,"770":1,"771":1}}],["padend",{"0":{"770":1},"2":{"756":1,"770":16}}],["pad",{"0":{"769":1},"2":{"756":1,"769":16}}],["pacwgf",{"2":{"614":2}}],["package",{"2":{"1":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":3,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"139":1,"141":1,"143":1,"145":1,"148":1,"150":1,"152":1,"154":1,"156":1,"158":1,"160":1,"162":1,"164":1,"166":1,"168":1,"170":1,"172":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"398":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"488":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"502":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"537":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"567":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"606":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"620":1,"626":1,"627":1,"628":1,"629":1,"630":1,"704":2,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"753":1,"795":1,"809":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"850":1,"888":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1,"907":3,"908":2,"910":1}}],["packages",{"2":{"0":1}}],["patch",{"2":{"590":1}}],["path",{"2":{"451":2,"452":3,"453":1,"455":1,"456":2,"458":2,"459":2,"460":3,"461":3,"462":3,"463":10,"464":10,"467":1,"469":2}}],["password",{"2":{"882":3,"884":3,"894":4}}],["passes",{"2":{"656":1,"657":1,"658":1,"659":1}}],["passed",{"2":{"75":1,"81":1,"440":1,"500":1,"565":1,"678":1,"682":1,"885":1}}],["pass",{"2":{"340":1,"509":1,"601":1,"654":1,"691":1}}],["pairs",{"2":{"509":1,"515":1,"524":1,"525":1}}],["pair",{"2":{"184":1,"508":1}}],["parent",{"2":{"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"752":4}}],["part",{"2":{"488":1}}],["parsing",{"2":{"71":2,"72":2}}],["parseip",{"2":{"574":2,"579":6,"580":6}}],["parseint",{"2":{"72":2}}],["parsehttpresponse",{"0":{"591":1},"2":{"570":1,"591":4}}],["parsebinarybytes",{"0":{"487":1},"2":{"479":1,"487":10}}],["parsebool",{"2":{"67":1}}],["parsedecimalbytes",{"0":{"486":1},"2":{"479":1,"486":10}}],["parse",{"2":{"427":2}}],["parsefloat",{"2":{"71":2}}],["params",{"2":{"586":10,"587":10,"588":10,"589":10,"590":10}}],["parameter",{"2":{"439":1,"484":1,"485":1,"695":1,"789":1}}],["param",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"59":1,"71":1,"72":1,"73":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"210":1,"213":1,"226":1,"229":1,"323":1,"403":1,"427":1,"428":1,"437":1,"453":1,"457":1,"471":1,"500":1,"572":2,"586":2,"587":2,"588":2,"589":2,"590":2,"682":1,"688":1,"700":1,"791":1,"807":1}}],["port",{"2":{"595":2}}],["powershell",{"2":{"807":1}}],["power",{"2":{"543":1}}],["powerful",{"2":{"0":1,"910":1}}],["postdata",{"2":{"581":8,"587":8}}],["post",{"2":{"393":1,"581":2,"586":2,"587":3,"588":2,"589":2,"590":2}}],["postordertraverse",{"0":{"393":1},"2":{"385":1,"393":4}}],["position",{"2":{"142":1,"144":1,"161":1,"163":1,"776":1}}],["pointdistance",{"0":{"558":1},"2":{"540":1,"558":4}}],["point",{"2":{"381":2,"484":1,"485":1}}],["points",{"2":{"200":1,"207":1,"223":2,"558":1}}],["pointer",{"0":{"596":1},"1":{"597":1,"598":1,"599":1,"600":1,"601":1,"602":1,"603":1,"604":1,"605":1},"2":{"0":1,"37":1,"75":1,"80":1,"155":1,"193":1,"200":1,"207":1,"223":2,"243":1,"246":1,"288":1,"300":1,"311":1,"323":1,"363":1,"372":1,"381":2,"388":1,"596":2,"597":2,"598":2,"601":7,"602":7,"603":12,"604":12,"605":4,"695":1,"811":2,"893":1,"894":1}}],["poplast",{"2":{"241":1,"253":4}}],["popfirst",{"0":{"252":1,"253":1},"2":{"241":1,"252":4}}],["pop",{"0":{"195":1,"354":1,"365":1,"374":1},"2":{"190":1,"195":5,"354":4,"359":1,"360":1,"365":4,"374":4}}],["ls",{"2":{"807":3}}],["lcm",{"0":{"561":1},"2":{"540":1,"561":9}}],["lucy",{"2":{"472":2}}],["lk",{"2":{"208":4,"209":10,"210":14,"211":10,"212":10,"213":14,"214":14,"215":12,"216":14,"217":12,"218":10,"219":10,"220":12,"221":12,"222":10,"224":4,"225":10,"226":14,"227":10,"228":10,"229":14,"230":14,"231":12,"232":12,"233":10,"234":10,"235":12,"236":12,"237":10}}],["lazily",{"2":{"714":1}}],["latest",{"2":{"906":5}}],["lat",{"2":{"577":4}}],["largest",{"2":{"195":1,"196":1}}],["last",{"2":{"149":1,"212":1,"215":1,"228":1,"231":1,"248":1,"250":1,"253":1,"355":1,"497":1,"658":1,"659":1,"671":1,"727":1,"759":1,"761":1}}],["lastindexoffunc",{"0":{"250":1},"2":{"241":1,"250":7}}],["lastindexof",{"0":{"149":1,"248":1,"671":1},"1":{"150":1},"2":{"136":1,"149":2,"150":2,"241":1,"248":6,"633":1,"671":6}}],["language",{"2":{"0":1}}],["lancetconstraints",{"2":{"6":3,"7":5,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":2,"15":2,"193":4,"323":4,"387":1,"388":4}}],["lancet",{"0":{"910":1,"911":1},"1":{"911":1},"2":{"0":3,"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":2,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":2,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":6,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":4,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"625":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":5,"907":3,"908":2,"910":1,"911":2}}],["lpjnul+wow4m6dsqxbninhswhlwfp0jecwqzypolmcq=",{"2":{"127":2}}],["lodash",{"2":{"910":1}}],["lower+upper",{"2":{"882":1}}],["lowerfirst",{"0":{"767":1},"2":{"756":1,"767":4}}],["lower",{"2":{"615":1,"767":1,"857":1,"861":1}}],["lowindex",{"2":{"14":2,"15":2}}],["longer",{"2":{"657":1,"659":1,"720":1}}],["longrunningtask",{"2":{"501":4}}],["lon",{"2":{"577":4}}],["logo",{"2":{"592":2}}],["logarithm",{"2":{"564":1}}],["log",{"0":{"564":1},"2":{"540":1,"564":8,"586":4,"587":4,"588":4,"589":4,"590":4,"591":6,"626":2,"627":2,"628":2,"629":2}}],["local",{"2":{"439":6,"440":6,"592":1}}],["lock",{"2":{"138":2}}],["loop",{"2":{"348":1,"663":1}}],["loadavg",{"2":{"82":8}}],["letters",{"2":{"762":1,"763":1,"764":1,"773":1,"774":1,"859":1,"860":1,"861":1}}],["letter",{"2":{"613":1,"617":1,"856":1,"857":1,"858":1,"884":2}}],["least",{"2":{"561":1,"856":1,"857":1,"858":1}}],["leap",{"2":{"437":1}}],["level",{"2":{"394":1,"660":1,"735":1,"895":4,"896":2,"897":2,"898":4,"901":4,"903":4}}],["levelordertraverse",{"0":{"394":1},"2":{"385":1,"394":4}}],["leftnode",{"2":{"387":1}}],["leftcloserightopen",{"2":{"169":1}}],["left",{"2":{"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"192":1,"381":2,"387":1,"481":1,"496":1,"679":1,"769":1,"771":1}}],["less",{"2":{"25":1,"27":1,"28":1,"494":1,"689":3,"723":3,"728":4,"729":4}}],["lessorequal",{"0":{"27":1},"2":{"21":1,"27":14}}],["lessthan",{"0":{"25":1},"2":{"21":1,"25":14}}],["length",{"2":{"52":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"140":1,"254":1,"255":1,"611":2,"613":3,"614":2,"615":2,"616":2,"617":2,"619":1,"639":1,"652":1,"682":1,"720":1,"776":3,"882":2,"884":2}}],["len",{"2":{"14":4,"15":4,"17":4,"67":2,"82":2,"210":1,"213":1,"226":1,"229":1,"547":12,"549":12,"687":6,"700":1,"702":2,"742":2,"787":4}}],["l",{"2":{"17":8,"139":2,"140":2,"141":4,"143":4,"145":4,"148":4,"150":4,"152":4,"154":4,"156":4,"158":2,"160":6,"162":4,"164":4,"166":4,"168":2,"170":4,"172":4,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":3,"268":3,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"276":6,"277":8}}],["lt=",{"2":{"700":1}}],["lt",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"38":18,"39":8,"40":2,"41":8,"42":2,"43":8,"44":4,"45":14,"46":8,"67":2,"70":8,"81":2,"178":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"222":8,"325":4,"326":4,"327":4,"328":4,"329":4,"380":2,"387":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"469":2,"470":2,"471":2,"472":2,"483":2,"501":2,"507":2,"524":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"549":6,"689":4,"700":1,"711":6,"713":2,"723":2,"729":3,"803":2,"804":2,"805":4,"882":1}}],["lili",{"2":{"473":4}}],["lifo",{"2":{"355":1}}],["like",{"2":{"330":1,"453":1,"481":1,"529":1,"679":1,"699":1,"807":1,"886":1,"907":1}}],["li3",{"2":{"257":4,"261":4,"267":4,"268":4}}],["li2",{"2":{"257":4,"258":4,"261":4,"267":4,"268":4}}],["li1",{"2":{"257":6,"258":4,"261":4,"267":4,"268":4}}],["li",{"2":{"243":4,"244":6,"245":4,"246":4,"247":6,"248":6,"249":6,"250":6,"251":6,"252":6,"253":6,"254":18,"255":18,"256":14,"259":6,"260":4,"262":4,"263":4,"264":6,"265":6,"266":6}}],["listfilenames",{"0":{"461":1},"2":{"449":1,"461":4}}],["list3",{"2":{"269":4,"270":4}}],["list2",{"2":{"269":4,"270":4,"271":6,"272":6}}],["list1",{"2":{"269":4,"270":4,"271":6,"272":6}}],["listtomap",{"0":{"275":1},"2":{"241":1,"275":4}}],["list",{"0":{"238":1},"1":{"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1},"2":{"133":1,"134":2,"135":2,"139":4,"141":4,"142":1,"143":4,"144":1,"145":4,"147":1,"148":4,"149":2,"150":4,"151":1,"152":4,"154":4,"155":1,"156":4,"157":1,"158":4,"159":1,"160":4,"161":1,"162":6,"163":1,"164":6,"165":1,"166":6,"167":1,"168":6,"169":1,"170":6,"171":1,"172":4,"200":1,"207":1,"223":1,"238":1,"239":2,"240":4,"243":12,"244":9,"245":9,"246":9,"247":9,"248":9,"249":8,"250":9,"251":9,"252":9,"253":9,"254":10,"255":10,"256":10,"257":16,"258":11,"259":9,"260":11,"261":17,"262":9,"263":8,"264":9,"265":9,"266":9,"267":16,"268":16,"269":13,"270":10,"271":18,"272":18,"273":11,"274":11,"275":13,"276":12,"277":8,"330":1,"371":1,"461":1,"496":1,"500":1,"575":1,"576":1,"691":1}}],["limited",{"2":{"704":1}}],["limit",{"0":{"720":1},"2":{"45":1,"707":1,"720":10}}],["linux",{"2":{"801":1,"807":4}}],["lines",{"2":{"464":1}}],["line",{"2":{"464":2,"902":2}}],["linear",{"2":{"238":1,"243":1,"278":1}}],["linearsearch",{"0":{"16":1},"2":{"4":1,"16":6}}],["linkist",{"2":{"217":1,"218":1,"232":1,"233":1}}],["linknode",{"2":{"208":6,"218":2,"224":8,"233":2}}],["linkedstack",{"0":{"360":1,"371":1},"2":{"356":1,"371":1,"372":5,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2}}],["linkedqueue",{"0":{"283":1,"299":1},"2":{"278":1,"279":1,"300":5,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2}}],["linked",{"2":{"200":1,"207":1,"223":1,"371":1,"373":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1}}],["linklist",{"0":{"200":1},"1":{"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1},"2":{"200":1,"209":1,"210":1,"211":1,"212":1,"214":1,"215":1,"216":1,"219":1,"220":1,"221":1,"222":1,"225":1,"226":1,"227":1,"228":1,"230":1,"231":1,"234":1,"235":1,"236":1,"237":1}}],["link",{"2":{"38":1,"200":1,"201":2,"202":4,"207":1,"208":7,"209":8,"210":8,"211":8,"212":8,"213":8,"214":8,"215":8,"216":8,"217":8,"218":8,"219":8,"220":8,"221":8,"222":8,"223":1,"224":7,"225":8,"226":8,"227":8,"228":8,"229":8,"230":8,"231":8,"232":8,"233":8,"234":8,"235":8,"236":8,"237":8,"299":1,"459":1}}],["lightweight",{"2":{"18":1}}],["library",{"2":{"0":1,"910":1}}],["lrucache",{"0":{"17":1},"2":{"4":1,"17":11}}],["lru",{"2":{"2":1,"17":1}}],["a=1",{"2":{"572":2,"573":4}}],["a==",{"2":{"118":2}}],["accumulator",{"2":{"725":2}}],["accumulation",{"2":{"725":1}}],["accumulating",{"2":{"678":1}}],["accepts",{"2":{"645":1,"646":1,"699":1}}],["according",{"2":{"618":1,"723":1,"728":1,"729":1}}],["ac",{"2":{"549":2,"788":4}}],["actual",{"2":{"532":2,"534":2}}],["action",{"2":{"273":1,"718":1,"724":3}}],["avg",{"2":{"542":4}}],["average",{"0":{"542":1},"2":{"540":1,"542":7}}],["a1",{"2":{"523":2}}],["ahead",{"2":{"481":1}}],["aage",{"2":{"483":4}}],["aa",{"2":{"481":1}}],["aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35",{"2":{"471":2}}],["aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d",{"2":{"124":2}}],["above",{"2":{"906":1}}],["about",{"2":{"795":1}}],["ab1",{"2":{"856":2,"859":2,"860":2,"861":2,"878":2}}],["abd",{"2":{"547":4}}],["ab",{"2":{"547":4,"549":6,"687":6,"702":4,"788":4,"789":6}}],["abs",{"0":{"566":1},"2":{"540":1,"566":8}}],["abspath",{"2":{"453":2,"455":4}}],["absolute",{"2":{"453":1,"455":1,"566":1}}],["abstract",{"2":{"355":1,"581":1,"735":1,"742":1,"743":1,"745":1}}],["abc123",{"2":{"884":2}}],["abcabc123",{"2":{"882":2}}],["abcabc",{"2":{"882":2,"884":2}}],["abcd",{"2":{"789":2}}],["abcde",{"2":{"496":4,"776":10}}],["abcdefgh",{"2":{"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2}}],["abcdefghijklmnop",{"2":{"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2}}],["abc",{"2":{"67":2,"68":2,"69":2,"71":2,"72":2,"79":2,"80":2,"83":4,"547":6,"549":4,"601":4,"602":4,"603":6,"604":4,"687":6,"702":4,"782":2,"783":2,"792":2,"793":4,"803":4,"804":4,"805":4,"806":4,"807":2,"857":6,"858":6,"859":2,"860":4,"861":4,"862":2,"868":4,"869":2,"874":2,"875":2,"876":2,"877":2,"878":2,"883":6,"885":2,"887":2}}],["atoi",{"2":{"905":6}}],["at",{"2":{"142":1,"144":1,"155":1,"161":1,"163":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"218":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"233":1,"246":1,"254":1,"255":1,"256":1,"264":1,"278":2,"387":1,"669":1,"670":1,"671":1,"700":1,"776":1,"856":1,"857":1,"858":1}}],["assert",{"2":{"807":2}}],["associative",{"2":{"725":1}}],["assigned",{"2":{"133":1}}],["ascii",{"2":{"862":1}}],["asc",{"2":{"688":1,"690":1}}],["ascending",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"684":1,"686":1,"688":1,"689":1,"690":1}}],["as",{"2":{"133":1,"355":2,"387":1,"577":4,"678":1,"689":1,"704":1,"718":1,"895":1,"908":1}}],["agg",{"2":{"678":10,"679":6}}],["agvsbg8=",{"2":{"100":2,"101":2,"863":2}}],["age",{"2":{"7":22,"77":2,"483":4,"507":6,"689":14,"690":10,"747":6,"748":6,"749":6,"750":8,"751":6}}],["aesofbdecrypt",{"0":{"99":1},"2":{"89":1,"99":2}}],["aesofbencrypt",{"0":{"98":1},"2":{"89":1,"98":4,"99":2}}],["aescfbdecrypt",{"0":{"97":1},"2":{"89":1,"96":2,"97":4,"98":2,"99":2}}],["aescfbencrypt",{"0":{"96":1},"2":{"89":1,"96":4,"97":2}}],["aesctrcrypt",{"0":{"95":1},"2":{"89":1,"95":6}}],["aescbcdecrypt",{"0":{"94":1},"2":{"89":1,"93":2,"94":4}}],["aescbcencrypt",{"0":{"93":1},"2":{"89":1,"93":4,"94":2}}],["aesecbdecrypt",{"0":{"92":1},"2":{"89":1,"91":2,"92":4}}],["aesecbencrypt",{"0":{"91":1},"2":{"89":1,"91":4,"92":2}}],["aes",{"2":{"86":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1}}],["am",{"2":{"779":4,"780":2}}],["amount",{"2":{"486":1,"487":1}}],["amap",{"2":{"73":4,"78":6,"528":2}}],["amp",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"80":2,"81":8,"82":4,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"222":6,"325":2,"326":2,"327":2,"328":2,"329":2,"380":6,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":4,"397":2,"429":2,"430":2,"431":2,"432":2,"483":2,"507":2,"572":4,"573":4,"578":2,"581":2,"582":2,"583":4,"584":4,"591":2,"594":6,"602":4,"603":4,"604":4,"605":6,"637":8,"695":4,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"762":4,"763":2,"764":2,"773":2,"774":2,"856":4}}],["argument",{"2":{"562":1,"563":1}}],["args",{"2":{"493":2,"494":2,"498":2,"499":2,"893":2}}],["arrs",{"2":{"660":4,"661":4}}],["arr",{"2":{"347":8,"639":12,"752":6}}],["array2",{"2":{"637":6}}],["array1",{"2":{"637":6}}],["arraystack",{"0":{"359":1,"362":1},"2":{"356":1,"362":1,"363":5,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2}}],["arrayqueue",{"0":{"282":1,"287":1},"2":{"278":1,"279":1,"288":5,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2}}],["array",{"2":{"70":2,"74":2,"76":1,"364":1,"366":1,"367":1,"368":1,"369":1,"370":1,"524":1,"785":1,"786":1,"911":1}}],["are",{"2":{"23":1,"24":1,"29":1,"45":1,"52":3,"53":1,"57":1,"58":1,"271":1,"272":1,"355":1,"387":1,"510":1,"511":1,"513":1,"514":1,"527":1,"640":1,"646":1,"652":2,"653":1,"682":1,"709":1,"712":1,"714":1,"718":1,"721":1,"722":1,"742":1,"790":1,"816":1,"820":1,"824":1,"828":1,"832":1,"836":1,"840":1,"844":1,"848":1,"900":1,"911":1}}],["apache",{"2":{"910":1}}],["apply",{"2":{"673":1,"717":1}}],["application",{"2":{"586":2,"587":2,"588":2,"590":2,"591":2}}],["appendifabsent",{"0":{"635":1},"2":{"633":1,"635":6}}],["appends",{"2":{"157":1,"159":1}}],["append",{"2":{"52":2,"251":1,"273":2,"274":2,"347":2,"466":1,"473":2,"475":2,"501":2,"635":1,"662":2,"718":2}}],["apis",{"2":{"909":1}}],["apiurl",{"2":{"587":2}}],["api",{"0":{"0":1}}],["alpha",{"2":{"882":1}}],["alphabetic",{"2":{"779":1,"780":1}}],["algrithm",{"2":{"688":1}}],["algorithm",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1},"2":{"0":1,"1":2,"2":3,"3":2,"6":5,"7":5,"8":5,"9":5,"10":5,"11":5,"12":5,"13":5,"14":6,"15":6,"16":6,"17":4,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"125":1,"127":1,"131":1,"132":1}}],["allocation",{"2":{"782":1,"783":1}}],["allows",{"2":{"278":1}}],["allmatch",{"0":{"730":1},"2":{"707":1,"730":6}}],["all",{"2":{"52":1,"159":1,"169":1,"197":1,"209":1,"216":1,"217":1,"221":1,"222":1,"225":1,"232":1,"236":1,"237":1,"267":1,"272":1,"277":1,"289":1,"297":1,"301":1,"308":1,"312":1,"320":1,"324":1,"337":1,"350":1,"367":1,"370":1,"376":1,"379":1,"461":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"575":1,"576":1,"640":1,"643":1,"652":1,"654":1,"655":1,"668":1,"675":1,"688":1,"698":1,"701":1,"714":2,"730":1,"742":1,"792":1,"794":1,"860":1,"861":1,"862":1,"887":1,"901":1,"906":1}}],["afterlast",{"0":{"759":1},"2":{"756":1,"759":12}}],["after1year",{"2":{"407":4}}],["after2minutes",{"2":{"406":4}}],["after2hours",{"2":{"405":4}}],["after",{"0":{"493":1,"758":1},"2":{"43":6,"484":1,"485":1,"491":1,"493":4,"497":1,"498":1,"627":2,"719":1,"756":1,"758":13,"759":1,"787":1,"790":1}}],["addition",{"2":{"741":1}}],["additionally",{"2":{"718":1}}],["additional",{"2":{"641":1,"789":1}}],["addifnotexistby",{"0":{"340":1},"2":{"333":1,"340":7}}],["addifnotexist",{"0":{"339":1},"2":{"333":1,"339":7}}],["addresses",{"2":{"576":1}}],["address",{"2":{"507":8,"869":1,"879":1,"880":1,"881":1}}],["addr",{"2":{"507":2}}],["addone",{"2":{"500":4,"645":4,"662":4,"672":4,"717":4}}],["add1",{"2":{"495":4}}],["addcurry",{"2":{"495":4}}],["addyear",{"0":{"407":1},"2":{"401":1,"407":6}}],["addminute",{"0":{"406":1},"2":{"401":1,"406":6}}],["addhour",{"0":{"405":1},"2":{"401":1,"405":6}}],["addday",{"0":{"404":1},"2":{"401":1,"404":6,"438":4}}],["adds",{"2":{"339":1,"340":1,"898":1}}],["addbyindex",{"0":{"161":1},"1":{"162":1},"2":{"136":1,"161":2,"162":2}}],["addall",{"0":{"159":1},"1":{"160":1},"2":{"136":1,"159":2,"160":2}}],["add",{"0":{"157":1,"338":1},"1":{"158":1},"2":{"25":2,"26":2,"27":2,"28":2,"136":1,"157":2,"158":2,"333":1,"338":5,"339":2,"340":2,"341":2,"342":2,"354":6,"404":1,"405":1,"406":1,"407":1,"481":1,"495":4,"497":4,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"581":6,"587":4,"894":1}}],["anther",{"2":{"778":1}}],["angle",{"2":{"556":3,"557":1}}],["angletoradian",{"0":{"556":1},"2":{"540":1,"556":8}}],["an",{"2":{"52":1,"153":1,"274":1,"353":1,"355":1,"466":1,"518":1,"579":1,"580":1,"639":1,"640":1,"644":1,"672":1,"683":1,"704":1,"719":1,"724":1,"725":2,"743":1,"747":1,"785":1,"786":1,"908":1}}],["another",{"2":{"44":1,"45":1,"257":1,"343":1,"526":1,"674":1}}],["anymatch",{"0":{"731":1},"2":{"707":1,"731":6}}],["anyfunc",{"2":{"180":1,"181":1,"185":1,"186":1,"605":1,"660":1,"661":1,"667":1,"746":1,"901":1}}],["anything",{"2":{"52":1}}],["any",{"2":{"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"17":2,"18":1,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"37":4,"43":7,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"68":2,"70":2,"71":2,"72":2,"73":2,"74":4,"75":2,"76":2,"77":4,"78":4,"79":2,"80":2,"81":2,"82":2,"138":2,"151":1,"180":3,"181":5,"182":2,"183":2,"184":4,"185":1,"186":1,"193":6,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"208":6,"224":6,"243":4,"275":4,"288":4,"300":6,"311":4,"323":4,"325":2,"326":2,"327":2,"328":2,"329":2,"363":4,"372":6,"388":8,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"457":2,"482":2,"483":2,"493":4,"494":4,"495":2,"496":2,"498":4,"499":4,"500":2,"507":5,"508":2,"509":2,"510":2,"512":2,"513":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":4,"521":4,"522":2,"523":4,"524":4,"525":4,"526":4,"527":2,"528":2,"529":2,"547":2,"549":2,"572":4,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"601":2,"602":2,"603":2,"604":2,"605":3,"637":2,"639":2,"641":3,"643":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":3,"661":3,"662":2,"663":2,"664":2,"665":2,"666":2,"667":3,"669":4,"672":4,"673":4,"674":4,"675":2,"676":2,"677":2,"678":4,"679":4,"682":2,"683":2,"687":2,"688":1,"689":2,"690":2,"691":3,"692":2,"694":2,"695":2,"699":2,"700":2,"702":2,"703":2,"709":2,"710":2,"711":2,"713":2,"714":2,"725":1,"731":1,"740":2,"741":6,"746":1,"766":2,"785":1,"786":1,"793":1,"814":8,"816":4,"817":4,"818":12,"820":6,"821":6,"822":16,"824":8,"825":8,"826":20,"828":10,"829":10,"830":24,"832":12,"833":12,"834":28,"836":14,"837":14,"838":32,"840":16,"841":16,"842":36,"844":18,"845":18,"846":40,"848":20,"849":20,"871":2,"872":2,"873":2,"885":2,"893":4,"894":2,"898":2,"901":1,"905":2}}],["and",{"0":{"53":1,"690":1},"2":{"0":3,"23":1,"42":1,"47":1,"50":1,"52":2,"53":11,"57":1,"58":1,"71":1,"72":1,"73":1,"82":1,"86":1,"130":1,"133":1,"169":1,"179":1,"184":1,"192":1,"195":2,"196":1,"200":1,"207":1,"223":1,"252":1,"253":1,"254":1,"255":1,"256":1,"267":1,"268":1,"276":1,"278":2,"291":1,"303":1,"314":1,"326":1,"339":2,"340":4,"348":1,"350":1,"351":1,"352":1,"354":1,"365":1,"374":1,"381":1,"387":1,"398":2,"441":1,"464":1,"467":1,"488":1,"500":1,"508":1,"509":1,"515":1,"532":1,"534":1,"536":1,"567":1,"585":1,"606":1,"612":1,"640":1,"645":1,"646":1,"652":2,"662":1,"663":1,"673":1,"674":2,"704":1,"712":1,"725":1,"726":2,"727":2,"762":1,"763":1,"764":1,"769":1,"773":1,"774":1,"789":1,"790":1,"806":1,"807":2,"809":1,"886":1,"894":1,"896":2,"898":1,"900":1,"901":3,"906":1,"907":1,"908":1,"910":2,"911":2}}],["a",{"2":{"0":1,"7":4,"14":2,"15":2,"16":7,"18":1,"23":4,"25":2,"26":2,"27":2,"29":1,"37":1,"41":1,"42":1,"44":1,"45":1,"52":2,"53":3,"54":3,"55":3,"56":3,"57":4,"58":3,"69":2,"70":2,"71":2,"72":2,"73":4,"74":2,"75":1,"78":6,"80":1,"81":5,"101":1,"121":2,"133":2,"138":1,"153":1,"155":1,"173":1,"178":1,"179":1,"180":2,"181":4,"182":8,"183":4,"184":2,"185":5,"186":3,"187":1,"192":1,"193":1,"200":3,"207":3,"208":1,"209":1,"223":3,"224":1,"225":1,"238":1,"243":2,"249":8,"250":8,"257":1,"258":1,"260":1,"267":1,"268":1,"269":1,"275":2,"276":1,"277":4,"278":2,"288":1,"300":1,"311":1,"323":1,"330":1,"335":1,"336":1,"345":1,"348":1,"350":1,"351":1,"352":1,"355":1,"362":1,"363":1,"367":1,"371":1,"372":1,"376":1,"380":1,"381":4,"387":1,"388":1,"395":1,"453":6,"458":1,"459":1,"465":3,"466":1,"481":2,"482":8,"484":1,"485":1,"493":1,"494":1,"495":4,"497":1,"500":2,"508":2,"509":3,"510":7,"511":3,"512":4,"513":4,"514":4,"515":13,"516":5,"517":2,"518":4,"519":9,"520":5,"521":9,"522":5,"523":3,"524":5,"525":6,"526":5,"527":4,"528":4,"529":4,"530":1,"531":1,"533":1,"535":1,"547":3,"549":5,"554":1,"555":1,"572":2,"581":1,"582":1,"592":1,"593":3,"601":1,"602":4,"603":2,"604":2,"605":4,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"620":1,"635":8,"636":4,"637":14,"638":8,"639":12,"640":4,"641":5,"647":8,"648":13,"649":15,"650":1,"651":1,"653":4,"656":1,"657":1,"658":1,"659":1,"660":4,"661":4,"665":1,"667":6,"668":1,"669":20,"670":8,"671":8,"673":1,"674":2,"676":4,"678":1,"680":21,"681":7,"682":9,"684":1,"685":1,"686":1,"687":7,"688":7,"689":14,"690":4,"692":6,"693":1,"694":5,"695":4,"696":6,"698":1,"700":18,"701":1,"702":7,"704":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":3,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":7,"725":7,"728":7,"729":7,"741":3,"742":1,"743":1,"745":2,"747":4,"748":4,"749":4,"750":4,"751":4,"752":5,"758":1,"759":1,"765":1,"766":4,"775":17,"776":1,"777":1,"778":1,"779":13,"780":6,"781":1,"782":4,"783":4,"784":1,"785":1,"786":1,"788":4,"789":1,"790":8,"794":1,"805":1,"807":2,"814":13,"815":4,"816":9,"817":8,"818":17,"819":8,"820":13,"821":12,"822":17,"823":8,"824":13,"825":12,"826":17,"827":8,"828":13,"829":12,"830":17,"831":8,"832":13,"833":12,"834":17,"835":8,"836":13,"837":12,"838":17,"839":8,"840":13,"841":12,"842":21,"843":12,"844":13,"845":12,"846":29,"847":20,"848":13,"849":12,"857":1,"858":1,"859":1,"860":1,"861":1,"868":2,"869":2,"874":1,"875":1,"876":1,"878":4,"879":1,"880":1,"881":1,"885":1,"893":1,"894":1,"896":1,"905":1,"910":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.84da4c78.js b/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.84da4c78.js new file mode 100644 index 0000000..809dc79 --- /dev/null +++ b/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.84da4c78.js @@ -0,0 +1 @@ +const t='{"documentCount":912,"nextId":912,"documentIds":{"0":"/api/overview.html#API概述","1":"/api/packages/algorithm.html#Algorithm","2":"/api/packages/algorithm.html#源码","3":"/api/packages/algorithm.html#用法","4":"/api/packages/algorithm.html#目录","5":"/api/packages/algorithm.html#文档","6":"/api/packages/algorithm.html#BubbleSort","7":"/api/packages/algorithm.html#InsertionSort","8":"/api/packages/algorithm.html#SelectionSort","9":"/api/packages/algorithm.html#ShellSort","10":"/api/packages/algorithm.html#QuickSort","11":"/api/packages/algorithm.html#HeapSort","12":"/api/packages/algorithm.html#MergeSort","13":"/api/packages/algorithm.html#CountSort","14":"/api/packages/algorithm.html#BinarySearch","15":"/api/packages/algorithm.html#BinaryIterativeSearch","16":"/api/packages/algorithm.html#LinearSearch","17":"/api/packages/algorithm.html#LRUCache","18":"/api/packages/compare.html#Compare","19":"/api/packages/compare.html#源码-","20":"/api/packages/compare.html#用法-","21":"/api/packages/compare.html#目录","22":"/api/packages/compare.html#文档","23":"/api/packages/compare.html#Equal","24":"/api/packages/compare.html#EqualValue","25":"/api/packages/compare.html#LessThan","26":"/api/packages/compare.html#GreaterThan","27":"/api/packages/compare.html#LessOrEqual","28":"/api/packages/compare.html#GreaterOrEqual","29":"/api/packages/compare.html#InDelta","30":"/api/packages/concurrency.html#Concurrency","31":"/api/packages/concurrency.html#源码-","32":"/api/packages/concurrency.html#用法-","33":"/api/packages/concurrency.html#目录","34":"/api/packages/concurrency.html#Channel","35":"/api/packages/concurrency.html#文档","36":"/api/packages/concurrency.html#Channel-1","37":"/api/packages/concurrency.html#NewChannel","38":"/api/packages/concurrency.html#Bridge","39":"/api/packages/concurrency.html#FanIn","40":"/api/packages/concurrency.html#Generate","41":"/api/packages/concurrency.html#Repeat","42":"/api/packages/concurrency.html#RepeatFn","43":"/api/packages/concurrency.html#Or","44":"/api/packages/concurrency.html#OrDone","45":"/api/packages/concurrency.html#Take","46":"/api/packages/concurrency.html#Tee","47":"/api/packages/condition.html#Condition","48":"/api/packages/condition.html#源码-","49":"/api/packages/condition.html#用法-","50":"/api/packages/condition.html#目录","51":"/api/packages/condition.html#文档","52":"/api/packages/condition.html#Bool","53":"/api/packages/condition.html#And","54":"/api/packages/condition.html#Or","55":"/api/packages/condition.html#Xor","56":"/api/packages/condition.html#Nor","57":"/api/packages/condition.html#Xnor","58":"/api/packages/condition.html#Nand","59":"/api/packages/condition.html#TernaryOperator","60":"/api/packages/convertor.html#Convertor","61":"/api/packages/convertor.html#源码-","62":"/api/packages/convertor.html#用法-","63":"/api/packages/convertor.html#目录","64":"/api/packages/convertor.html#文档","65":"/api/packages/convertor.html#ColorHexToRGB","66":"/api/packages/convertor.html#ColorRGBToHex","67":"/api/packages/convertor.html#ToBool","68":"/api/packages/convertor.html#ToBytes","69":"/api/packages/convertor.html#ToChar","70":"/api/packages/convertor.html#ToChannel","71":"/api/packages/convertor.html#ToFloat","72":"/api/packages/convertor.html#ToInt","73":"/api/packages/convertor.html#ToJson","74":"/api/packages/convertor.html#ToMap","75":"/api/packages/convertor.html#ToPointer","76":"/api/packages/convertor.html#ToString","77":"/api/packages/convertor.html#StructToMap","78":"/api/packages/convertor.html#MapToSlice","79":"/api/packages/convertor.html#EncodeByte","80":"/api/packages/convertor.html#DecodeByte","81":"/api/packages/convertor.html#DeepClone","82":"/api/packages/convertor.html#CopyProperties","83":"/api/packages/convertor.html#ToInterface","84":"/api/packages/convertor.html#Utf8ToGbk","85":"/api/packages/convertor.html#GbkToUtf8","86":"/api/packages/cryptor.html#Cryptor","87":"/api/packages/cryptor.html#源码-","88":"/api/packages/cryptor.html#用法-","89":"/api/packages/cryptor.html#目录","90":"/api/packages/cryptor.html#文档","91":"/api/packages/cryptor.html#AesEcbEncrypt","92":"/api/packages/cryptor.html#AesEcbDecrypt","93":"/api/packages/cryptor.html#AesCbcEncrypt","94":"/api/packages/cryptor.html#AesCbcDecrypt","95":"/api/packages/cryptor.html#AesCtrCrypt","96":"/api/packages/cryptor.html#AesCfbEncrypt","97":"/api/packages/cryptor.html#AesCfbDecrypt","98":"/api/packages/cryptor.html#AesOfbEncrypt","99":"/api/packages/cryptor.html#AesOfbDecrypt","100":"/api/packages/cryptor.html#Base64StdEncode","101":"/api/packages/cryptor.html#Base64StdDecode","102":"/api/packages/cryptor.html#DesEcbEncrypt","103":"/api/packages/cryptor.html#DesEcbDecrypt","104":"/api/packages/cryptor.html#DesCbcEncrypt","105":"/api/packages/cryptor.html#DesCbcDecrypt","106":"/api/packages/cryptor.html#DesCtrCrypt","107":"/api/packages/cryptor.html#DesCfbEncrypt","108":"/api/packages/cryptor.html#DesCfbDecrypt","109":"/api/packages/cryptor.html#DesOfbEncrypt","110":"/api/packages/cryptor.html#DesOfbDecrypt","111":"/api/packages/cryptor.html#HmacMd5","112":"/api/packages/cryptor.html#HmacMd5WithBase64","113":"/api/packages/cryptor.html#HmacSha1","114":"/api/packages/cryptor.html#HmacSha1WithBase64","115":"/api/packages/cryptor.html#HmacSha256","116":"/api/packages/cryptor.html#HmacSha256WithBase64","117":"/api/packages/cryptor.html#HmacSha512","118":"/api/packages/cryptor.html#HmacSha512WithBase64","119":"/api/packages/cryptor.html#Md5String","120":"/api/packages/cryptor.html#Md5StringWithBase64","121":"/api/packages/cryptor.html#Md5Byte","122":"/api/packages/cryptor.html#Md5ByteWithBase64","123":"/api/packages/cryptor.html#Md5File","124":"/api/packages/cryptor.html#Sha1","125":"/api/packages/cryptor.html#Sha1WithBase64","126":"/api/packages/cryptor.html#Sha256","127":"/api/packages/cryptor.html#Sha256WithBase64","128":"/api/packages/cryptor.html#Sha512","129":"/api/packages/cryptor.html#Sha512WithBase64","130":"/api/packages/cryptor.html#GenerateRsaKey","131":"/api/packages/cryptor.html#RsaEncrypt","132":"/api/packages/cryptor.html#RsaDecrypt","133":"/api/packages/datastructure/copyonwritelist.html#CopyOnWriteList","134":"/api/packages/datastructure/copyonwritelist.html#源码","135":"/api/packages/datastructure/copyonwritelist.html#用法","136":"/api/packages/datastructure/copyonwritelist.html#目录","137":"/api/packages/datastructure/copyonwritelist.html#文档","138":"/api/packages/datastructure/copyonwritelist.html#NewCopyOnWriteList","139":"/api/packages/datastructure/copyonwritelist.html#示例","140":"/api/packages/datastructure/copyonwritelist.html#Size","141":"/api/packages/datastructure/copyonwritelist.html#示例-1","142":"/api/packages/datastructure/copyonwritelist.html#Get","143":"/api/packages/datastructure/copyonwritelist.html#示例-2","144":"/api/packages/datastructure/copyonwritelist.html#Set","145":"/api/packages/datastructure/copyonwritelist.html#示例-3","146":"/api/packages/datastructure/copyonwritelist.html#Remove","147":"/api/packages/datastructure/copyonwritelist.html#IndexOf","148":"/api/packages/datastructure/copyonwritelist.html#示例-4","149":"/api/packages/datastructure/copyonwritelist.html#LastIndexOf","150":"/api/packages/datastructure/copyonwritelist.html#示例-5","151":"/api/packages/datastructure/copyonwritelist.html#IsEmpty","152":"/api/packages/datastructure/copyonwritelist.html#示例-6","153":"/api/packages/datastructure/copyonwritelist.html#Contain","154":"/api/packages/datastructure/copyonwritelist.html#示例-7","155":"/api/packages/datastructure/copyonwritelist.html#ValueOf","156":"/api/packages/datastructure/copyonwritelist.html#示例-8","157":"/api/packages/datastructure/copyonwritelist.html#Add","158":"/api/packages/datastructure/copyonwritelist.html#示例-9","159":"/api/packages/datastructure/copyonwritelist.html#AddAll","160":"/api/packages/datastructure/copyonwritelist.html#示例-10","161":"/api/packages/datastructure/copyonwritelist.html#AddByIndex","162":"/api/packages/datastructure/copyonwritelist.html#示例-11","163":"/api/packages/datastructure/copyonwritelist.html#DeleteAt","164":"/api/packages/datastructure/copyonwritelist.html#示例-12","165":"/api/packages/datastructure/copyonwritelist.html#DeleteIf","166":"/api/packages/datastructure/copyonwritelist.html#示例-13","167":"/api/packages/datastructure/copyonwritelist.html#DeleteBy","168":"/api/packages/datastructure/copyonwritelist.html#示例-14","169":"/api/packages/datastructure/copyonwritelist.html#DeleteRange","170":"/api/packages/datastructure/copyonwritelist.html#示例-15","171":"/api/packages/datastructure/copyonwritelist.html#Equal","172":"/api/packages/datastructure/copyonwritelist.html#示例-16","173":"/api/packages/datastructure/hashmap.html#HashMap","174":"/api/packages/datastructure/hashmap.html#源码","175":"/api/packages/datastructure/hashmap.html#用法","176":"/api/packages/datastructure/hashmap.html#目录","177":"/api/packages/datastructure/hashmap.html#API-文档","178":"/api/packages/datastructure/hashmap.html#NewHashMap","179":"/api/packages/datastructure/hashmap.html#NewHashMapWithCapacity","180":"/api/packages/datastructure/hashmap.html#Get","181":"/api/packages/datastructure/hashmap.html#Put","182":"/api/packages/datastructure/hashmap.html#Delete","183":"/api/packages/datastructure/hashmap.html#Contains","184":"/api/packages/datastructure/hashmap.html#Iterate","185":"/api/packages/datastructure/hashmap.html#Keys","186":"/api/packages/datastructure/hashmap.html#Values","187":"/api/packages/datastructure/heap.html#Heap","188":"/api/packages/datastructure/heap.html#源码","189":"/api/packages/datastructure/heap.html#用法","190":"/api/packages/datastructure/heap.html#目录","191":"/api/packages/datastructure/heap.html#API文档","192":"/api/packages/datastructure/heap.html#_1-MaxHeap","193":"/api/packages/datastructure/heap.html#NewMaxHeap","194":"/api/packages/datastructure/heap.html#Push","195":"/api/packages/datastructure/heap.html#Pop","196":"/api/packages/datastructure/heap.html#Peek","197":"/api/packages/datastructure/heap.html#Data","198":"/api/packages/datastructure/heap.html#Size","199":"/api/packages/datastructure/heap.html#PrintStructure","200":"/api/packages/datastructure/link.html#Linklist","201":"/api/packages/datastructure/link.html#源码","202":"/api/packages/datastructure/link.html#用法","203":"/api/packages/datastructure/link.html#目录","204":"/api/packages/datastructure/link.html#_1-SinglyLink单链表","205":"/api/packages/datastructure/link.html#_2-DoublyLink双向链表","206":"/api/packages/datastructure/link.html#文档","207":"/api/packages/datastructure/link.html#_1-SinglyLink","208":"/api/packages/datastructure/link.html#NewSinglyLink","209":"/api/packages/datastructure/link.html#Values","210":"/api/packages/datastructure/link.html#InsertAt","211":"/api/packages/datastructure/link.html#InsertAtHead","212":"/api/packages/datastructure/link.html#InsertAtTail","213":"/api/packages/datastructure/link.html#DeleteAt","214":"/api/packages/datastructure/link.html#DeleteAtHead","215":"/api/packages/datastructure/link.html#DeleteAtTail","216":"/api/packages/datastructure/link.html#DeleteValue","217":"/api/packages/datastructure/link.html#Reverse","218":"/api/packages/datastructure/link.html#GetMiddleNode","219":"/api/packages/datastructure/link.html#Size","220":"/api/packages/datastructure/link.html#IsEmpty","221":"/api/packages/datastructure/link.html#Clear","222":"/api/packages/datastructure/link.html#Print","223":"/api/packages/datastructure/link.html#_2-DoublyLink","224":"/api/packages/datastructure/link.html#NewDoublyLink","225":"/api/packages/datastructure/link.html#Values-1","226":"/api/packages/datastructure/link.html#InsertAt-1","227":"/api/packages/datastructure/link.html#InsertAtHead-1","228":"/api/packages/datastructure/link.html#InsertAtTail-1","229":"/api/packages/datastructure/link.html#DeleteAt-1","230":"/api/packages/datastructure/link.html#DeleteAtHead-1","231":"/api/packages/datastructure/link.html#DeleteAtTail-1","232":"/api/packages/datastructure/link.html#Reverse-1","233":"/api/packages/datastructure/link.html#GetMiddleNode-1","234":"/api/packages/datastructure/link.html#Size-1","235":"/api/packages/datastructure/link.html#IsEmpty-1","236":"/api/packages/datastructure/link.html#Clear-1","237":"/api/packages/datastructure/link.html#Print-1","238":"/api/packages/datastructure/list.html#List","239":"/api/packages/datastructure/list.html#源码","240":"/api/packages/datastructure/list.html#用法","241":"/api/packages/datastructure/list.html#目录","242":"/api/packages/datastructure/list.html#文档","243":"/api/packages/datastructure/list.html#NewList","244":"/api/packages/datastructure/list.html#Contain","245":"/api/packages/datastructure/list.html#Data","246":"/api/packages/datastructure/list.html#ValueOf","247":"/api/packages/datastructure/list.html#IndexOf","248":"/api/packages/datastructure/list.html#LastIndexOf","249":"/api/packages/datastructure/list.html#IndexOfFunc","250":"/api/packages/datastructure/list.html#LastIndexOfFunc","251":"/api/packages/datastructure/list.html#Push","252":"/api/packages/datastructure/list.html#PopFirst","253":"/api/packages/datastructure/list.html#PopFirst-1","254":"/api/packages/datastructure/list.html#DeleteAt","255":"/api/packages/datastructure/list.html#InsertAt","256":"/api/packages/datastructure/list.html#UpdateAt","257":"/api/packages/datastructure/list.html#Equal","258":"/api/packages/datastructure/list.html#IsEmpty","259":"/api/packages/datastructure/list.html#Clear","260":"/api/packages/datastructure/list.html#Clone","261":"/api/packages/datastructure/list.html#Merge","262":"/api/packages/datastructure/list.html#Size","263":"/api/packages/datastructure/list.html#Cap","264":"/api/packages/datastructure/list.html#Swap","265":"/api/packages/datastructure/list.html#Reverse","266":"/api/packages/datastructure/list.html#Unique","267":"/api/packages/datastructure/list.html#Union","268":"/api/packages/datastructure/list.html#Intersection","269":"/api/packages/datastructure/list.html#Difference","270":"/api/packages/datastructure/list.html#SymmetricDifference","271":"/api/packages/datastructure/list.html#RetainAll","272":"/api/packages/datastructure/list.html#DeleteAll","273":"/api/packages/datastructure/list.html#ForEach","274":"/api/packages/datastructure/list.html#Iterator","275":"/api/packages/datastructure/list.html#ListToMap","276":"/api/packages/datastructure/list.html#SubList","277":"/api/packages/datastructure/list.html#DeleteIf","278":"/api/packages/datastructure/queue.html#Queue","279":"/api/packages/datastructure/queue.html#源码","280":"/api/packages/datastructure/queue.html#用法","281":"/api/packages/datastructure/queue.html#目录","282":"/api/packages/datastructure/queue.html#_1-ArrayQueue","283":"/api/packages/datastructure/queue.html#_2-LinkedQueue","284":"/api/packages/datastructure/queue.html#_3-CircularQueue","285":"/api/packages/datastructure/queue.html#_4-PriorityQueue","286":"/api/packages/datastructure/queue.html#文档","287":"/api/packages/datastructure/queue.html#_1-ArrayQueue-1","288":"/api/packages/datastructure/queue.html#NewArrayQueue","289":"/api/packages/datastructure/queue.html#Data","290":"/api/packages/datastructure/queue.html#Enqueue","291":"/api/packages/datastructure/queue.html#Dequeue","292":"/api/packages/datastructure/queue.html#Front","293":"/api/packages/datastructure/queue.html#Back","294":"/api/packages/datastructure/queue.html#Size","295":"/api/packages/datastructure/queue.html#IsEmpty","296":"/api/packages/datastructure/queue.html#IsFull","297":"/api/packages/datastructure/queue.html#Clear","298":"/api/packages/datastructure/queue.html#Contain","299":"/api/packages/datastructure/queue.html#_2-LinkedQueue-1","300":"/api/packages/datastructure/queue.html#NewLinkedQueue","301":"/api/packages/datastructure/queue.html#Data-1","302":"/api/packages/datastructure/queue.html#Enqueue-1","303":"/api/packages/datastructure/queue.html#Dequeue-1","304":"/api/packages/datastructure/queue.html#Front-1","305":"/api/packages/datastructure/queue.html#Back-1","306":"/api/packages/datastructure/queue.html#Size-1","307":"/api/packages/datastructure/queue.html#IsEmpty-1","308":"/api/packages/datastructure/queue.html#Clear-1","309":"/api/packages/datastructure/queue.html#Contain-1","310":"/api/packages/datastructure/queue.html#_3-CircularQueue-1","311":"/api/packages/datastructure/queue.html#NewCircularQueue","312":"/api/packages/datastructure/queue.html#Data-2","313":"/api/packages/datastructure/queue.html#Enqueue-2","314":"/api/packages/datastructure/queue.html#Dequeue-2","315":"/api/packages/datastructure/queue.html#Front-2","316":"/api/packages/datastructure/queue.html#Back-2","317":"/api/packages/datastructure/queue.html#Size-2","318":"/api/packages/datastructure/queue.html#IsEmpty-2","319":"/api/packages/datastructure/queue.html#IsFull-1","320":"/api/packages/datastructure/queue.html#Clear-2","321":"/api/packages/datastructure/queue.html#Contain-2","322":"/api/packages/datastructure/queue.html#_4-PriorityQueue-1","323":"/api/packages/datastructure/queue.html#NewPriorityQueue","324":"/api/packages/datastructure/queue.html#Data-3","325":"/api/packages/datastructure/queue.html#Enqueue-3","326":"/api/packages/datastructure/queue.html#Dequeue-3","327":"/api/packages/datastructure/queue.html#IsEmpty-3","328":"/api/packages/datastructure/queue.html#IsFull-2","329":"/api/packages/datastructure/queue.html#Size-3","330":"/api/packages/datastructure/set.html#Set","331":"/api/packages/datastructure/set.html#源码","332":"/api/packages/datastructure/set.html#用法","333":"/api/packages/datastructure/set.html#目录","334":"/api/packages/datastructure/set.html#文档","335":"/api/packages/datastructure/set.html#NewSet","336":"/api/packages/datastructure/set.html#NewSetFromSlice","337":"/api/packages/datastructure/set.html#Values","338":"/api/packages/datastructure/set.html#Add","339":"/api/packages/datastructure/set.html#AddIfNotExist","340":"/api/packages/datastructure/set.html#AddIfNotExistBy","341":"/api/packages/datastructure/set.html#Delete","342":"/api/packages/datastructure/set.html#Contain","343":"/api/packages/datastructure/set.html#ContainAll","344":"/api/packages/datastructure/set.html#Size","345":"/api/packages/datastructure/set.html#Clone","346":"/api/packages/datastructure/set.html#Equal","347":"/api/packages/datastructure/set.html#Iterate","348":"/api/packages/datastructure/set.html#EachWithBreak","349":"/api/packages/datastructure/set.html#IsEmpty","350":"/api/packages/datastructure/set.html#Union","351":"/api/packages/datastructure/set.html#Intersection","352":"/api/packages/datastructure/set.html#SymmetricDifference","353":"/api/packages/datastructure/set.html#Minus","354":"/api/packages/datastructure/set.html#Pop","355":"/api/packages/datastructure/stack.html#Stack","356":"/api/packages/datastructure/stack.html#源码","357":"/api/packages/datastructure/stack.html#用法","358":"/api/packages/datastructure/stack.html#目录","359":"/api/packages/datastructure/stack.html#_1-ArrayStack-数组栈-","360":"/api/packages/datastructure/stack.html#_2-LinkedStack-链表栈-","361":"/api/packages/datastructure/stack.html#文档","362":"/api/packages/datastructure/stack.html#_1-ArrayStack","363":"/api/packages/datastructure/stack.html#NewArrayStack","364":"/api/packages/datastructure/stack.html#Push","365":"/api/packages/datastructure/stack.html#Pop","366":"/api/packages/datastructure/stack.html#Peak","367":"/api/packages/datastructure/stack.html#Data","368":"/api/packages/datastructure/stack.html#Size","369":"/api/packages/datastructure/stack.html#IsEmpty","370":"/api/packages/datastructure/stack.html#Clear","371":"/api/packages/datastructure/stack.html#_2-LinkedStack","372":"/api/packages/datastructure/stack.html#NewLinkedStack","373":"/api/packages/datastructure/stack.html#Push-1","374":"/api/packages/datastructure/stack.html#Pop-1","375":"/api/packages/datastructure/stack.html#Peak-1","376":"/api/packages/datastructure/stack.html#Data-1","377":"/api/packages/datastructure/stack.html#Size-1","378":"/api/packages/datastructure/stack.html#IsEmpty-1","379":"/api/packages/datastructure/stack.html#Clear-1","380":"/api/packages/datastructure/stack.html#Print","381":"/api/packages/datastructure/tree.html#Tree","382":"/api/packages/datastructure/tree.html#源码","383":"/api/packages/datastructure/tree.html#用法","384":"/api/packages/datastructure/tree.html#目录","385":"/api/packages/datastructure/tree.html#_1-BSTree","386":"/api/packages/datastructure/tree.html#文档","387":"/api/packages/datastructure/tree.html#_1-BSTree-1","388":"/api/packages/datastructure/tree.html#NewBSTree","389":"/api/packages/datastructure/tree.html#Insert","390":"/api/packages/datastructure/tree.html#Delete","391":"/api/packages/datastructure/tree.html#PreOrderTraverse","392":"/api/packages/datastructure/tree.html#InOrderTraverse","393":"/api/packages/datastructure/tree.html#PostOrderTraverse","394":"/api/packages/datastructure/tree.html#LevelOrderTraverse","395":"/api/packages/datastructure/tree.html#Depth","396":"/api/packages/datastructure/tree.html#HasSubTree","397":"/api/packages/datastructure/tree.html#Print","398":"/api/packages/datetime.html#Datetime","399":"/api/packages/datetime.html#源码-","400":"/api/packages/datetime.html#用法-","401":"/api/packages/datetime.html#目录","402":"/api/packages/datetime.html#文档","403":"/api/packages/datetime.html#注-","404":"/api/packages/datetime.html#AddDay","405":"/api/packages/datetime.html#AddHour","406":"/api/packages/datetime.html#AddMinute","407":"/api/packages/datetime.html#AddYear","408":"/api/packages/datetime.html#BeginOfMinute","409":"/api/packages/datetime.html#BeginOfHour","410":"/api/packages/datetime.html#BeginOfDay","411":"/api/packages/datetime.html#BeginOfWeek","412":"/api/packages/datetime.html#BeginOfMonth","413":"/api/packages/datetime.html#BeginOfYear","414":"/api/packages/datetime.html#EndOfMinute","415":"/api/packages/datetime.html#EndOfHour","416":"/api/packages/datetime.html#EndOfDay","417":"/api/packages/datetime.html#EndOfWeek","418":"/api/packages/datetime.html#EndOfMonth","419":"/api/packages/datetime.html#EndOfYear","420":"/api/packages/datetime.html#GetNowDate","421":"/api/packages/datetime.html#GetNowTime","422":"/api/packages/datetime.html#GetNowDateTime","423":"/api/packages/datetime.html#GetTodayStartTime","424":"/api/packages/datetime.html#GetTodayEndTime","425":"/api/packages/datetime.html#GetZeroHourTimestamp","426":"/api/packages/datetime.html#GetNightTimestamp","427":"/api/packages/datetime.html#FormatTimeToStr","428":"/api/packages/datetime.html#FormatStrToTime","429":"/api/packages/datetime.html#NewUnixNow","430":"/api/packages/datetime.html#NewUnix","431":"/api/packages/datetime.html#NewFormat","432":"/api/packages/datetime.html#NewISO8601","433":"/api/packages/datetime.html#ToUnix","434":"/api/packages/datetime.html#ToFormat","435":"/api/packages/datetime.html#ToFormatForTpl","436":"/api/packages/datetime.html#ToIso8601","437":"/api/packages/datetime.html#IsLeapYear","438":"/api/packages/datetime.html#BetweenSeconds","439":"/api/packages/datetime.html#DayOfYear","440":"/api/packages/datetime.html#IsWeekend-已废弃-使用-Weekday-","441":"/api/packages/datetime.html#NowDateOrTime","442":"/api/packages/datetime.html#Timestamp","443":"/api/packages/datetime.html#TimestampMilli","444":"/api/packages/datetime.html#TimestampMicro","445":"/api/packages/datetime.html#TimestampNano","446":"/api/packages/fileutil.html#Fileutil","447":"/api/packages/fileutil.html#源码-","448":"/api/packages/fileutil.html#用法-","449":"/api/packages/fileutil.html#目录","450":"/api/packages/fileutil.html#文档","451":"/api/packages/fileutil.html#ClearFile","452":"/api/packages/fileutil.html#CreateFile","453":"/api/packages/fileutil.html#CreateDir","454":"/api/packages/fileutil.html#CopyFile","455":"/api/packages/fileutil.html#CurrentPath","456":"/api/packages/fileutil.html#FileMode","457":"/api/packages/fileutil.html#MiMeType","458":"/api/packages/fileutil.html#IsExist","459":"/api/packages/fileutil.html#IsLink","460":"/api/packages/fileutil.html#IsDir","461":"/api/packages/fileutil.html#ListFileNames","462":"/api/packages/fileutil.html#RemoveFile","463":"/api/packages/fileutil.html#ReadFileToString","464":"/api/packages/fileutil.html#ReadFileByLine","465":"/api/packages/fileutil.html#Zip","466":"/api/packages/fileutil.html#ZipAppendEntry","467":"/api/packages/fileutil.html#UnZip","468":"/api/packages/fileutil.html#IsZipFile","469":"/api/packages/fileutil.html#FileSize","470":"/api/packages/fileutil.html#MTime","471":"/api/packages/fileutil.html#Sha","472":"/api/packages/fileutil.html#ReadCsvFile","473":"/api/packages/fileutil.html#WriteCsvFile","474":"/api/packages/fileutil.html#WriteBytesToFile","475":"/api/packages/fileutil.html#WriteStringToFile","476":"/api/packages/formatter.html#Formatter","477":"/api/packages/formatter.html#源码-","478":"/api/packages/formatter.html#用法-","479":"/api/packages/formatter.html#目录","480":"/api/packages/formatter.html#文档","481":"/api/packages/formatter.html#Comma","482":"/api/packages/formatter.html#Pretty","483":"/api/packages/formatter.html#PrettyToWriter","484":"/api/packages/formatter.html#DecimalBytes","485":"/api/packages/formatter.html#BinaryBytes","486":"/api/packages/formatter.html#ParseDecimalBytes","487":"/api/packages/formatter.html#ParseBinaryBytes","488":"/api/packages/function.html#Function","489":"/api/packages/function.html#源码-","490":"/api/packages/function.html#用法-","491":"/api/packages/function.html#目录","492":"/api/packages/function.html#文档","493":"/api/packages/function.html#After","494":"/api/packages/function.html#Before","495":"/api/packages/function.html#CurryFn","496":"/api/packages/function.html#Compose","497":"/api/packages/function.html#Debounced","498":"/api/packages/function.html#Delay","499":"/api/packages/function.html#Schedule","500":"/api/packages/function.html#Pipeline","501":"/api/packages/function.html#Watcher","502":"/api/packages/maputil.html#Maputil","503":"/api/packages/maputil.html#源码-","504":"/api/packages/maputil.html#用法-","505":"/api/packages/maputil.html#目录-","506":"/api/packages/maputil.html#API-文档-","507":"/api/packages/maputil.html#MapTo","508":"/api/packages/maputil.html#ForEach","509":"/api/packages/maputil.html#Filter","510":"/api/packages/maputil.html#FilterByKeys","511":"/api/packages/maputil.html#FilterByValues","512":"/api/packages/maputil.html#OmitBy","513":"/api/packages/maputil.html#OmitByKeys","514":"/api/packages/maputil.html#OmitByValues","515":"/api/packages/maputil.html#Intersect","516":"/api/packages/maputil.html#Keys","517":"/api/packages/maputil.html#Merge","518":"/api/packages/maputil.html#Minus","519":"/api/packages/maputil.html#Values","520":"/api/packages/maputil.html#KeysBy","521":"/api/packages/maputil.html#ValuesBy","522":"/api/packages/maputil.html#MapKeys","523":"/api/packages/maputil.html#MapValues","524":"/api/packages/maputil.html#Entry","525":"/api/packages/maputil.html#FromEntries","526":"/api/packages/maputil.html#Transform","527":"/api/packages/maputil.html#IsDisjoint","528":"/api/packages/maputil.html#HasKey","529":"/api/packages/maputil.html#NewConcurrentMap","530":"/api/packages/maputil.html#ConcurrentMap-Set","531":"/api/packages/maputil.html#ConcurrentMap-Get","532":"/api/packages/maputil.html#ConcurrentMap-GetOrSet","533":"/api/packages/maputil.html#ConcurrentMap-Delete","534":"/api/packages/maputil.html#ConcurrentMap-GetAndDelete","535":"/api/packages/maputil.html#ConcurrentMap-Has","536":"/api/packages/maputil.html#ConcurrentMap-Range","537":"/api/packages/mathutil.html#Mathutil","538":"/api/packages/mathutil.html#源码-","539":"/api/packages/mathutil.html#用法-","540":"/api/packages/mathutil.html#目录","541":"/api/packages/mathutil.html#文档","542":"/api/packages/mathutil.html#Average","543":"/api/packages/mathutil.html#Exponent","544":"/api/packages/mathutil.html#Fibonacci","545":"/api/packages/mathutil.html#Factorial","546":"/api/packages/mathutil.html#Max","547":"/api/packages/mathutil.html#MaxBy","548":"/api/packages/mathutil.html#Min","549":"/api/packages/mathutil.html#MinBy","550":"/api/packages/mathutil.html#Percent","551":"/api/packages/mathutil.html#RoundToFloat","552":"/api/packages/mathutil.html#RoundToString","553":"/api/packages/mathutil.html#TruncRound","554":"/api/packages/mathutil.html#Range","555":"/api/packages/mathutil.html#RangeWithStep","556":"/api/packages/mathutil.html#AngleToRadian","557":"/api/packages/mathutil.html#RadianToAngle","558":"/api/packages/mathutil.html#PointDistance","559":"/api/packages/mathutil.html#IsPrime","560":"/api/packages/mathutil.html#GCD","561":"/api/packages/mathutil.html#LCM","562":"/api/packages/mathutil.html#Cos","563":"/api/packages/mathutil.html#Sin","564":"/api/packages/mathutil.html#Log","565":"/api/packages/mathutil.html#Sum","566":"/api/packages/mathutil.html#Abs","567":"/api/packages/netutil.html#Netutil","568":"/api/packages/netutil.html#源码-","569":"/api/packages/netutil.html#用法-","570":"/api/packages/netutil.html#目录","571":"/api/packages/netutil.html#文档","572":"/api/packages/netutil.html#ConvertMapToQueryString","573":"/api/packages/netutil.html#EncodeUrl","574":"/api/packages/netutil.html#GetInternalIp","575":"/api/packages/netutil.html#GetIps","576":"/api/packages/netutil.html#GetMacAddrs","577":"/api/packages/netutil.html#GetPublicIpInfo","578":"/api/packages/netutil.html#GetRequestPublicIp","579":"/api/packages/netutil.html#IsPublicIP","580":"/api/packages/netutil.html#IsInternalIP","581":"/api/packages/netutil.html#HttpRequest","582":"/api/packages/netutil.html#HttpClient","583":"/api/packages/netutil.html#SendRequest","584":"/api/packages/netutil.html#DecodeResponse","585":"/api/packages/netutil.html#StructToUrlValues","586":"/api/packages/netutil.html#HttpGet","587":"/api/packages/netutil.html#HttpPost","588":"/api/packages/netutil.html#HttpPut","589":"/api/packages/netutil.html#HttpDelete","590":"/api/packages/netutil.html#HttpPatch","591":"/api/packages/netutil.html#ParseHttpResponse","592":"/api/packages/netutil.html#DownloadFile","593":"/api/packages/netutil.html#UploadFile","594":"/api/packages/netutil.html#IsPingConnected","595":"/api/packages/netutil.html#IsTelnetConnected","596":"/api/packages/pointer.html#Pointer","597":"/api/packages/pointer.html#源码-","598":"/api/packages/pointer.html#用法-","599":"/api/packages/pointer.html#目录","600":"/api/packages/pointer.html#文档","601":"/api/packages/pointer.html#Of","602":"/api/packages/pointer.html#Unwrap","603":"/api/packages/pointer.html#ExtractPointer","604":"/api/packages/pointer.html#UnwarpOr","605":"/api/packages/pointer.html#UnwarpOrDefault","606":"/api/packages/random.html#Random","607":"/api/packages/random.html#源码-","608":"/api/packages/random.html#用法-","609":"/api/packages/random.html#目录","610":"/api/packages/random.html#文档","611":"/api/packages/random.html#RandBytes","612":"/api/packages/random.html#RandInt","613":"/api/packages/random.html#RandString","614":"/api/packages/random.html#RandUpper","615":"/api/packages/random.html#RandLower","616":"/api/packages/random.html#RandNumeral","617":"/api/packages/random.html#RandNumeralOrLetter","618":"/api/packages/random.html#UUIdV4","619":"/api/packages/random.html#RandUniqueIntSlice","620":"/api/packages/retry.html#Retry","621":"/api/packages/retry.html#源码-","622":"/api/packages/retry.html#用法-","623":"/api/packages/retry.html#目录","624":"/api/packages/retry.html#文档","625":"/api/packages/retry.html#Context","626":"/api/packages/retry.html#RetryFunc","627":"/api/packages/retry.html#RetryTimes","628":"/api/packages/retry.html#RetryDuration","629":"/api/packages/retry.html#Retry-1","630":"/api/packages/slice.html#Slice","631":"/api/packages/slice.html#源码-","632":"/api/packages/slice.html#用法-","633":"/api/packages/slice.html#目录","634":"/api/packages/slice.html#文档","635":"/api/packages/slice.html#AppendIfAbsent","636":"/api/packages/slice.html#Contain","637":"/api/packages/slice.html#ContainBy","638":"/api/packages/slice.html#ContainSubSlice","639":"/api/packages/slice.html#Chunk","640":"/api/packages/slice.html#Compact","641":"/api/packages/slice.html#Concat","642":"/api/packages/slice.html#Count","643":"/api/packages/slice.html#CountBy","644":"/api/packages/slice.html#Difference","645":"/api/packages/slice.html#DifferenceBy","646":"/api/packages/slice.html#DifferenceWith","647":"/api/packages/slice.html#DeleteAt","648":"/api/packages/slice.html#Drop","649":"/api/packages/slice.html#DropRight","650":"/api/packages/slice.html#DropWhile","651":"/api/packages/slice.html#DropRightWhile","652":"/api/packages/slice.html#Every","653":"/api/packages/slice.html#Equal","654":"/api/packages/slice.html#EqualWith","655":"/api/packages/slice.html#Filter","656":"/api/packages/slice.html#Find-废弃-使用-FindBy-","657":"/api/packages/slice.html#FindBy","658":"/api/packages/slice.html#FindLast-废弃-使用-FindLastBy-","659":"/api/packages/slice.html#FindLastBy","660":"/api/packages/slice.html#Flatten","661":"/api/packages/slice.html#FlattenDeep","662":"/api/packages/slice.html#ForEach","663":"/api/packages/slice.html#ForEachWithBreak","664":"/api/packages/slice.html#GroupBy","665":"/api/packages/slice.html#GroupWith","666":"/api/packages/slice.html#IntSlice-已弃用-使用-go1-18-泛型代替-","667":"/api/packages/slice.html#InterfaceSlice-已弃用-使用-go1-18-泛型代替-","668":"/api/packages/slice.html#Intersection","669":"/api/packages/slice.html#InsertAt","670":"/api/packages/slice.html#IndexOf","671":"/api/packages/slice.html#LastIndexOf","672":"/api/packages/slice.html#Map","673":"/api/packages/slice.html#FilterMap","674":"/api/packages/slice.html#FlatMap","675":"/api/packages/slice.html#Merge","676":"/api/packages/slice.html#Reverse","677":"/api/packages/slice.html#Reduce","678":"/api/packages/slice.html#ReduceBy","679":"/api/packages/slice.html#ReduceRight","680":"/api/packages/slice.html#Replace","681":"/api/packages/slice.html#ReplaceAll","682":"/api/packages/slice.html#Repeat","683":"/api/packages/slice.html#Shuffle","684":"/api/packages/slice.html#IsAscending","685":"/api/packages/slice.html#IsDescending","686":"/api/packages/slice.html#IsSorted","687":"/api/packages/slice.html#IsSortedByKey","688":"/api/packages/slice.html#Sort","689":"/api/packages/slice.html#SortBy","690":"/api/packages/slice.html#SortByField-已弃用-请使用-Sort-或-SortBy-代替该方法-","691":"/api/packages/slice.html#Some","692":"/api/packages/slice.html#StringSlice-已弃用-使用-go1-18-泛型代替-","693":"/api/packages/slice.html#SymmetricDifference","694":"/api/packages/slice.html#ToSlice","695":"/api/packages/slice.html#ToSlicePointer","696":"/api/packages/slice.html#Unique","697":"/api/packages/slice.html#UniqueBy","698":"/api/packages/slice.html#Union","699":"/api/packages/slice.html#UnionBy","700":"/api/packages/slice.html#UpdateAt","701":"/api/packages/slice.html#Without","702":"/api/packages/slice.html#KeyBy","703":"/api/packages/slice.html#Join","704":"/api/packages/stream.html#Stream","705":"/api/packages/stream.html#源码-","706":"/api/packages/stream.html#用法-","707":"/api/packages/stream.html#目录","708":"/api/packages/stream.html#文档","709":"/api/packages/stream.html#Of","710":"/api/packages/stream.html#FromSlice","711":"/api/packages/stream.html#FromChannel","712":"/api/packages/stream.html#FromRange","713":"/api/packages/stream.html#Generate","714":"/api/packages/stream.html#Concat","715":"/api/packages/stream.html#Distinct","716":"/api/packages/stream.html#Filter","717":"/api/packages/stream.html#Map","718":"/api/packages/stream.html#Peek","719":"/api/packages/stream.html#Skip","720":"/api/packages/stream.html#Limit","721":"/api/packages/stream.html#Reverse","722":"/api/packages/stream.html#Range","723":"/api/packages/stream.html#Sorted","724":"/api/packages/stream.html#ForEach","725":"/api/packages/stream.html#Reduce","726":"/api/packages/stream.html#FindFirst","727":"/api/packages/stream.html#FindLast","728":"/api/packages/stream.html#Max","729":"/api/packages/stream.html#Min","730":"/api/packages/stream.html#AllMatch","731":"/api/packages/stream.html#AnyMatch","732":"/api/packages/stream.html#NoneMatch","733":"/api/packages/stream.html#Count","734":"/api/packages/stream.html#ToSlice","735":"/api/packages/struct.html#Structs","736":"/api/packages/struct.html#源码-","737":"/api/packages/struct.html#用法-","738":"/api/packages/struct.html#目录-","739":"/api/packages/struct.html#API-文档-","740":"/api/packages/struct.html#New","741":"/api/packages/struct.html#ToMap","742":"/api/packages/struct.html#Fields","743":"/api/packages/struct.html#Field","744":"/api/packages/struct.html#IsStruct","745":"/api/packages/struct.html#Tag","746":"/api/packages/struct.html#Value","747":"/api/packages/struct.html#IsEmbedded","748":"/api/packages/struct.html#IsExported","749":"/api/packages/struct.html#IsZero","750":"/api/packages/struct.html#Name","751":"/api/packages/struct.html#Kind","752":"/api/packages/struct.html#IsSlice","753":"/api/packages/strutil.html#Strutil","754":"/api/packages/strutil.html#源码-","755":"/api/packages/strutil.html#用法-","756":"/api/packages/strutil.html#目录","757":"/api/packages/strutil.html#文档","758":"/api/packages/strutil.html#After","759":"/api/packages/strutil.html#AfterLast","760":"/api/packages/strutil.html#Before","761":"/api/packages/strutil.html#BeforeLast","762":"/api/packages/strutil.html#CamelCase","763":"/api/packages/strutil.html#KebabCase","764":"/api/packages/strutil.html#UpperKebabCase","765":"/api/packages/strutil.html#Capitalize","766":"/api/packages/strutil.html#IsString","767":"/api/packages/strutil.html#LowerFirst","768":"/api/packages/strutil.html#UpperFirst","769":"/api/packages/strutil.html#Pad","770":"/api/packages/strutil.html#PadEnd","771":"/api/packages/strutil.html#PadStart","772":"/api/packages/strutil.html#Reverse","773":"/api/packages/strutil.html#SnakeCase","774":"/api/packages/strutil.html#UpperSnakeCase","775":"/api/packages/strutil.html#SplitEx","776":"/api/packages/strutil.html#Substring","777":"/api/packages/strutil.html#Wrap","778":"/api/packages/strutil.html#Unwrap","779":"/api/packages/strutil.html#SplitWords","780":"/api/packages/strutil.html#WordCount","781":"/api/packages/strutil.html#RemoveNonPrintable","782":"/api/packages/strutil.html#StringToBytes","783":"/api/packages/strutil.html#BytesToString","784":"/api/packages/strutil.html#IsBlank","785":"/api/packages/strutil.html#HasPrefixAny","786":"/api/packages/strutil.html#HasSuffixAny","787":"/api/packages/strutil.html#IndexOffset","788":"/api/packages/strutil.html#ReplaceWithMap","789":"/api/packages/strutil.html#Trim","790":"/api/packages/strutil.html#SplitAndTrim","791":"/api/packages/strutil.html#HideString","792":"/api/packages/strutil.html#ContainsAll","793":"/api/packages/strutil.html#ContainsAny","794":"/api/packages/strutil.html#RemoveWhiteSpace","795":"/api/packages/system.html#System","796":"/api/packages/system.html#源码-","797":"/api/packages/system.html#用法-","798":"/api/packages/system.html#目录","799":"/api/packages/system.html#文档","800":"/api/packages/system.html#IsWindows","801":"/api/packages/system.html#IsLinux","802":"/api/packages/system.html#IsMac","803":"/api/packages/system.html#GetOsEnv","804":"/api/packages/system.html#SetOsEnv","805":"/api/packages/system.html#RemoveOsEnv","806":"/api/packages/system.html#CompareOsEnv","807":"/api/packages/system.html#ExecCommand","808":"/api/packages/system.html#GetOsBits","809":"/api/packages/tuple.html#Tuple","810":"/api/packages/tuple.html#源码-","811":"/api/packages/tuple.html#用法-","812":"/api/packages/tuple.html#目录","813":"/api/packages/tuple.html#文档","814":"/api/packages/tuple.html#Tuple2","815":"/api/packages/tuple.html#Tuple2-Unbox","816":"/api/packages/tuple.html#Zip2","817":"/api/packages/tuple.html#Unzip2","818":"/api/packages/tuple.html#Tuple3","819":"/api/packages/tuple.html#Tuple3-Unbox","820":"/api/packages/tuple.html#Zip3","821":"/api/packages/tuple.html#Unzip3","822":"/api/packages/tuple.html#Tuple4","823":"/api/packages/tuple.html#Tuple4-Unbox","824":"/api/packages/tuple.html#Zip4","825":"/api/packages/tuple.html#Unzip4","826":"/api/packages/tuple.html#Tuple5","827":"/api/packages/tuple.html#Tuple5-Unbox","828":"/api/packages/tuple.html#Zip5","829":"/api/packages/tuple.html#Unzip5","830":"/api/packages/tuple.html#Tuple6","831":"/api/packages/tuple.html#Tuple6-Unbox","832":"/api/packages/tuple.html#Zip6","833":"/api/packages/tuple.html#Unzip6","834":"/api/packages/tuple.html#Tuple7","835":"/api/packages/tuple.html#Tuple7-Unbox","836":"/api/packages/tuple.html#Zip7","837":"/api/packages/tuple.html#Unzip7","838":"/api/packages/tuple.html#Tuple8","839":"/api/packages/tuple.html#Tuple8-Unbox","840":"/api/packages/tuple.html#Zip8","841":"/api/packages/tuple.html#Unzip8","842":"/api/packages/tuple.html#Tuple9","843":"/api/packages/tuple.html#Tuple9-Unbox","844":"/api/packages/tuple.html#Zip9","845":"/api/packages/tuple.html#Unzip9","846":"/api/packages/tuple.html#Tuple10","847":"/api/packages/tuple.html#Tuple10-Unbox","848":"/api/packages/tuple.html#Zip10","849":"/api/packages/tuple.html#Unzip10","850":"/api/packages/validator.html#Validator","851":"/api/packages/validator.html#源码-","852":"/api/packages/validator.html#用法-","853":"/api/packages/validator.html#目录-","854":"/api/packages/validator.html#文档","855":"/api/packages/validator.html#ContainChinese","856":"/api/packages/validator.html#ContainLetter","857":"/api/packages/validator.html#ContainLower","858":"/api/packages/validator.html#ContainUpper","859":"/api/packages/validator.html#IsAlpha","860":"/api/packages/validator.html#IsAllUpper","861":"/api/packages/validator.html#IsAllLower","862":"/api/packages/validator.html#IsASCII","863":"/api/packages/validator.html#IsBase64","864":"/api/packages/validator.html#IsChineseMobile","865":"/api/packages/validator.html#IsChineseIdNum","866":"/api/packages/validator.html#IsChinesePhone","867":"/api/packages/validator.html#IsCreditCard","868":"/api/packages/validator.html#IsDns","869":"/api/packages/validator.html#IsEmail","870":"/api/packages/validator.html#IsEmptyString","871":"/api/packages/validator.html#IsInt","872":"/api/packages/validator.html#IsFloat","873":"/api/packages/validator.html#IsNumber","874":"/api/packages/validator.html#IsIntStr","875":"/api/packages/validator.html#IsFloatStr","876":"/api/packages/validator.html#IsNumberStr","877":"/api/packages/validator.html#IsJSON","878":"/api/packages/validator.html#IsRegexMatch","879":"/api/packages/validator.html#IsIp","880":"/api/packages/validator.html#IsIpV4","881":"/api/packages/validator.html#IsIpV6","882":"/api/packages/validator.html#IsStrongPassword","883":"/api/packages/validator.html#IsUrl","884":"/api/packages/validator.html#IsWeakPassword","885":"/api/packages/validator.html#IsZeroValue","886":"/api/packages/validator.html#IsGBK","887":"/api/packages/validator.html#IsPrintable","888":"/api/packages/xerror.html#Xerror","889":"/api/packages/xerror.html#源码-","890":"/api/packages/xerror.html#用法-","891":"/api/packages/xerror.html#目录","892":"/api/packages/xerror.html#文档","893":"/api/packages/xerror.html#New","894":"/api/packages/xerror.html#Wrap","895":"/api/packages/xerror.html#Unwrap","896":"/api/packages/xerror.html#XError-Wrap","897":"/api/packages/xerror.html#XError-Unwrap","898":"/api/packages/xerror.html#XError-With","899":"/api/packages/xerror.html#XError-Id","900":"/api/packages/xerror.html#XError-Is","901":"/api/packages/xerror.html#XError-Values","902":"/api/packages/xerror.html#XError-StackTrace","903":"/api/packages/xerror.html#XError-Info","904":"/api/packages/xerror.html#XError-Error","905":"/api/packages/xerror.html#TryUnwrap","906":"/guide/getting_started.html#安装","907":"/guide/getting_started.html#用法","908":"/guide/getting_started.html#示例","909":"/guide/getting_started.html#More","910":"/guide/introduction.html#lancet是什么-","911":"/guide/introduction.html#为什么选择lancet-"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,46],"1":[1,1,6],"2":[1,1,15],"3":[1,1,11],"4":[1,1,13],"5":[1,1,1],"6":[1,2,56],"7":[1,2,73],"8":[1,2,56],"9":[1,2,56],"10":[1,2,56],"11":[1,2,56],"12":[1,2,56],"13":[1,2,58],"14":[1,2,68],"15":[1,2,68],"16":[1,2,49],"17":[1,2,54],"18":[1,1,2],"19":[2,1,12],"20":[2,1,11],"21":[1,1,8],"22":[1,1,1],"23":[1,2,48],"24":[1,2,40],"25":[1,2,48],"26":[1,2,50],"27":[1,2,48],"28":[1,2,49],"29":[1,2,56],"30":[1,1,6],"31":[2,1,12],"32":[2,1,11],"33":[1,1,1],"34":[1,2,11],"35":[1,1,1],"36":[1,2,1],"37":[1,2,29],"38":[1,2,58],"39":[1,2,53],"40":[1,2,45],"41":[1,2,50],"42":[1,2,51],"43":[1,2,54],"44":[1,2,49],"45":[1,2,55],"46":[1,2,50],"47":[1,1,5],"48":[2,1,11],"49":[2,1,11],"50":[1,1,9],"51":[1,1,1],"52":[1,2,58],"53":[1,2,34],"54":[1,2,34],"55":[1,2,35],"56":[1,2,33],"57":[1,2,34],"58":[1,2,35],"59":[1,2,40],"60":[1,1,3],"61":[2,1,11],"62":[2,1,11],"63":[1,1,22],"64":[1,1,1],"65":[1,2,37],"66":[1,2,38],"67":[1,2,45],"68":[1,2,36],"69":[1,2,37],"70":[1,2,38],"71":[1,2,49],"72":[1,2,48],"73":[1,2,46],"74":[1,2,48],"75":[1,2,30],"76":[1,2,56],"77":[1,2,45],"78":[1,2,48],"79":[1,2,37],"80":[1,2,48],"81":[1,2,67],"82":[1,2,90],"83":[1,2,40],"84":[1,2,35],"85":[1,2,35],"86":[1,1,10],"87":[2,1,13],"88":[2,1,11],"89":[1,1,43],"90":[1,1,1],"91":[1,2,39],"92":[1,2,39],"93":[1,2,39],"94":[1,2,39],"95":[1,2,39],"96":[1,2,39],"97":[1,2,39],"98":[1,2,39],"99":[1,2,40],"100":[1,2,30],"101":[1,2,30],"102":[1,2,36],"103":[1,2,36],"104":[1,2,36],"105":[1,2,36],"106":[1,2,36],"107":[1,2,36],"108":[1,2,36],"109":[1,2,36],"110":[1,2,36],"111":[1,2,33],"112":[1,2,34],"113":[1,2,33],"114":[1,2,35],"115":[1,2,33],"116":[1,2,34],"117":[1,2,33],"118":[1,2,41],"119":[1,2,30],"120":[1,2,33],"121":[1,2,35],"122":[1,2,35],"123":[1,2,27],"124":[1,2,30],"125":[1,2,33],"126":[1,2,30],"127":[1,2,33],"128":[1,2,30],"129":[1,2,34],"130":[1,2,38],"131":[1,2,43],"132":[1,2,43],"133":[1,1,14],"134":[1,1,13],"135":[1,1,11],"136":[1,1,19],"137":[1,1,1],"138":[1,2,14],"139":[1,3,24],"140":[1,2,10],"141":[1,3,24],"142":[1,2,10],"143":[1,3,27],"144":[1,2,14],"145":[1,3,26],"146":[1,2,1],"147":[1,2,12],"148":[1,3,24],"149":[1,2,13],"150":[1,3,26],"151":[1,2,11],"152":[1,3,23],"153":[1,2,11],"154":[1,3,24],"155":[1,2,10],"156":[1,3,24],"157":[1,2,10],"158":[1,3,28],"159":[1,2,10],"160":[1,3,28],"161":[1,2,12],"162":[1,3,30],"163":[1,2,13],"164":[1,3,29],"165":[1,2,13],"166":[1,3,30],"167":[1,2,11],"168":[1,3,27],"169":[1,2,18],"170":[1,3,32],"171":[1,2,12],"172":[1,3,31],"173":[1,1,3],"174":[1,1,12],"175":[1,1,12],"176":[1,1,10],"177":[2,1,1],"178":[1,3,31],"179":[1,3,32],"180":[1,3,33],"181":[1,3,36],"182":[1,3,35],"183":[1,3,37],"184":[1,3,39],"185":[1,3,39],"186":[1,3,39],"187":[1,1,3],"188":[1,1,13],"189":[1,1,12],"190":[1,1,7],"191":[1,1,1],"192":[2,2,3],"193":[1,2,54],"194":[1,2,69],"195":[1,2,74],"196":[1,2,74],"197":[1,2,69],"198":[1,2,62],"199":[1,2,68],"200":[1,1,3],"201":[1,1,14],"202":[1,1,12],"203":[1,1,1],"204":[2,2,16],"205":[2,2,15],"206":[1,1,1],"207":[2,2,3],"208":[1,2,35],"209":[1,2,33],"210":[1,2,39],"211":[1,2,33],"212":[1,2,33],"213":[1,2,36],"214":[1,2,34],"215":[1,2,33],"216":[1,2,34],"217":[1,2,33],"218":[1,2,35],"219":[1,2,33],"220":[1,2,36],"221":[1,2,33],"222":[1,2,41],"223":[2,2,5],"224":[1,2,36],"225":[1,2,33],"226":[1,2,39],"227":[1,2,33],"228":[1,2,33],"229":[1,2,36],"230":[1,2,34],"231":[1,2,33],"232":[1,2,33],"233":[1,2,35],"234":[1,2,33],"235":[1,2,36],"236":[1,2,33],"237":[1,2,32],"238":[1,1,3],"239":[1,1,12],"240":[1,1,11],"241":[1,1,36],"242":[1,1,1],"243":[1,2,34],"244":[1,2,38],"245":[1,2,35],"246":[1,2,38],"247":[1,2,36],"248":[1,2,37],"249":[1,2,41],"250":[1,2,41],"251":[1,2,35],"252":[1,2,37],"253":[1,2,37],"254":[1,2,38],"255":[1,2,40],"256":[1,2,40],"257":[1,2,43],"258":[1,2,37],"259":[1,2,34],"260":[1,2,34],"261":[1,2,40],"262":[1,2,34],"263":[1,2,34],"264":[1,2,37],"265":[1,2,34],"266":[1,2,34],"267":[1,2,40],"268":[1,2,39],"269":[1,2,38],"270":[1,2,38],"271":[1,2,41],"272":[1,2,41],"273":[1,2,39],"274":[1,2,42],"275":[1,2,45],"276":[1,2,40],"277":[1,2,43],"278":[1,1,7],"279":[1,1,16],"280":[1,1,12],"281":[1,1,1],"282":[2,2,12],"283":[2,2,11],"284":[2,2,12],"285":[2,2,8],"286":[1,1,1],"287":[2,2,2],"288":[1,2,38],"289":[1,2,30],"290":[1,2,36],"291":[1,2,35],"292":[1,2,35],"293":[1,2,35],"294":[1,2,34],"295":[1,2,37],"296":[1,2,36],"297":[1,2,35],"298":[1,2,39],"299":[2,2,2],"300":[1,2,37],"301":[1,2,29],"302":[1,2,34],"303":[1,2,35],"304":[1,2,35],"305":[1,2,35],"306":[1,2,34],"307":[1,2,37],"308":[1,2,35],"309":[1,2,39],"310":[2,2,2],"311":[1,2,37],"312":[1,2,30],"313":[1,2,36],"314":[1,2,36],"315":[1,2,35],"316":[1,2,35],"317":[1,2,34],"318":[1,2,37],"319":[1,2,36],"320":[1,2,35],"321":[1,2,39],"322":[2,2,2],"323":[1,2,42],"324":[1,2,30],"325":[1,2,69],"326":[1,2,71],"327":[1,2,62],"328":[1,2,62],"329":[1,2,62],"330":[1,1,5],"331":[1,1,12],"332":[1,1,12],"333":[1,1,19],"334":[1,1,1],"335":[1,2,36],"336":[1,2,33],"337":[1,2,33],"338":[1,2,34],"339":[1,2,46],"340":[1,2,51],"341":[1,2,35],"342":[1,2,39],"343":[1,2,39],"344":[1,2,33],"345":[1,2,36],"346":[1,2,40],"347":[1,2,37],"348":[1,2,48],"349":[1,2,36],"350":[1,2,37],"351":[1,2,37],"352":[1,2,39],"353":[1,2,40],"354":[1,2,37],"355":[1,1,6],"356":[1,1,14],"357":[1,1,12],"358":[1,1,1],"359":[4,2,9],"360":[4,2,10],"361":[1,1,1],"362":[2,2,2],"363":[1,2,32],"364":[1,2,34],"365":[1,2,38],"366":[1,2,38],"367":[1,2,34],"368":[1,2,34],"369":[1,2,37],"370":[1,2,35],"371":[2,2,2],"372":[1,2,35],"373":[1,2,34],"374":[1,2,38],"375":[1,2,38],"376":[1,2,34],"377":[1,2,34],"378":[1,2,37],"379":[1,2,35],"380":[1,2,40],"381":[1,1,4],"382":[1,1,13],"383":[1,1,12],"384":[1,1,1],"385":[2,2,11],"386":[1,1,1],"387":[2,1,13],"388":[1,3,60],"389":[1,3,59],"390":[1,3,60],"391":[1,3,59],"392":[1,3,59],"393":[1,3,59],"394":[1,3,59],"395":[1,3,59],"396":[1,3,64],"397":[1,3,58],"398":[1,1,5],"399":[2,1,11],"400":[2,1,11],"401":[1,1,43],"402":[1,1,1],"403":[2,1,11],"404":[1,3,40],"405":[1,3,40],"406":[1,3,40],"407":[1,3,40],"408":[1,3,43],"409":[1,3,43],"410":[1,3,43],"411":[1,3,46],"412":[1,3,42],"413":[1,3,42],"414":[1,3,44],"415":[1,3,44],"416":[1,3,45],"417":[1,3,48],"418":[1,3,45],"419":[1,3,45],"420":[1,3,34],"421":[1,3,34],"422":[1,3,39],"423":[1,3,35],"424":[1,3,36],"425":[1,3,31],"426":[1,3,32],"427":[1,3,53],"428":[1,3,52],"429":[1,3,32],"430":[1,3,32],"431":[1,3,46],"432":[1,3,42],"433":[1,3,31],"434":[1,3,42],"435":[1,3,42],"436":[1,3,40],"437":[1,3,34],"438":[1,3,39],"439":[1,3,43],"440":[6,3,45],"441":[1,3,44],"442":[1,3,30],"443":[1,3,30],"444":[1,3,30],"445":[1,3,30],"446":[1,1,3],"447":[2,1,12],"448":[2,1,11],"449":[1,1,26],"450":[1,1,1],"451":[1,2,32],"452":[1,2,32],"453":[1,2,34],"454":[1,2,35],"455":[1,2,26],"456":[1,2,33],"457":[1,2,41],"458":[1,2,32],"459":[1,2,31],"460":[1,2,32],"461":[1,2,27],"462":[1,2,32],"463":[1,2,40],"464":[1,2,44],"465":[1,2,35],"466":[1,2,34],"467":[1,2,36],"468":[1,2,30],"469":[1,2,37],"470":[1,2,39],"471":[1,2,47],"472":[1,2,43],"473":[1,2,58],"474":[1,2,44],"475":[1,2,46],"476":[1,1,3],"477":[2,1,12],"478":[2,1,11],"479":[1,1,8],"480":[1,1,1],"481":[1,2,50],"482":[1,2,37],"483":[1,2,54],"484":[1,2,47],"485":[1,2,46],"486":[1,2,40],"487":[1,2,40],"488":[1,1,4],"489":[2,1,12],"490":[2,1,11],"491":[1,1,10],"492":[1,1,1],"493":[1,2,35],"494":[1,2,37],"495":[1,2,45],"496":[1,2,42],"497":[1,2,41],"498":[1,2,37],"499":[1,2,43],"500":[1,2,40],"501":[1,2,55],"502":[1,1,5],"503":[2,1,12],"504":[2,1,11],"505":[2,1,32],"506":[3,1,1],"507":[1,4,64],"508":[1,4,47],"509":[1,4,55],"510":[1,4,47],"511":[1,4,46],"512":[1,4,55],"513":[1,4,48],"514":[1,4,47],"515":[1,4,50],"516":[1,4,45],"517":[1,4,44],"518":[1,4,49],"519":[1,4,44],"520":[1,4,49],"521":[1,4,51],"522":[1,4,49],"523":[1,4,54],"524":[1,4,52],"525":[1,4,45],"526":[1,4,50],"527":[1,4,50],"528":[1,4,51],"529":[1,4,43],"530":[2,4,67],"531":[2,4,69],"532":[2,4,66],"533":[2,4,53],"534":[2,4,62],"535":[2,4,58],"536":[2,4,57],"537":[1,1,3],"538":[2,1,11],"539":[2,1,11],"540":[1,1,26],"541":[1,1,1],"542":[1,2,40],"543":[1,2,37],"544":[1,2,35],"545":[1,2,34],"546":[1,2,37],"547":[1,2,42],"548":[1,2,37],"549":[1,2,42],"550":[1,2,44],"551":[1,2,40],"552":[1,2,42],"553":[1,2,39],"554":[1,2,43],"555":[1,2,45],"556":[1,2,39],"557":[1,2,37],"558":[1,2,34],"559":[1,2,37],"560":[1,2,38],"561":[1,2,38],"562":[1,2,43],"563":[1,2,43],"564":[1,2,39],"565":[1,2,38],"566":[1,2,42],"567":[1,1,8],"568":[2,1,13],"569":[2,1,11],"570":[1,1,25],"571":[1,1,1],"572":[1,2,42],"573":[1,2,42],"574":[1,2,34],"575":[1,2,32],"576":[1,2,40],"577":[1,2,59],"578":[1,2,43],"579":[1,2,43],"580":[1,2,43],"581":[1,2,56],"582":[1,2,52],"583":[1,2,71],"584":[1,2,74],"585":[1,2,56],"586":[1,2,68],"587":[1,2,80],"588":[1,2,85],"589":[1,2,64],"590":[1,2,85],"591":[1,2,68],"592":[1,2,36],"593":[1,2,36],"594":[1,2,35],"595":[1,2,37],"596":[1,1,3],"597":[2,1,11],"598":[2,1,11],"599":[1,1,6],"600":[1,1,1],"601":[1,2,32],"602":[1,2,35],"603":[1,2,34],"604":[1,2,55],"605":[1,2,53],"606":[1,1,7],"607":[2,1,11],"608":[2,1,11],"609":[1,1,10],"610":[1,1,1],"611":[1,2,29],"612":[1,2,31],"613":[1,2,34],"614":[1,2,31],"615":[1,2,30],"616":[1,2,30],"617":[1,2,31],"618":[1,2,31],"619":[1,2,35],"620":[1,1,5],"621":[2,1,11],"622":[2,1,11],"623":[1,1,6],"624":[1,1,1],"625":[1,2,43],"626":[1,2,47],"627":[1,2,50],"628":[1,2,47],"629":[1,2,51],"630":[1,1,3],"631":[2,1,11],"632":[2,1,11],"633":[1,1,70],"634":[1,1,1],"635":[1,2,34],"636":[1,2,41],"637":[1,2,55],"638":[1,2,37],"639":[1,2,45],"640":[1,2,44],"641":[1,2,39],"642":[1,2,35],"643":[1,2,46],"644":[1,2,38],"645":[1,2,46],"646":[1,2,49],"647":[1,2,38],"648":[1,2,39],"649":[1,2,39],"650":[1,2,45],"651":[1,2,45],"652":[1,2,47],"653":[1,2,43],"654":[1,2,49],"655":[1,2,44],"656":[5,2,46],"657":[1,2,47],"658":[5,2,46],"659":[1,2,47],"660":[1,2,32],"661":[1,2,33],"662":[1,2,40],"663":[1,2,48],"664":[1,2,46],"665":[1,2,48],"666":[6,2,32],"667":[6,2,32],"668":[1,2,35],"669":[1,2,42],"670":[1,2,40],"671":[1,2,39],"672":[1,2,41],"673":[1,2,57],"674":[1,2,49],"675":[1,2,36],"676":[1,2,31],"677":[1,2,46],"678":[1,2,47],"679":[1,2,45],"680":[1,2,46],"681":[1,2,35],"682":[1,2,33],"683":[1,2,37],"684":[1,2,39],"685":[1,2,39],"686":[1,2,40],"687":[1,2,46],"688":[1,2,55],"689":[1,2,56],"690":[8,2,55],"691":[1,2,45],"692":[6,2,32],"693":[1,2,38],"694":[1,2,31],"695":[1,2,39],"696":[1,2,30],"697":[1,2,40],"698":[1,2,37],"699":[1,2,42],"700":[1,2,48],"701":[1,2,33],"702":[1,2,43],"703":[1,2,38],"704":[1,1,7],"705":[2,1,11],"706":[2,1,11],"707":[1,1,27],"708":[1,1,1],"709":[1,2,32],"710":[1,2,33],"711":[1,2,43],"712":[1,2,40],"713":[1,2,44],"714":[1,2,42],"715":[1,2,37],"716":[1,2,44],"717":[1,2,42],"718":[1,2,46],"719":[1,2,44],"720":[1,2,42],"721":[1,2,34],"722":[1,2,45],"723":[1,2,43],"724":[1,2,37],"725":[1,2,43],"726":[1,2,37],"727":[1,2,37],"728":[1,2,43],"729":[1,2,42],"730":[1,2,42],"731":[1,2,41],"732":[1,2,41],"733":[1,2,34],"734":[1,2,31],"735":[1,1,4],"736":[2,1,13],"737":[2,1,11],"738":[2,1,14],"739":[3,1,1],"740":[1,4,40],"741":[1,4,48],"742":[1,4,42],"743":[1,4,40],"744":[1,4,40],"745":[1,4,44],"746":[1,4,42],"747":[1,4,45],"748":[1,4,43],"749":[1,4,43],"750":[1,4,39],"751":[1,4,41],"752":[1,4,43],"753":[1,1,3],"754":[2,1,12],"755":[2,1,11],"756":[1,1,38],"757":[1,1,1],"758":[1,2,35],"759":[1,2,35],"760":[1,2,34],"761":[1,2,34],"762":[1,2,43],"763":[1,2,43],"764":[1,2,44],"765":[1,2,35],"766":[1,2,37],"767":[1,2,35],"768":[1,2,35],"769":[1,2,50],"770":[1,2,50],"771":[1,2,50],"772":[1,2,29],"773":[1,2,43],"774":[1,2,44],"775":[1,2,40],"776":[1,2,48],"777":[1,2,33],"778":[1,2,33],"779":[1,2,51],"780":[1,2,56],"781":[1,2,34],"782":[1,2,39],"783":[1,2,33],"784":[1,2,37],"785":[1,2,39],"786":[1,2,38],"787":[1,2,51],"788":[1,2,39],"789":[1,2,38],"790":[1,2,39],"791":[1,2,45],"792":[1,2,35],"793":[1,2,37],"794":[1,2,42],"795":[1,1,8],"796":[2,1,12],"797":[2,1,11],"798":[1,1,10],"799":[1,1,1],"800":[1,2,25],"801":[1,2,25],"802":[1,2,25],"803":[1,2,34],"804":[1,2,36],"805":[1,2,38],"806":[1,2,37],"807":[1,2,66],"808":[1,2,29],"809":[1,1,2],"810":[2,1,11],"811":[2,1,11],"812":[1,1,29],"813":[1,1,1],"814":[1,2,38],"815":[2,2,33],"816":[1,2,36],"817":[1,2,38],"818":[1,2,41],"819":[2,2,36],"820":[1,2,39],"821":[1,2,43],"822":[1,2,45],"823":[2,2,39],"824":[1,2,43],"825":[1,2,48],"826":[1,2,49],"827":[2,2,42],"828":[1,2,46],"829":[1,2,52],"830":[1,2,52],"831":[2,2,44],"832":[1,2,49],"833":[1,2,56],"834":[1,2,55],"835":[2,2,47],"836":[1,2,51],"837":[1,2,60],"838":[1,2,58],"839":[2,2,50],"840":[1,2,53],"841":[1,2,64],"842":[1,2,64],"843":[2,2,55],"844":[1,2,57],"845":[1,2,69],"846":[1,2,68],"847":[2,2,60],"848":[1,2,60],"849":[1,2,73],"850":[1,1,4],"851":[2,1,11],"852":[2,1,11],"853":[2,1,34],"854":[1,1,1],"855":[1,2,35],"856":[1,2,37],"857":[1,2,35],"858":[1,2,35],"859":[1,2,34],"860":[1,2,35],"861":[1,2,35],"862":[1,2,38],"863":[1,2,33],"864":[1,2,33],"865":[1,2,33],"866":[1,2,35],"867":[1,2,33],"868":[1,2,36],"869":[1,2,35],"870":[1,2,33],"871":[1,2,38],"872":[1,2,38],"873":[1,2,39],"874":[1,2,36],"875":[1,2,37],"876":[1,2,37],"877":[1,2,36],"878":[1,2,39],"879":[1,2,36],"880":[1,2,34],"881":[1,2,34],"882":[1,2,47],"883":[1,2,34],"884":[1,2,41],"885":[1,2,36],"886":[1,2,51],"887":[1,2,39],"888":[1,1,3],"889":[2,1,11],"890":[2,1,11],"891":[1,1,13],"892":[1,1,1],"893":[1,2,40],"894":[1,2,37],"895":[1,2,40],"896":[2,2,42],"897":[2,2,42],"898":[2,2,38],"899":[2,2,41],"900":[2,2,43],"901":[2,2,38],"902":[2,2,41],"903":[2,2,44],"904":[2,2,31],"905":[1,2,47],"906":[1,1,32],"907":[1,1,17],"908":[1,1,27],"909":[1,1,2],"910":[2,1,11],"911":[2,2,20]},"averageFieldLength":[1.153508771929826,1.9901315789473724,34.117324561403485],"storedFields":{"0":{"title":"API概述","titles":[]},"1":{"title":"Algorithm","titles":[]},"2":{"title":"源码","titles":["Algorithm"]},"3":{"title":"用法","titles":["Algorithm"]},"4":{"title":"目录","titles":["Algorithm"]},"5":{"title":"文档","titles":["Algorithm"]},"6":{"title":"BubbleSort","titles":["Algorithm","文档"]},"7":{"title":"InsertionSort","titles":["Algorithm","文档"]},"8":{"title":"SelectionSort","titles":["Algorithm","文档"]},"9":{"title":"ShellSort","titles":["Algorithm","文档"]},"10":{"title":"QuickSort","titles":["Algorithm","文档"]},"11":{"title":"HeapSort","titles":["Algorithm","文档"]},"12":{"title":"MergeSort","titles":["Algorithm","文档"]},"13":{"title":"CountSort","titles":["Algorithm","文档"]},"14":{"title":"BinarySearch","titles":["Algorithm","文档"]},"15":{"title":"BinaryIterativeSearch","titles":["Algorithm","文档"]},"16":{"title":"LinearSearch","titles":["Algorithm","文档"]},"17":{"title":"LRUCache","titles":["Algorithm","文档"]},"18":{"title":"Compare","titles":[]},"19":{"title":"源码:","titles":["Compare"]},"20":{"title":"用法:","titles":["Compare"]},"21":{"title":"目录","titles":["Compare"]},"22":{"title":"文档","titles":["Compare"]},"23":{"title":"Equal","titles":["Compare","文档"]},"24":{"title":"EqualValue","titles":["Compare","文档"]},"25":{"title":"LessThan","titles":["Compare","文档"]},"26":{"title":"GreaterThan","titles":["Compare","文档"]},"27":{"title":"LessOrEqual","titles":["Compare","文档"]},"28":{"title":"GreaterOrEqual","titles":["Compare","文档"]},"29":{"title":"InDelta","titles":["Compare","文档"]},"30":{"title":"Concurrency","titles":[]},"31":{"title":"源码:","titles":["Concurrency"]},"32":{"title":"用法:","titles":["Concurrency"]},"33":{"title":"目录","titles":["Concurrency"]},"34":{"title":"Channel","titles":["Concurrency","目录"]},"35":{"title":"文档","titles":["Concurrency"]},"36":{"title":"Channel","titles":["Concurrency","文档"]},"37":{"title":"NewChannel","titles":["Concurrency","文档"]},"38":{"title":"Bridge","titles":["Concurrency","文档"]},"39":{"title":"FanIn","titles":["Concurrency","文档"]},"40":{"title":"Generate","titles":["Concurrency","文档"]},"41":{"title":"Repeat","titles":["Concurrency","文档"]},"42":{"title":"RepeatFn","titles":["Concurrency","文档"]},"43":{"title":"Or","titles":["Concurrency","文档"]},"44":{"title":"OrDone","titles":["Concurrency","文档"]},"45":{"title":"Take","titles":["Concurrency","文档"]},"46":{"title":"Tee","titles":["Concurrency","文档"]},"47":{"title":"Condition","titles":[]},"48":{"title":"源码:","titles":["Condition"]},"49":{"title":"用法:","titles":["Condition"]},"50":{"title":"目录","titles":["Condition"]},"51":{"title":"文档","titles":["Condition"]},"52":{"title":"Bool","titles":["Condition","文档"]},"53":{"title":"And","titles":["Condition","文档"]},"54":{"title":"Or","titles":["Condition","文档"]},"55":{"title":"Xor","titles":["Condition","文档"]},"56":{"title":"Nor","titles":["Condition","文档"]},"57":{"title":"Xnor","titles":["Condition","文档"]},"58":{"title":"Nand","titles":["Condition","文档"]},"59":{"title":"TernaryOperator","titles":["Condition","文档"]},"60":{"title":"Convertor","titles":[]},"61":{"title":"源码:","titles":["Convertor"]},"62":{"title":"用法:","titles":["Convertor"]},"63":{"title":"目录","titles":["Convertor"]},"64":{"title":"文档","titles":["Convertor"]},"65":{"title":"ColorHexToRGB","titles":["Convertor","文档"]},"66":{"title":"ColorRGBToHex","titles":["Convertor","文档"]},"67":{"title":"ToBool","titles":["Convertor","文档"]},"68":{"title":"ToBytes","titles":["Convertor","文档"]},"69":{"title":"ToChar","titles":["Convertor","文档"]},"70":{"title":"ToChannel","titles":["Convertor","文档"]},"71":{"title":"ToFloat","titles":["Convertor","文档"]},"72":{"title":"ToInt","titles":["Convertor","文档"]},"73":{"title":"ToJson","titles":["Convertor","文档"]},"74":{"title":"ToMap","titles":["Convertor","文档"]},"75":{"title":"ToPointer","titles":["Convertor","文档"]},"76":{"title":"ToString","titles":["Convertor","文档"]},"77":{"title":"StructToMap","titles":["Convertor","文档"]},"78":{"title":"MapToSlice","titles":["Convertor","文档"]},"79":{"title":"EncodeByte","titles":["Convertor","文档"]},"80":{"title":"DecodeByte","titles":["Convertor","文档"]},"81":{"title":"DeepClone","titles":["Convertor","文档"]},"82":{"title":"CopyProperties","titles":["Convertor","文档"]},"83":{"title":"ToInterface","titles":["Convertor","文档"]},"84":{"title":"Utf8ToGbk","titles":["Convertor","文档"]},"85":{"title":"GbkToUtf8","titles":["Convertor","文档"]},"86":{"title":"Cryptor","titles":[]},"87":{"title":"源码:","titles":["Cryptor"]},"88":{"title":"用法:","titles":["Cryptor"]},"89":{"title":"目录","titles":["Cryptor"]},"90":{"title":"文档","titles":["Cryptor"]},"91":{"title":"AesEcbEncrypt","titles":["Cryptor","文档"]},"92":{"title":"AesEcbDecrypt","titles":["Cryptor","文档"]},"93":{"title":"AesCbcEncrypt","titles":["Cryptor","文档"]},"94":{"title":"AesCbcDecrypt","titles":["Cryptor","文档"]},"95":{"title":"AesCtrCrypt","titles":["Cryptor","文档"]},"96":{"title":"AesCfbEncrypt","titles":["Cryptor","文档"]},"97":{"title":"AesCfbDecrypt","titles":["Cryptor","文档"]},"98":{"title":"AesOfbEncrypt","titles":["Cryptor","文档"]},"99":{"title":"AesOfbDecrypt","titles":["Cryptor","文档"]},"100":{"title":"Base64StdEncode","titles":["Cryptor","文档"]},"101":{"title":"Base64StdDecode","titles":["Cryptor","文档"]},"102":{"title":"DesEcbEncrypt","titles":["Cryptor","文档"]},"103":{"title":"DesEcbDecrypt","titles":["Cryptor","文档"]},"104":{"title":"DesCbcEncrypt","titles":["Cryptor","文档"]},"105":{"title":"DesCbcDecrypt","titles":["Cryptor","文档"]},"106":{"title":"DesCtrCrypt","titles":["Cryptor","文档"]},"107":{"title":"DesCfbEncrypt","titles":["Cryptor","文档"]},"108":{"title":"DesCfbDecrypt","titles":["Cryptor","文档"]},"109":{"title":"DesOfbEncrypt","titles":["Cryptor","文档"]},"110":{"title":"DesOfbDecrypt","titles":["Cryptor","文档"]},"111":{"title":"HmacMd5","titles":["Cryptor","文档"]},"112":{"title":"HmacMd5WithBase64","titles":["Cryptor","文档"]},"113":{"title":"HmacSha1","titles":["Cryptor","文档"]},"114":{"title":"HmacSha1WithBase64","titles":["Cryptor","文档"]},"115":{"title":"HmacSha256","titles":["Cryptor","文档"]},"116":{"title":"HmacSha256WithBase64","titles":["Cryptor","文档"]},"117":{"title":"HmacSha512","titles":["Cryptor","文档"]},"118":{"title":"HmacSha512WithBase64","titles":["Cryptor","文档"]},"119":{"title":"Md5String","titles":["Cryptor","文档"]},"120":{"title":"Md5StringWithBase64","titles":["Cryptor","文档"]},"121":{"title":"Md5Byte","titles":["Cryptor","文档"]},"122":{"title":"Md5ByteWithBase64","titles":["Cryptor","文档"]},"123":{"title":"Md5File","titles":["Cryptor","文档"]},"124":{"title":"Sha1","titles":["Cryptor","文档"]},"125":{"title":"Sha1WithBase64","titles":["Cryptor","文档"]},"126":{"title":"Sha256","titles":["Cryptor","文档"]},"127":{"title":"Sha256WithBase64","titles":["Cryptor","文档"]},"128":{"title":"Sha512","titles":["Cryptor","文档"]},"129":{"title":"Sha512WithBase64","titles":["Cryptor","文档"]},"130":{"title":"GenerateRsaKey","titles":["Cryptor","文档"]},"131":{"title":"RsaEncrypt","titles":["Cryptor","文档"]},"132":{"title":"RsaDecrypt","titles":["Cryptor","文档"]},"133":{"title":"CopyOnWriteList","titles":[]},"134":{"title":"源码","titles":["CopyOnWriteList"]},"135":{"title":"用法","titles":["CopyOnWriteList"]},"136":{"title":"目录","titles":["CopyOnWriteList"]},"137":{"title":"文档","titles":["CopyOnWriteList"]},"138":{"title":"NewCopyOnWriteList","titles":["CopyOnWriteList","文档"]},"139":{"title":"示例","titles":["CopyOnWriteList","文档","NewCopyOnWriteList"]},"140":{"title":"Size","titles":["CopyOnWriteList","文档"]},"141":{"title":"示例","titles":["CopyOnWriteList","文档","Size"]},"142":{"title":"Get","titles":["CopyOnWriteList","文档"]},"143":{"title":"示例","titles":["CopyOnWriteList","文档","Get"]},"144":{"title":"Set","titles":["CopyOnWriteList","文档"]},"145":{"title":"示例","titles":["CopyOnWriteList","文档","Set"]},"146":{"title":"Remove","titles":["CopyOnWriteList","文档"]},"147":{"title":"IndexOf","titles":["CopyOnWriteList","文档"]},"148":{"title":"示例","titles":["CopyOnWriteList","文档","IndexOf"]},"149":{"title":"LastIndexOf","titles":["CopyOnWriteList","文档"]},"150":{"title":"示例","titles":["CopyOnWriteList","文档","LastIndexOf"]},"151":{"title":"IsEmpty","titles":["CopyOnWriteList","文档"]},"152":{"title":"示例","titles":["CopyOnWriteList","文档","IsEmpty"]},"153":{"title":"Contain","titles":["CopyOnWriteList","文档"]},"154":{"title":"示例","titles":["CopyOnWriteList","文档","Contain"]},"155":{"title":"ValueOf","titles":["CopyOnWriteList","文档"]},"156":{"title":"示例","titles":["CopyOnWriteList","文档","ValueOf"]},"157":{"title":"Add","titles":["CopyOnWriteList","文档"]},"158":{"title":"示例","titles":["CopyOnWriteList","文档","Add"]},"159":{"title":"AddAll","titles":["CopyOnWriteList","文档"]},"160":{"title":"示例","titles":["CopyOnWriteList","文档","AddAll"]},"161":{"title":"AddByIndex","titles":["CopyOnWriteList","文档"]},"162":{"title":"示例","titles":["CopyOnWriteList","文档","AddByIndex"]},"163":{"title":"DeleteAt","titles":["CopyOnWriteList","文档"]},"164":{"title":"示例","titles":["CopyOnWriteList","文档","DeleteAt"]},"165":{"title":"DeleteIf","titles":["CopyOnWriteList","文档"]},"166":{"title":"示例","titles":["CopyOnWriteList","文档","DeleteIf"]},"167":{"title":"DeleteBy","titles":["CopyOnWriteList","文档"]},"168":{"title":"示例","titles":["CopyOnWriteList","文档","DeleteBy"]},"169":{"title":"DeleteRange","titles":["CopyOnWriteList","文档"]},"170":{"title":"示例","titles":["CopyOnWriteList","文档","DeleteRange"]},"171":{"title":"Equal","titles":["CopyOnWriteList","文档"]},"172":{"title":"示例","titles":["CopyOnWriteList","文档","Equal"]},"173":{"title":"HashMap","titles":[]},"174":{"title":"源码","titles":["HashMap"]},"175":{"title":"用法","titles":["HashMap"]},"176":{"title":"目录","titles":["HashMap"]},"177":{"title":"API 文档","titles":["HashMap"]},"178":{"title":"NewHashMap","titles":["HashMap","API 文档"]},"179":{"title":"NewHashMapWithCapacity","titles":["HashMap","API 文档"]},"180":{"title":"Get","titles":["HashMap","API 文档"]},"181":{"title":"Put","titles":["HashMap","API 文档"]},"182":{"title":"Delete","titles":["HashMap","API 文档"]},"183":{"title":"Contains","titles":["HashMap","API 文档"]},"184":{"title":"Iterate","titles":["HashMap","API 文档"]},"185":{"title":"Keys","titles":["HashMap","API 文档"]},"186":{"title":"Values","titles":["HashMap","API 文档"]},"187":{"title":"Heap","titles":[]},"188":{"title":"源码","titles":["Heap"]},"189":{"title":"用法","titles":["Heap"]},"190":{"title":"目录","titles":["Heap"]},"191":{"title":"API文档","titles":["Heap"]},"192":{"title":"1. MaxHeap","titles":["Heap","API文档"]},"193":{"title":"NewMaxHeap","titles":["Heap","API文档"]},"194":{"title":"Push","titles":["Heap","API文档"]},"195":{"title":"Pop","titles":["Heap","API文档"]},"196":{"title":"Peek","titles":["Heap","API文档"]},"197":{"title":"Data","titles":["Heap","API文档"]},"198":{"title":"Size","titles":["Heap","API文档"]},"199":{"title":"PrintStructure","titles":["Heap","API文档"]},"200":{"title":"Linklist","titles":[]},"201":{"title":"源码","titles":["Linklist"]},"202":{"title":"用法","titles":["Linklist"]},"203":{"title":"目录","titles":["Linklist"]},"204":{"title":"1. SinglyLink单链表","titles":["Linklist","目录"]},"205":{"title":"2. DoublyLink双向链表","titles":["Linklist","目录"]},"206":{"title":"文档","titles":["Linklist"]},"207":{"title":"1. SinglyLink","titles":["Linklist","文档"]},"208":{"title":"NewSinglyLink","titles":["Linklist","文档"]},"209":{"title":"Values","titles":["Linklist","文档"]},"210":{"title":"InsertAt","titles":["Linklist","文档"]},"211":{"title":"InsertAtHead","titles":["Linklist","文档"]},"212":{"title":"InsertAtTail","titles":["Linklist","文档"]},"213":{"title":"DeleteAt","titles":["Linklist","文档"]},"214":{"title":"DeleteAtHead","titles":["Linklist","文档"]},"215":{"title":"DeleteAtTail","titles":["Linklist","文档"]},"216":{"title":"DeleteValue","titles":["Linklist","文档"]},"217":{"title":"Reverse","titles":["Linklist","文档"]},"218":{"title":"GetMiddleNode","titles":["Linklist","文档"]},"219":{"title":"Size","titles":["Linklist","文档"]},"220":{"title":"IsEmpty","titles":["Linklist","文档"]},"221":{"title":"Clear","titles":["Linklist","文档"]},"222":{"title":"Print","titles":["Linklist","文档"]},"223":{"title":"2. DoublyLink","titles":["Linklist","文档"]},"224":{"title":"NewDoublyLink","titles":["Linklist","文档"]},"225":{"title":"Values","titles":["Linklist","文档"]},"226":{"title":"InsertAt","titles":["Linklist","文档"]},"227":{"title":"InsertAtHead","titles":["Linklist","文档"]},"228":{"title":"InsertAtTail","titles":["Linklist","文档"]},"229":{"title":"DeleteAt","titles":["Linklist","文档"]},"230":{"title":"DeleteAtHead","titles":["Linklist","文档"]},"231":{"title":"DeleteAtTail","titles":["Linklist","文档"]},"232":{"title":"Reverse","titles":["Linklist","文档"]},"233":{"title":"GetMiddleNode","titles":["Linklist","文档"]},"234":{"title":"Size","titles":["Linklist","文档"]},"235":{"title":"IsEmpty","titles":["Linklist","文档"]},"236":{"title":"Clear","titles":["Linklist","文档"]},"237":{"title":"Print","titles":["Linklist","文档"]},"238":{"title":"List","titles":[]},"239":{"title":"源码","titles":["List"]},"240":{"title":"用法","titles":["List"]},"241":{"title":"目录","titles":["List"]},"242":{"title":"文档","titles":["List"]},"243":{"title":"NewList","titles":["List","文档"]},"244":{"title":"Contain","titles":["List","文档"]},"245":{"title":"Data","titles":["List","文档"]},"246":{"title":"ValueOf","titles":["List","文档"]},"247":{"title":"IndexOf","titles":["List","文档"]},"248":{"title":"LastIndexOf","titles":["List","文档"]},"249":{"title":"IndexOfFunc","titles":["List","文档"]},"250":{"title":"LastIndexOfFunc","titles":["List","文档"]},"251":{"title":"Push","titles":["List","文档"]},"252":{"title":"PopFirst","titles":["List","文档"]},"253":{"title":"PopFirst","titles":["List","文档"]},"254":{"title":"DeleteAt","titles":["List","文档"]},"255":{"title":"InsertAt","titles":["List","文档"]},"256":{"title":"UpdateAt","titles":["List","文档"]},"257":{"title":"Equal","titles":["List","文档"]},"258":{"title":"IsEmpty","titles":["List","文档"]},"259":{"title":"Clear","titles":["List","文档"]},"260":{"title":"Clone","titles":["List","文档"]},"261":{"title":"Merge","titles":["List","文档"]},"262":{"title":"Size","titles":["List","文档"]},"263":{"title":"Cap","titles":["List","文档"]},"264":{"title":"Swap","titles":["List","文档"]},"265":{"title":"Reverse","titles":["List","文档"]},"266":{"title":"Unique","titles":["List","文档"]},"267":{"title":"Union","titles":["List","文档"]},"268":{"title":"Intersection","titles":["List","文档"]},"269":{"title":"Difference","titles":["List","文档"]},"270":{"title":"SymmetricDifference","titles":["List","文档"]},"271":{"title":"RetainAll","titles":["List","文档"]},"272":{"title":"DeleteAll","titles":["List","文档"]},"273":{"title":"ForEach","titles":["List","文档"]},"274":{"title":"Iterator","titles":["List","文档"]},"275":{"title":"ListToMap","titles":["List","文档"]},"276":{"title":"SubList","titles":["List","文档"]},"277":{"title":"DeleteIf","titles":["List","文档"]},"278":{"title":"Queue","titles":[]},"279":{"title":"源码","titles":["Queue"]},"280":{"title":"用法","titles":["Queue"]},"281":{"title":"目录","titles":["Queue"]},"282":{"title":"1. ArrayQueue","titles":["Queue","目录"]},"283":{"title":"2. LinkedQueue","titles":["Queue","目录"]},"284":{"title":"3. CircularQueue","titles":["Queue","目录"]},"285":{"title":"4. PriorityQueue","titles":["Queue","目录"]},"286":{"title":"文档","titles":["Queue"]},"287":{"title":"1. ArrayQueue","titles":["Queue","文档"]},"288":{"title":"NewArrayQueue","titles":["Queue","文档"]},"289":{"title":"Data","titles":["Queue","文档"]},"290":{"title":"Enqueue","titles":["Queue","文档"]},"291":{"title":"Dequeue","titles":["Queue","文档"]},"292":{"title":"Front","titles":["Queue","文档"]},"293":{"title":"Back","titles":["Queue","文档"]},"294":{"title":"Size","titles":["Queue","文档"]},"295":{"title":"IsEmpty","titles":["Queue","文档"]},"296":{"title":"IsFull","titles":["Queue","文档"]},"297":{"title":"Clear","titles":["Queue","文档"]},"298":{"title":"Contain","titles":["Queue","文档"]},"299":{"title":"2. LinkedQueue","titles":["Queue","文档"]},"300":{"title":"NewLinkedQueue","titles":["Queue","文档"]},"301":{"title":"Data","titles":["Queue","文档"]},"302":{"title":"Enqueue","titles":["Queue","文档"]},"303":{"title":"Dequeue","titles":["Queue","文档"]},"304":{"title":"Front","titles":["Queue","文档"]},"305":{"title":"Back","titles":["Queue","文档"]},"306":{"title":"Size","titles":["Queue","文档"]},"307":{"title":"IsEmpty","titles":["Queue","文档"]},"308":{"title":"Clear","titles":["Queue","文档"]},"309":{"title":"Contain","titles":["Queue","文档"]},"310":{"title":"3. CircularQueue","titles":["Queue","文档"]},"311":{"title":"NewCircularQueue","titles":["Queue","文档"]},"312":{"title":"Data","titles":["Queue","文档"]},"313":{"title":"Enqueue","titles":["Queue","文档"]},"314":{"title":"Dequeue","titles":["Queue","文档"]},"315":{"title":"Front","titles":["Queue","文档"]},"316":{"title":"Back","titles":["Queue","文档"]},"317":{"title":"Size","titles":["Queue","文档"]},"318":{"title":"IsEmpty","titles":["Queue","文档"]},"319":{"title":"IsFull","titles":["Queue","文档"]},"320":{"title":"Clear","titles":["Queue","文档"]},"321":{"title":"Contain","titles":["Queue","文档"]},"322":{"title":"4. PriorityQueue","titles":["Queue","文档"]},"323":{"title":"NewPriorityQueue","titles":["Queue","文档"]},"324":{"title":"Data","titles":["Queue","文档"]},"325":{"title":"Enqueue","titles":["Queue","文档"]},"326":{"title":"Dequeue","titles":["Queue","文档"]},"327":{"title":"IsEmpty","titles":["Queue","文档"]},"328":{"title":"IsFull","titles":["Queue","文档"]},"329":{"title":"Size","titles":["Queue","文档"]},"330":{"title":"Set","titles":[]},"331":{"title":"源码","titles":["Set"]},"332":{"title":"用法","titles":["Set"]},"333":{"title":"目录","titles":["Set"]},"334":{"title":"文档","titles":["Set"]},"335":{"title":"NewSet","titles":["Set","文档"]},"336":{"title":"NewSetFromSlice","titles":["Set","文档"]},"337":{"title":"Values","titles":["Set","文档"]},"338":{"title":"Add","titles":["Set","文档"]},"339":{"title":"AddIfNotExist","titles":["Set","文档"]},"340":{"title":"AddIfNotExistBy","titles":["Set","文档"]},"341":{"title":"Delete","titles":["Set","文档"]},"342":{"title":"Contain","titles":["Set","文档"]},"343":{"title":"ContainAll","titles":["Set","文档"]},"344":{"title":"Size","titles":["Set","文档"]},"345":{"title":"Clone","titles":["Set","文档"]},"346":{"title":"Equal","titles":["Set","文档"]},"347":{"title":"Iterate","titles":["Set","文档"]},"348":{"title":"EachWithBreak","titles":["Set","文档"]},"349":{"title":"IsEmpty","titles":["Set","文档"]},"350":{"title":"Union","titles":["Set","文档"]},"351":{"title":"Intersection","titles":["Set","文档"]},"352":{"title":"SymmetricDifference","titles":["Set","文档"]},"353":{"title":"Minus","titles":["Set","文档"]},"354":{"title":"Pop","titles":["Set","文档"]},"355":{"title":"Stack","titles":[]},"356":{"title":"源码","titles":["Stack"]},"357":{"title":"用法","titles":["Stack"]},"358":{"title":"目录","titles":["Stack"]},"359":{"title":"1. ArrayStack(数组栈)","titles":["Stack","目录"]},"360":{"title":"2. LinkedStack(链表栈)","titles":["Stack","目录"]},"361":{"title":"文档","titles":["Stack"]},"362":{"title":"1. ArrayStack","titles":["Stack","文档"]},"363":{"title":"NewArrayStack","titles":["Stack","文档"]},"364":{"title":"Push","titles":["Stack","文档"]},"365":{"title":"Pop","titles":["Stack","文档"]},"366":{"title":"Peak","titles":["Stack","文档"]},"367":{"title":"Data","titles":["Stack","文档"]},"368":{"title":"Size","titles":["Stack","文档"]},"369":{"title":"IsEmpty","titles":["Stack","文档"]},"370":{"title":"Clear","titles":["Stack","文档"]},"371":{"title":"2. LinkedStack","titles":["Stack","文档"]},"372":{"title":"NewLinkedStack","titles":["Stack","文档"]},"373":{"title":"Push","titles":["Stack","文档"]},"374":{"title":"Pop","titles":["Stack","文档"]},"375":{"title":"Peak","titles":["Stack","文档"]},"376":{"title":"Data","titles":["Stack","文档"]},"377":{"title":"Size","titles":["Stack","文档"]},"378":{"title":"IsEmpty","titles":["Stack","文档"]},"379":{"title":"Clear","titles":["Stack","文档"]},"380":{"title":"Print","titles":["Stack","文档"]},"381":{"title":"Tree","titles":[]},"382":{"title":"源码","titles":["Tree"]},"383":{"title":"用法","titles":["Tree"]},"384":{"title":"目录","titles":["Tree"]},"385":{"title":"1. BSTree","titles":["Tree","目录"]},"386":{"title":"文档","titles":["Tree"]},"387":{"title":"1. BSTree","titles":["Tree"]},"388":{"title":"NewBSTree","titles":["Tree","1. BSTree"]},"389":{"title":"Insert","titles":["Tree","1. BSTree"]},"390":{"title":"Delete","titles":["Tree","1. BSTree"]},"391":{"title":"PreOrderTraverse","titles":["Tree","1. BSTree"]},"392":{"title":"InOrderTraverse","titles":["Tree","1. BSTree"]},"393":{"title":"PostOrderTraverse","titles":["Tree","1. BSTree"]},"394":{"title":"LevelOrderTraverse","titles":["Tree","1. BSTree"]},"395":{"title":"Depth","titles":["Tree","1. BSTree"]},"396":{"title":"HasSubTree","titles":["Tree","1. BSTree"]},"397":{"title":"Print","titles":["Tree","1. BSTree"]},"398":{"title":"Datetime","titles":[]},"399":{"title":"源码:","titles":["Datetime"]},"400":{"title":"用法:","titles":["Datetime"]},"401":{"title":"目录","titles":["Datetime"]},"402":{"title":"文档","titles":["Datetime"]},"403":{"title":"注:","titles":["Datetime"]},"404":{"title":"AddDay","titles":["Datetime","注:"]},"405":{"title":"AddHour","titles":["Datetime","注:"]},"406":{"title":"AddMinute","titles":["Datetime","注:"]},"407":{"title":"AddYear","titles":["Datetime","注:"]},"408":{"title":"BeginOfMinute","titles":["Datetime","注:"]},"409":{"title":"BeginOfHour","titles":["Datetime","注:"]},"410":{"title":"BeginOfDay","titles":["Datetime","注:"]},"411":{"title":"BeginOfWeek","titles":["Datetime","注:"]},"412":{"title":"BeginOfMonth","titles":["Datetime","注:"]},"413":{"title":"BeginOfYear","titles":["Datetime","注:"]},"414":{"title":"EndOfMinute","titles":["Datetime","注:"]},"415":{"title":"EndOfHour","titles":["Datetime","注:"]},"416":{"title":"EndOfDay","titles":["Datetime","注:"]},"417":{"title":"EndOfWeek","titles":["Datetime","注:"]},"418":{"title":"EndOfMonth","titles":["Datetime","注:"]},"419":{"title":"EndOfYear","titles":["Datetime","注:"]},"420":{"title":"GetNowDate","titles":["Datetime","注:"]},"421":{"title":"GetNowTime","titles":["Datetime","注:"]},"422":{"title":"GetNowDateTime","titles":["Datetime","注:"]},"423":{"title":"GetTodayStartTime","titles":["Datetime","注:"]},"424":{"title":"GetTodayEndTime","titles":["Datetime","注:"]},"425":{"title":"GetZeroHourTimestamp","titles":["Datetime","注:"]},"426":{"title":"GetNightTimestamp","titles":["Datetime","注:"]},"427":{"title":"FormatTimeToStr","titles":["Datetime","注:"]},"428":{"title":"FormatStrToTime","titles":["Datetime","注:"]},"429":{"title":"NewUnixNow","titles":["Datetime","注:"]},"430":{"title":"NewUnix","titles":["Datetime","注:"]},"431":{"title":"NewFormat","titles":["Datetime","注:"]},"432":{"title":"NewISO8601","titles":["Datetime","注:"]},"433":{"title":"ToUnix","titles":["Datetime","注:"]},"434":{"title":"ToFormat","titles":["Datetime","注:"]},"435":{"title":"ToFormatForTpl","titles":["Datetime","注:"]},"436":{"title":"ToIso8601","titles":["Datetime","注:"]},"437":{"title":"IsLeapYear","titles":["Datetime","注:"]},"438":{"title":"BetweenSeconds","titles":["Datetime","注:"]},"439":{"title":"DayOfYear","titles":["Datetime","注:"]},"440":{"title":"IsWeekend(已废弃, 使用 \'== Weekday\')","titles":["Datetime","注:"]},"441":{"title":"NowDateOrTime","titles":["Datetime","注:"]},"442":{"title":"Timestamp","titles":["Datetime","注:"]},"443":{"title":"TimestampMilli","titles":["Datetime","注:"]},"444":{"title":"TimestampMicro","titles":["Datetime","注:"]},"445":{"title":"TimestampNano","titles":["Datetime","注:"]},"446":{"title":"Fileutil","titles":[]},"447":{"title":"源码:","titles":["Fileutil"]},"448":{"title":"用法:","titles":["Fileutil"]},"449":{"title":"目录","titles":["Fileutil"]},"450":{"title":"文档","titles":["Fileutil"]},"451":{"title":"ClearFile","titles":["Fileutil","文档"]},"452":{"title":"CreateFile","titles":["Fileutil","文档"]},"453":{"title":"CreateDir","titles":["Fileutil","文档"]},"454":{"title":"CopyFile","titles":["Fileutil","文档"]},"455":{"title":"CurrentPath","titles":["Fileutil","文档"]},"456":{"title":"FileMode","titles":["Fileutil","文档"]},"457":{"title":"MiMeType","titles":["Fileutil","文档"]},"458":{"title":"IsExist","titles":["Fileutil","文档"]},"459":{"title":"IsLink","titles":["Fileutil","文档"]},"460":{"title":"IsDir","titles":["Fileutil","文档"]},"461":{"title":"ListFileNames","titles":["Fileutil","文档"]},"462":{"title":"RemoveFile","titles":["Fileutil","文档"]},"463":{"title":"ReadFileToString","titles":["Fileutil","文档"]},"464":{"title":"ReadFileByLine","titles":["Fileutil","文档"]},"465":{"title":"Zip","titles":["Fileutil","文档"]},"466":{"title":"ZipAppendEntry","titles":["Fileutil","文档"]},"467":{"title":"UnZip","titles":["Fileutil","文档"]},"468":{"title":"IsZipFile","titles":["Fileutil","文档"]},"469":{"title":"FileSize","titles":["Fileutil","文档"]},"470":{"title":"MTime","titles":["Fileutil","文档"]},"471":{"title":"Sha","titles":["Fileutil","文档"]},"472":{"title":"ReadCsvFile","titles":["Fileutil","文档"]},"473":{"title":"WriteCsvFile","titles":["Fileutil","文档"]},"474":{"title":"WriteBytesToFile","titles":["Fileutil","文档"]},"475":{"title":"WriteStringToFile","titles":["Fileutil","文档"]},"476":{"title":"Formatter","titles":[]},"477":{"title":"源码:","titles":["Formatter"]},"478":{"title":"用法:","titles":["Formatter"]},"479":{"title":"目录","titles":["Formatter"]},"480":{"title":"文档","titles":["Formatter"]},"481":{"title":"Comma","titles":["Formatter","文档"]},"482":{"title":"Pretty","titles":["Formatter","文档"]},"483":{"title":"PrettyToWriter","titles":["Formatter","文档"]},"484":{"title":"DecimalBytes","titles":["Formatter","文档"]},"485":{"title":"BinaryBytes","titles":["Formatter","文档"]},"486":{"title":"ParseDecimalBytes","titles":["Formatter","文档"]},"487":{"title":"ParseBinaryBytes","titles":["Formatter","文档"]},"488":{"title":"Function","titles":[]},"489":{"title":"源码:","titles":["Function"]},"490":{"title":"用法:","titles":["Function"]},"491":{"title":"目录","titles":["Function"]},"492":{"title":"文档","titles":["Function"]},"493":{"title":"After","titles":["Function","文档"]},"494":{"title":"Before","titles":["Function","文档"]},"495":{"title":"CurryFn","titles":["Function","文档"]},"496":{"title":"Compose","titles":["Function","文档"]},"497":{"title":"Debounced","titles":["Function","文档"]},"498":{"title":"Delay","titles":["Function","文档"]},"499":{"title":"Schedule","titles":["Function","文档"]},"500":{"title":"Pipeline","titles":["Function","文档"]},"501":{"title":"Watcher","titles":["Function","文档"]},"502":{"title":"Maputil","titles":[]},"503":{"title":"源码:","titles":["Maputil"]},"504":{"title":"用法:","titles":["Maputil"]},"505":{"title":"目录:","titles":["Maputil"]},"506":{"title":"API 文档:","titles":["Maputil"]},"507":{"title":"MapTo","titles":["Maputil","API 文档:"]},"508":{"title":"ForEach","titles":["Maputil","API 文档:"]},"509":{"title":"Filter","titles":["Maputil","API 文档:"]},"510":{"title":"FilterByKeys","titles":["Maputil","API 文档:"]},"511":{"title":"FilterByValues","titles":["Maputil","API 文档:"]},"512":{"title":"OmitBy","titles":["Maputil","API 文档:"]},"513":{"title":"OmitByKeys","titles":["Maputil","API 文档:"]},"514":{"title":"OmitByValues","titles":["Maputil","API 文档:"]},"515":{"title":"Intersect","titles":["Maputil","API 文档:"]},"516":{"title":"Keys","titles":["Maputil","API 文档:"]},"517":{"title":"Merge","titles":["Maputil","API 文档:"]},"518":{"title":"Minus","titles":["Maputil","API 文档:"]},"519":{"title":"Values","titles":["Maputil","API 文档:"]},"520":{"title":"KeysBy","titles":["Maputil","API 文档:"]},"521":{"title":"ValuesBy","titles":["Maputil","API 文档:"]},"522":{"title":"MapKeys","titles":["Maputil","API 文档:"]},"523":{"title":"MapValues","titles":["Maputil","API 文档:"]},"524":{"title":"Entry","titles":["Maputil","API 文档:"]},"525":{"title":"FromEntries","titles":["Maputil","API 文档:"]},"526":{"title":"Transform","titles":["Maputil","API 文档:"]},"527":{"title":"IsDisjoint","titles":["Maputil","API 文档:"]},"528":{"title":"HasKey","titles":["Maputil","API 文档:"]},"529":{"title":"NewConcurrentMap","titles":["Maputil","API 文档:"]},"530":{"title":"ConcurrentMap_Set","titles":["Maputil","API 文档:"]},"531":{"title":"ConcurrentMap_Get","titles":["Maputil","API 文档:"]},"532":{"title":"ConcurrentMap_GetOrSet","titles":["Maputil","API 文档:"]},"533":{"title":"ConcurrentMap_Delete","titles":["Maputil","API 文档:"]},"534":{"title":"ConcurrentMap_GetAndDelete","titles":["Maputil","API 文档:"]},"535":{"title":"ConcurrentMap_Has","titles":["Maputil","API 文档:"]},"536":{"title":"ConcurrentMap_Range","titles":["Maputil","API 文档:"]},"537":{"title":"Mathutil","titles":[]},"538":{"title":"源码:","titles":["Mathutil"]},"539":{"title":"用法:","titles":["Mathutil"]},"540":{"title":"目录","titles":["Mathutil"]},"541":{"title":"文档","titles":["Mathutil"]},"542":{"title":"Average","titles":["Mathutil","文档"]},"543":{"title":"Exponent","titles":["Mathutil","文档"]},"544":{"title":"Fibonacci","titles":["Mathutil","文档"]},"545":{"title":"Factorial","titles":["Mathutil","文档"]},"546":{"title":"Max","titles":["Mathutil","文档"]},"547":{"title":"MaxBy","titles":["Mathutil","文档"]},"548":{"title":"Min","titles":["Mathutil","文档"]},"549":{"title":"MinBy","titles":["Mathutil","文档"]},"550":{"title":"Percent","titles":["Mathutil","文档"]},"551":{"title":"RoundToFloat","titles":["Mathutil","文档"]},"552":{"title":"RoundToString","titles":["Mathutil","文档"]},"553":{"title":"TruncRound","titles":["Mathutil","文档"]},"554":{"title":"Range","titles":["Mathutil","文档"]},"555":{"title":"RangeWithStep","titles":["Mathutil","文档"]},"556":{"title":"AngleToRadian","titles":["Mathutil","文档"]},"557":{"title":"RadianToAngle","titles":["Mathutil","文档"]},"558":{"title":"PointDistance","titles":["Mathutil","文档"]},"559":{"title":"IsPrime","titles":["Mathutil","文档"]},"560":{"title":"GCD","titles":["Mathutil","文档"]},"561":{"title":"LCM","titles":["Mathutil","文档"]},"562":{"title":"Cos","titles":["Mathutil","文档"]},"563":{"title":"Sin","titles":["Mathutil","文档"]},"564":{"title":"Log","titles":["Mathutil","文档"]},"565":{"title":"Sum","titles":["Mathutil","文档"]},"566":{"title":"Abs","titles":["Mathutil","文档"]},"567":{"title":"Netutil","titles":[]},"568":{"title":"源码:","titles":["Netutil"]},"569":{"title":"用法:","titles":["Netutil"]},"570":{"title":"目录","titles":["Netutil"]},"571":{"title":"文档","titles":["Netutil"]},"572":{"title":"ConvertMapToQueryString","titles":["Netutil","文档"]},"573":{"title":"EncodeUrl","titles":["Netutil","文档"]},"574":{"title":"GetInternalIp","titles":["Netutil","文档"]},"575":{"title":"GetIps","titles":["Netutil","文档"]},"576":{"title":"GetMacAddrs","titles":["Netutil","文档"]},"577":{"title":"GetPublicIpInfo","titles":["Netutil","文档"]},"578":{"title":"GetRequestPublicIp","titles":["Netutil","文档"]},"579":{"title":"IsPublicIP","titles":["Netutil","文档"]},"580":{"title":"IsInternalIP","titles":["Netutil","文档"]},"581":{"title":"HttpRequest","titles":["Netutil","文档"]},"582":{"title":"HttpClient","titles":["Netutil","文档"]},"583":{"title":"SendRequest","titles":["Netutil","文档"]},"584":{"title":"DecodeResponse","titles":["Netutil","文档"]},"585":{"title":"StructToUrlValues","titles":["Netutil","文档"]},"586":{"title":"HttpGet","titles":["Netutil","文档"]},"587":{"title":"HttpPost","titles":["Netutil","文档"]},"588":{"title":"HttpPut","titles":["Netutil","文档"]},"589":{"title":"HttpDelete","titles":["Netutil","文档"]},"590":{"title":"HttpPatch","titles":["Netutil","文档"]},"591":{"title":"ParseHttpResponse","titles":["Netutil","文档"]},"592":{"title":"DownloadFile","titles":["Netutil","文档"]},"593":{"title":"UploadFile","titles":["Netutil","文档"]},"594":{"title":"IsPingConnected","titles":["Netutil","文档"]},"595":{"title":"IsTelnetConnected","titles":["Netutil","文档"]},"596":{"title":"Pointer","titles":[]},"597":{"title":"源码:","titles":["Pointer"]},"598":{"title":"用法:","titles":["Pointer"]},"599":{"title":"目录","titles":["Pointer"]},"600":{"title":"文档","titles":["Pointer"]},"601":{"title":"Of","titles":["Pointer","文档"]},"602":{"title":"Unwrap","titles":["Pointer","文档"]},"603":{"title":"ExtractPointer","titles":["Pointer","文档"]},"604":{"title":"UnwarpOr","titles":["Pointer","文档"]},"605":{"title":"UnwarpOrDefault","titles":["Pointer","文档"]},"606":{"title":"Random","titles":[]},"607":{"title":"源码:","titles":["Random"]},"608":{"title":"用法:","titles":["Random"]},"609":{"title":"目录","titles":["Random"]},"610":{"title":"文档","titles":["Random"]},"611":{"title":"RandBytes","titles":["Random","文档"]},"612":{"title":"RandInt","titles":["Random","文档"]},"613":{"title":"RandString","titles":["Random","文档"]},"614":{"title":"RandUpper","titles":["Random","文档"]},"615":{"title":"RandLower","titles":["Random","文档"]},"616":{"title":"RandNumeral","titles":["Random","文档"]},"617":{"title":"RandNumeralOrLetter","titles":["Random","文档"]},"618":{"title":"UUIdV4","titles":["Random","文档"]},"619":{"title":"RandUniqueIntSlice","titles":["Random","文档"]},"620":{"title":"Retry","titles":[]},"621":{"title":"源码:","titles":["Retry"]},"622":{"title":"用法:","titles":["Retry"]},"623":{"title":"目录","titles":["Retry"]},"624":{"title":"文档","titles":["Retry"]},"625":{"title":"Context","titles":["Retry","文档"]},"626":{"title":"RetryFunc","titles":["Retry","文档"]},"627":{"title":"RetryTimes","titles":["Retry","文档"]},"628":{"title":"RetryDuration","titles":["Retry","文档"]},"629":{"title":"Retry","titles":["Retry","文档"]},"630":{"title":"Slice","titles":[]},"631":{"title":"源码:","titles":["Slice"]},"632":{"title":"用法:","titles":["Slice"]},"633":{"title":"目录","titles":["Slice"]},"634":{"title":"文档","titles":["Slice"]},"635":{"title":"AppendIfAbsent","titles":["Slice","文档"]},"636":{"title":"Contain","titles":["Slice","文档"]},"637":{"title":"ContainBy","titles":["Slice","文档"]},"638":{"title":"ContainSubSlice","titles":["Slice","文档"]},"639":{"title":"Chunk","titles":["Slice","文档"]},"640":{"title":"Compact","titles":["Slice","文档"]},"641":{"title":"Concat","titles":["Slice","文档"]},"642":{"title":"Count","titles":["Slice","文档"]},"643":{"title":"CountBy","titles":["Slice","文档"]},"644":{"title":"Difference","titles":["Slice","文档"]},"645":{"title":"DifferenceBy","titles":["Slice","文档"]},"646":{"title":"DifferenceWith","titles":["Slice","文档"]},"647":{"title":"DeleteAt","titles":["Slice","文档"]},"648":{"title":"Drop","titles":["Slice","文档"]},"649":{"title":"DropRight","titles":["Slice","文档"]},"650":{"title":"DropWhile","titles":["Slice","文档"]},"651":{"title":"DropRightWhile","titles":["Slice","文档"]},"652":{"title":"Every","titles":["Slice","文档"]},"653":{"title":"Equal","titles":["Slice","文档"]},"654":{"title":"EqualWith","titles":["Slice","文档"]},"655":{"title":"Filter","titles":["Slice","文档"]},"656":{"title":"Find (废弃:使用 FindBy)","titles":["Slice","文档"]},"657":{"title":"FindBy","titles":["Slice","文档"]},"658":{"title":"FindLast(废弃:使用 FindLastBy)","titles":["Slice","文档"]},"659":{"title":"FindLastBy","titles":["Slice","文档"]},"660":{"title":"Flatten","titles":["Slice","文档"]},"661":{"title":"FlattenDeep","titles":["Slice","文档"]},"662":{"title":"ForEach","titles":["Slice","文档"]},"663":{"title":"ForEachWithBreak","titles":["Slice","文档"]},"664":{"title":"GroupBy","titles":["Slice","文档"]},"665":{"title":"GroupWith","titles":["Slice","文档"]},"666":{"title":"IntSlice (已弃用: 使用 go1.18+泛型代替)","titles":["Slice","文档"]},"667":{"title":"InterfaceSlice(已弃用: 使用 go1.18+泛型代替)","titles":["Slice","文档"]},"668":{"title":"Intersection","titles":["Slice","文档"]},"669":{"title":"InsertAt","titles":["Slice","文档"]},"670":{"title":"IndexOf","titles":["Slice","文档"]},"671":{"title":"LastIndexOf","titles":["Slice","文档"]},"672":{"title":"Map","titles":["Slice","文档"]},"673":{"title":"FilterMap","titles":["Slice","文档"]},"674":{"title":"FlatMap","titles":["Slice","文档"]},"675":{"title":"Merge","titles":["Slice","文档"]},"676":{"title":"Reverse","titles":["Slice","文档"]},"677":{"title":"Reduce","titles":["Slice","文档"]},"678":{"title":"ReduceBy","titles":["Slice","文档"]},"679":{"title":"ReduceRight","titles":["Slice","文档"]},"680":{"title":"Replace","titles":["Slice","文档"]},"681":{"title":"ReplaceAll","titles":["Slice","文档"]},"682":{"title":"Repeat","titles":["Slice","文档"]},"683":{"title":"Shuffle","titles":["Slice","文档"]},"684":{"title":"IsAscending","titles":["Slice","文档"]},"685":{"title":"IsDescending","titles":["Slice","文档"]},"686":{"title":"IsSorted","titles":["Slice","文档"]},"687":{"title":"IsSortedByKey","titles":["Slice","文档"]},"688":{"title":"Sort","titles":["Slice","文档"]},"689":{"title":"SortBy","titles":["Slice","文档"]},"690":{"title":"SortByField (已弃用: 请使用 Sort 或 SortBy 代替该方法)","titles":["Slice","文档"]},"691":{"title":"Some","titles":["Slice","文档"]},"692":{"title":"StringSlice(已弃用: 使用 go1.18+泛型代替)","titles":["Slice","文档"]},"693":{"title":"SymmetricDifference","titles":["Slice","文档"]},"694":{"title":"ToSlice","titles":["Slice","文档"]},"695":{"title":"ToSlicePointer","titles":["Slice","文档"]},"696":{"title":"Unique","titles":["Slice","文档"]},"697":{"title":"UniqueBy","titles":["Slice","文档"]},"698":{"title":"Union","titles":["Slice","文档"]},"699":{"title":"UnionBy","titles":["Slice","文档"]},"700":{"title":"UpdateAt","titles":["Slice","文档"]},"701":{"title":"Without","titles":["Slice","文档"]},"702":{"title":"KeyBy","titles":["Slice","文档"]},"703":{"title":"Join","titles":["Slice","文档"]},"704":{"title":"Stream","titles":[]},"705":{"title":"源码:","titles":["Stream"]},"706":{"title":"用法:","titles":["Stream"]},"707":{"title":"目录","titles":["Stream"]},"708":{"title":"文档","titles":["Stream"]},"709":{"title":"Of","titles":["Stream","文档"]},"710":{"title":"FromSlice","titles":["Stream","文档"]},"711":{"title":"FromChannel","titles":["Stream","文档"]},"712":{"title":"FromRange","titles":["Stream","文档"]},"713":{"title":"Generate","titles":["Stream","文档"]},"714":{"title":"Concat","titles":["Stream","文档"]},"715":{"title":"Distinct","titles":["Stream","文档"]},"716":{"title":"Filter","titles":["Stream","文档"]},"717":{"title":"Map","titles":["Stream","文档"]},"718":{"title":"Peek","titles":["Stream","文档"]},"719":{"title":"Skip","titles":["Stream","文档"]},"720":{"title":"Limit","titles":["Stream","文档"]},"721":{"title":"Reverse","titles":["Stream","文档"]},"722":{"title":"Range","titles":["Stream","文档"]},"723":{"title":"Sorted","titles":["Stream","文档"]},"724":{"title":"ForEach","titles":["Stream","文档"]},"725":{"title":"Reduce","titles":["Stream","文档"]},"726":{"title":"FindFirst","titles":["Stream","文档"]},"727":{"title":"FindLast","titles":["Stream","文档"]},"728":{"title":"Max","titles":["Stream","文档"]},"729":{"title":"Min","titles":["Stream","文档"]},"730":{"title":"AllMatch","titles":["Stream","文档"]},"731":{"title":"AnyMatch","titles":["Stream","文档"]},"732":{"title":"NoneMatch","titles":["Stream","文档"]},"733":{"title":"Count","titles":["Stream","文档"]},"734":{"title":"ToSlice","titles":["Stream","文档"]},"735":{"title":"Structs","titles":[]},"736":{"title":"源码:","titles":["Structs"]},"737":{"title":"用法:","titles":["Structs"]},"738":{"title":"目录:","titles":["Structs"]},"739":{"title":"API 文档:","titles":["Structs"]},"740":{"title":"New","titles":["Structs","API 文档:"]},"741":{"title":"ToMap","titles":["Structs","API 文档:"]},"742":{"title":"Fields","titles":["Structs","API 文档:"]},"743":{"title":"Field","titles":["Structs","API 文档:"]},"744":{"title":"IsStruct","titles":["Structs","API 文档:"]},"745":{"title":"Tag","titles":["Structs","API 文档:"]},"746":{"title":"Value","titles":["Structs","API 文档:"]},"747":{"title":"IsEmbedded","titles":["Structs","API 文档:"]},"748":{"title":"IsExported","titles":["Structs","API 文档:"]},"749":{"title":"IsZero","titles":["Structs","API 文档:"]},"750":{"title":"Name","titles":["Structs","API 文档:"]},"751":{"title":"Kind","titles":["Structs","API 文档:"]},"752":{"title":"IsSlice","titles":["Structs","API 文档:"]},"753":{"title":"Strutil","titles":[]},"754":{"title":"源码:","titles":["Strutil"]},"755":{"title":"用法:","titles":["Strutil"]},"756":{"title":"目录","titles":["Strutil"]},"757":{"title":"文档","titles":["Strutil"]},"758":{"title":"After","titles":["Strutil","文档"]},"759":{"title":"AfterLast","titles":["Strutil","文档"]},"760":{"title":"Before","titles":["Strutil","文档"]},"761":{"title":"BeforeLast","titles":["Strutil","文档"]},"762":{"title":"CamelCase","titles":["Strutil","文档"]},"763":{"title":"KebabCase","titles":["Strutil","文档"]},"764":{"title":"UpperKebabCase","titles":["Strutil","文档"]},"765":{"title":"Capitalize","titles":["Strutil","文档"]},"766":{"title":"IsString","titles":["Strutil","文档"]},"767":{"title":"LowerFirst","titles":["Strutil","文档"]},"768":{"title":"UpperFirst","titles":["Strutil","文档"]},"769":{"title":"Pad","titles":["Strutil","文档"]},"770":{"title":"PadEnd","titles":["Strutil","文档"]},"771":{"title":"PadStart","titles":["Strutil","文档"]},"772":{"title":"Reverse","titles":["Strutil","文档"]},"773":{"title":"SnakeCase","titles":["Strutil","文档"]},"774":{"title":"UpperSnakeCase","titles":["Strutil","文档"]},"775":{"title":"SplitEx","titles":["Strutil","文档"]},"776":{"title":"Substring","titles":["Strutil","文档"]},"777":{"title":"Wrap","titles":["Strutil","文档"]},"778":{"title":"Unwrap","titles":["Strutil","文档"]},"779":{"title":"SplitWords","titles":["Strutil","文档"]},"780":{"title":"WordCount","titles":["Strutil","文档"]},"781":{"title":"RemoveNonPrintable","titles":["Strutil","文档"]},"782":{"title":"StringToBytes","titles":["Strutil","文档"]},"783":{"title":"BytesToString","titles":["Strutil","文档"]},"784":{"title":"IsBlank","titles":["Strutil","文档"]},"785":{"title":"HasPrefixAny","titles":["Strutil","文档"]},"786":{"title":"HasSuffixAny","titles":["Strutil","文档"]},"787":{"title":"IndexOffset","titles":["Strutil","文档"]},"788":{"title":"ReplaceWithMap","titles":["Strutil","文档"]},"789":{"title":"Trim","titles":["Strutil","文档"]},"790":{"title":"SplitAndTrim","titles":["Strutil","文档"]},"791":{"title":"HideString","titles":["Strutil","文档"]},"792":{"title":"ContainsAll","titles":["Strutil","文档"]},"793":{"title":"ContainsAny","titles":["Strutil","文档"]},"794":{"title":"RemoveWhiteSpace","titles":["Strutil","文档"]},"795":{"title":"System","titles":[]},"796":{"title":"源码:","titles":["System"]},"797":{"title":"用法:","titles":["System"]},"798":{"title":"目录","titles":["System"]},"799":{"title":"文档","titles":["System"]},"800":{"title":"IsWindows","titles":["System","文档"]},"801":{"title":"IsLinux","titles":["System","文档"]},"802":{"title":"IsMac","titles":["System","文档"]},"803":{"title":"GetOsEnv","titles":["System","文档"]},"804":{"title":"SetOsEnv","titles":["System","文档"]},"805":{"title":"RemoveOsEnv","titles":["System","文档"]},"806":{"title":"CompareOsEnv","titles":["System","文档"]},"807":{"title":"ExecCommand","titles":["System","文档"]},"808":{"title":"GetOsBits","titles":["System","文档"]},"809":{"title":"Tuple","titles":[]},"810":{"title":"源码:","titles":["Tuple"]},"811":{"title":"用法:","titles":["Tuple"]},"812":{"title":"目录","titles":["Tuple"]},"813":{"title":"文档","titles":["Tuple"]},"814":{"title":"Tuple2","titles":["Tuple","文档"]},"815":{"title":"Tuple2_Unbox","titles":["Tuple","文档"]},"816":{"title":"Zip2","titles":["Tuple","文档"]},"817":{"title":"Unzip2","titles":["Tuple","文档"]},"818":{"title":"Tuple3","titles":["Tuple","文档"]},"819":{"title":"Tuple3_Unbox","titles":["Tuple","文档"]},"820":{"title":"Zip3","titles":["Tuple","文档"]},"821":{"title":"Unzip3","titles":["Tuple","文档"]},"822":{"title":"Tuple4","titles":["Tuple","文档"]},"823":{"title":"Tuple4_Unbox","titles":["Tuple","文档"]},"824":{"title":"Zip4","titles":["Tuple","文档"]},"825":{"title":"Unzip4","titles":["Tuple","文档"]},"826":{"title":"Tuple5","titles":["Tuple","文档"]},"827":{"title":"Tuple5_Unbox","titles":["Tuple","文档"]},"828":{"title":"Zip5","titles":["Tuple","文档"]},"829":{"title":"Unzip5","titles":["Tuple","文档"]},"830":{"title":"Tuple6","titles":["Tuple","文档"]},"831":{"title":"Tuple6_Unbox","titles":["Tuple","文档"]},"832":{"title":"Zip6","titles":["Tuple","文档"]},"833":{"title":"Unzip6","titles":["Tuple","文档"]},"834":{"title":"Tuple7","titles":["Tuple","文档"]},"835":{"title":"Tuple7_Unbox","titles":["Tuple","文档"]},"836":{"title":"Zip7","titles":["Tuple","文档"]},"837":{"title":"Unzip7","titles":["Tuple","文档"]},"838":{"title":"Tuple8","titles":["Tuple","文档"]},"839":{"title":"Tuple8_Unbox","titles":["Tuple","文档"]},"840":{"title":"Zip8","titles":["Tuple","文档"]},"841":{"title":"Unzip8","titles":["Tuple","文档"]},"842":{"title":"Tuple9","titles":["Tuple","文档"]},"843":{"title":"Tuple9_Unbox","titles":["Tuple","文档"]},"844":{"title":"Zip9","titles":["Tuple","文档"]},"845":{"title":"Unzip9","titles":["Tuple","文档"]},"846":{"title":"Tuple10","titles":["Tuple","文档"]},"847":{"title":"Tuple10_Unbox","titles":["Tuple","文档"]},"848":{"title":"Zip10","titles":["Tuple","文档"]},"849":{"title":"Unzip10","titles":["Tuple","文档"]},"850":{"title":"Validator","titles":[]},"851":{"title":"源码:","titles":["Validator"]},"852":{"title":"用法:","titles":["Validator"]},"853":{"title":"目录:","titles":["Validator"]},"854":{"title":"文档","titles":["Validator"]},"855":{"title":"ContainChinese","titles":["Validator","文档"]},"856":{"title":"ContainLetter","titles":["Validator","文档"]},"857":{"title":"ContainLower","titles":["Validator","文档"]},"858":{"title":"ContainUpper","titles":["Validator","文档"]},"859":{"title":"IsAlpha","titles":["Validator","文档"]},"860":{"title":"IsAllUpper","titles":["Validator","文档"]},"861":{"title":"IsAllLower","titles":["Validator","文档"]},"862":{"title":"IsASCII","titles":["Validator","文档"]},"863":{"title":"IsBase64","titles":["Validator","文档"]},"864":{"title":"IsChineseMobile","titles":["Validator","文档"]},"865":{"title":"IsChineseIdNum","titles":["Validator","文档"]},"866":{"title":"IsChinesePhone","titles":["Validator","文档"]},"867":{"title":"IsCreditCard","titles":["Validator","文档"]},"868":{"title":"IsDns","titles":["Validator","文档"]},"869":{"title":"IsEmail","titles":["Validator","文档"]},"870":{"title":"IsEmptyString","titles":["Validator","文档"]},"871":{"title":"IsInt","titles":["Validator","文档"]},"872":{"title":"IsFloat","titles":["Validator","文档"]},"873":{"title":"IsNumber","titles":["Validator","文档"]},"874":{"title":"IsIntStr","titles":["Validator","文档"]},"875":{"title":"IsFloatStr","titles":["Validator","文档"]},"876":{"title":"IsNumberStr","titles":["Validator","文档"]},"877":{"title":"IsJSON","titles":["Validator","文档"]},"878":{"title":"IsRegexMatch","titles":["Validator","文档"]},"879":{"title":"IsIp","titles":["Validator","文档"]},"880":{"title":"IsIpV4","titles":["Validator","文档"]},"881":{"title":"IsIpV6","titles":["Validator","文档"]},"882":{"title":"IsStrongPassword","titles":["Validator","文档"]},"883":{"title":"IsUrl","titles":["Validator","文档"]},"884":{"title":"IsWeakPassword","titles":["Validator","文档"]},"885":{"title":"IsZeroValue","titles":["Validator","文档"]},"886":{"title":"IsGBK","titles":["Validator","文档"]},"887":{"title":"IsPrintable","titles":["Validator","文档"]},"888":{"title":"Xerror","titles":[]},"889":{"title":"源码:","titles":["Xerror"]},"890":{"title":"用法:","titles":["Xerror"]},"891":{"title":"目录","titles":["Xerror"]},"892":{"title":"文档","titles":["Xerror"]},"893":{"title":"New","titles":["Xerror","文档"]},"894":{"title":"Wrap","titles":["Xerror","文档"]},"895":{"title":"Unwrap","titles":["Xerror","文档"]},"896":{"title":"XError_Wrap","titles":["Xerror","文档"]},"897":{"title":"XError_Unwrap","titles":["Xerror","文档"]},"898":{"title":"XError_With","titles":["Xerror","文档"]},"899":{"title":"XError_Id","titles":["Xerror","文档"]},"900":{"title":"XError_Is","titles":["Xerror","文档"]},"901":{"title":"XError_Values","titles":["Xerror","文档"]},"902":{"title":"XError_StackTrace","titles":["Xerror","文档"]},"903":{"title":"XError_Info","titles":["Xerror","文档"]},"904":{"title":"XError_Error","titles":["Xerror","文档"]},"905":{"title":"TryUnwrap","titles":["Xerror","文档"]},"906":{"title":"安装","titles":[]},"907":{"title":"用法","titles":["安装"]},"908":{"title":"示例","titles":["安装"]},"909":{"title":"More","titles":["安装"]},"910":{"title":"lancet是什么?","titles":[]},"911":{"title":"为什么选择lancet?","titles":["lancet是什么?"]}},"dirtCount":0,"index":[["加密",{"2":{"911":1}}],["加解密",{"2":{"0":1}}],["处理网络和http请求",{"2":{"911":1}}],["操作字符串",{"2":{"911":1}}],["操作map的每个value",{"2":{"523":1}}],["操作map的每个key",{"2":{"522":1}}],["开发变得更容易",{"2":{"911":1}}],["消除了处理并发",{"2":{"911":1}}],["逆序字符串",{"2":{"908":1}}],["此处以字符串工具函数",{"2":{"908":1}}],["需要导入",{"2":{"907":1,"908":1}}],["需要设置dst和src",{"2":{"82":1}}],["版本是",{"2":{"906":1}}],["必须安装",{"2":{"906":1}}],["因为",{"2":{"906":1}}],["因此",{"2":{"886":1}}],["建议安装",{"2":{"906":1}}],["建议使用reduceby",{"2":{"677":1}}],["及以上版本的用户",{"2":{"906":1}}],["安装",{"0":{"906":1},"1":{"907":1,"908":1,"909":1}}],["两个错误中的error",{"2":{"900":1}}],["两个列表取交集",{"2":{"268":1}}],["两个列表取并集",{"2":{"267":1}}],["添加与xerror对象的键和值",{"2":{"898":1}}],["适配github",{"2":{"897":1}}],["错误处理逻辑封装",{"2":{"888":1}}],["应用",{"2":{"906":1}}],["应该首先调用utf8",{"2":{"886":1}}],["应传值为",{"2":{"471":1}}],["而utf",{"2":{"886":1}}],["汉字内部代码扩展规范",{"2":{"886":1}}],["😄",{"2":{"862":2,"887":2}}],["如示例所示",{"2":{"886":1}}],["如ls",{"2":{"807":1}}],["如果使用字符串相关函数",{"2":{"907":1}}],["如果err不是nil则tryunwrap使用err发生panic",{"2":{"905":1}}],["如果err为nil则展开",{"2":{"905":1}}],["如果出现错误",{"2":{"807":1}}],["如果出入类型参数含有bool方法",{"2":{"52":1}}],["如果字符串中不存在",{"2":{"787":1}}],["如果字符串长度短于size",{"2":{"769":1,"770":1,"771":1}}],["如果stream为空",{"2":{"726":1,"727":1}}],["如果有",{"2":{"725":1}}],["如果此stream包含的元素少于n个",{"2":{"719":1}}],["如果此列表不包含任何元素",{"2":{"151":1}}],["如果此列表不包含该元素",{"2":{"149":1}}],["如果index",{"2":{"700":1}}],["如果iterator返回false",{"2":{"536":1}}],["如果列表中的任何值通过谓词函数",{"2":{"691":1}}],["如果是降序",{"2":{"690":1}}],["如果需要降序",{"2":{"688":1}}],["如果找不到该值",{"2":{"671":1}}],["如果找不到值",{"2":{"670":1}}],["如果切片中的所有值都通过谓词函数",{"2":{"652":1}}],["如果不需要struct更多的方法",{"2":{"741":2}}],["如果不相等返回在slice中对应的值",{"2":{"645":1}}],["如果不存在key",{"2":{"531":1}}],["如果指针为零值",{"2":{"604":1,"605":1}}],["如果指定的对象等于此列表",{"2":{"171":1}}],["如果存在",{"2":{"532":1}}],["如果集合中存在元素",{"2":{"339":1}}],["如果集合中不存在元素且checker返回true",{"2":{"340":1}}],["如果集合中不存在元素",{"2":{"339":1}}],["如果索引不在",{"2":{"255":1}}],["如果索引不在0和列表数据长度之间",{"2":{"254":1}}],["如果未找到",{"2":{"248":1,"249":1,"250":1}}],["如果堆为空",{"2":{"195":1,"196":1}}],["如果该元素存在",{"2":{"165":1,"167":1}}],["如果没有找到返回",{"2":{"147":1,"247":1}}],["如果参数无法转换",{"2":{"71":1,"72":1,"73":1}}],["如果a和b都为真",{"2":{"58":1}}],["如果a和b都是真的或a和b均是假的",{"2":{"57":1}}],["如果传入类型参数有iszero方法",{"2":{"52":1}}],["执行shell命令",{"2":{"807":1}}],["执行函数pipeline",{"2":{"500":1}}],["替换多个空格为1个空格",{"2":{"794":1}}],["替换范围是",{"2":{"791":1}}],["忽略trim后为空的元素",{"2":{"790":1}}],["忽略大小写",{"2":{"403":1}}],["区分大小写",{"2":{"788":1}}],["以下版本的用户",{"2":{"906":1}}],["以无序的方式被map替换",{"2":{"788":1}}],["以1024为基数",{"2":{"485":1,"487":1}}],["以1000为基数",{"2":{"484":1,"486":1}}],["实例的索引",{"2":{"787":1}}],["实现标准库的error接口",{"2":{"904":1}}],["实现",{"2":{"133":1,"704":1}}],["私はプログラマーです",{"2":{"779":2,"780":2}}],["こんにちは",{"2":{"779":2,"780":2}}],["我是一名码农",{"2":{"779":2,"780":2}}],["欢迎你",{"2":{"776":2}}],["你好hello",{"2":{"855":2}}],["你好😄",{"2":{"781":4}}],["你好",{"2":{"776":4,"779":2,"780":2,"855":2,"856":2,"862":2,"886":2}}],["^",{"2":{"762":2,"763":2,"764":2,"773":2,"774":2,"856":2,"882":1}}],["非字母和数字会被忽略",{"2":{"762":1,"763":1,"764":1,"773":1,"774":1}}],["提供一个便捷的静态方法",{"2":{"741":1}}],["提供了操作struct的相关函数",{"2":{"735":1}}],["除此之外",{"2":{"741":1}}],[">",{"2":{"728":1}}],["排除",{"2":{"722":1}}],["排序不保证稳定性",{"2":{"689":1}}],["到结束",{"2":{"722":1}}],["后跟第二个stream的全部元素",{"2":{"714":1}}],["指定额外的剥离字符",{"2":{"789":1}}],["指定一个范围创建stream",{"2":{"712":1}}],["指数计算",{"2":{"543":1}}],["功能有限",{"2":{"704":1}}],["功能涵盖字符串处理",{"2":{"0":1}}],["流",{"2":{"704":1,"911":1}}],["流处理",{"2":{"0":1}}],["交集取反",{"2":{"693":1}}],["交换列表中两个索引位置的值",{"2":{"264":1}}],["但不同时存储在于参数切片中",{"2":{"693":1}}],["为什么选择lancet",{"0":{"911":1}}],["为例",{"2":{"908":1}}],["为false时",{"2":{"794":1}}],["为",{"2":{"690":1}}],["为map中每个键和值顺序调用迭代器",{"2":{"536":1}}],["字段类型应为int",{"2":{"690":1}}],["字符串等的麻烦",{"2":{"911":1}}],["字符串",{"2":{"76":1,"481":1}}],["字符串转字符切片",{"2":{"69":1}}],["字符串转布尔类型",{"2":{"67":1}}],["代替该方法",{"0":{"690":1}}],["或其他字符",{"2":{"789":1}}],["或",{"0":{"690":1}}],["或字符串",{"2":{"688":1}}],["或被context停止",{"2":{"629":1}}],["所有整数浮点数",{"2":{"688":1}}],["请使用",{"0":{"690":1}}],["请将参数",{"2":{"688":1}}],["请求",{"2":{"567":1}}],["通过iteratee函数",{"2":{"687":1}}],["通过将单个文件或目录追加到现有的zip文件",{"2":{"466":1}}],["升序或降序",{"2":{"686":1}}],["多个切片的交集",{"2":{"668":1}}],["多个map的交集操作",{"2":{"515":1}}],["已弃用",{"0":{"666":1,"667":1,"690":1,"692":1}}],["已废弃",{"0":{"440":1},"2":{"586":1,"587":1,"588":1,"589":1,"590":1}}],["分割字符串为切片",{"2":{"775":1}}],["分组值的顺序是由他们出现在slice中的顺序确定的",{"2":{"665":1}}],["分别称为左孩子和右孩子",{"2":{"387":1}}],["废弃",{"0":{"656":1,"658":1},"2":{"677":1}}],["元素顺序和值都相同",{"2":{"653":1}}],["元素入队列",{"2":{"290":1,"302":1,"313":1,"325":1}}],["相关函数",{"2":{"795":1}}],["相等条件",{"2":{"653":1,"654":1}}],["相同的key会被后来的key覆盖",{"2":{"517":1}}],["这个n个元素满足predicate函数返回true",{"2":{"650":1,"651":1}}],["这个包的实现参考了carlmjohnson的truthy包的实现",{"2":{"47":1}}],["该函数的实现取决于双字节是否在gbk的编码范围内",{"2":{"886":1}}],["该函数延迟调用fn直到自上次调用debounced函数后等待持续时间过去",{"2":{"497":1}}],["该stream由源stream的元素组成",{"2":{"723":1}}],["该stream由将给定函数应用于源stream元素的元素组成",{"2":{"717":1}}],["该stream的元素在从源stream的开始",{"2":{"722":1}}],["该stream被截断为长度不超过maxsize",{"2":{"720":1}}],["该包仅验证简单",{"2":{"704":1}}],["该比较器被调用以将切片的元素与值进行比较",{"2":{"646":1}}],["接受比较器函数",{"2":{"646":1}}],["遍历slice的元素",{"2":{"656":1,"657":1,"658":1}}],["遍历切片的元素并为每个元素调用iteratee函数",{"2":{"662":1,"663":1}}],["遍历切片",{"2":{"643":1}}],["遍历集合的元素并为每个元素调用iteratee函数",{"2":{"348":1}}],["去除slice中的假值",{"2":{"640":1}}],["去除重复数据项",{"2":{"267":1}}],["被重试执行的函数",{"2":{"626":1}}],["设置xerror对象的id",{"2":{"899":1}}],["设置由key命名的环境变量的值",{"2":{"804":1}}],["设置",{"2":{"690":1}}],["设置为",{"2":{"688":1}}],["设置重试间隔时间",{"2":{"628":1}}],["设置重试次数",{"2":{"627":1}}],["设置重试context参数",{"2":{"625":1}}],["设置key并返回给定值",{"2":{"532":1}}],["范围两端点值都包括在内",{"2":{"712":1}}],["范围",{"2":{"612":1}}],["生成一个不重复的长度为n的随机int切片",{"2":{"619":1}}],["生成uuid",{"2":{"618":1}}],["生成给定长度的随机数字字符串",{"2":{"616":1}}],["生成给定长度的随机小写字母字符串",{"2":{"615":1}}],["生成给定长度的随机大写字母字符串",{"2":{"614":1}}],["生成给定长度的随机字符串",{"2":{"613":1,"617":1}}],["生成随机int",{"2":{"612":1}}],["生成随机字节切片",{"2":{"611":1}}],["生成channel",{"2":{"40":1}}],["随机",{"2":{"911":1}}],["随机打乱切片中的元素顺序",{"2":{"683":1}}],["随机数生成器包",{"2":{"606":1}}],["随机顺序",{"2":{"185":1,"186":1}}],["类似reduceby操作",{"2":{"679":1}}],["类似列表",{"2":{"330":1}}],["类型必须是",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["类型必须是url",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["类型必须是http",{"2":{"586":4,"587":4,"588":4,"589":4,"590":4}}],["仅转化结构体导出字段并且包含`json`",{"2":{"585":1}}],["仅保留列表中包含在给定列表中的元素",{"2":{"271":1}}],["它可以用一些配置参数或无配置实例化",{"2":{"582":1}}],["它的节点有一个值",{"2":{"223":1}}],["它的节点有一个值和一个指向链表的下一个节点的指针",{"2":{"207":1}}],["它的节点有一个值和一个指向下一个节点的指针",{"2":{"200":1}}],["编码url",{"2":{"573":1}}],["发送http",{"2":{"586":1,"587":1,"588":1,"589":1,"590":1}}],["发送",{"2":{"567":1}}],["地址",{"2":{"567":1}}],["求绝对值",{"2":{"566":1}}],["求传入参数之和",{"2":{"565":1}}],["求两个集合的交集",{"2":{"351":1}}],["求两个集合的并集",{"2":{"350":1}}],["步长",{"2":{"555":1}}],["结果值是否应该被包含在返回的切片中",{"2":{"673":1}}],["结果值",{"2":{"673":1}}],["结果值的顺序和引用由第一个切片确定",{"2":{"646":1}}],["结束值",{"2":{"555":1}}],["结构体",{"2":{"76":1}}],["截短n位小数",{"2":{"553":1}}],["四舍五入",{"2":{"551":1,"552":1}}],["保留n位小数",{"2":{"550":1,"551":1,"552":1}}],["计算以base为底n的对数",{"2":{"564":1}}],["计算弧度的正弦值",{"2":{"563":1}}],["计算弧度的余弦值",{"2":{"562":1}}],["计算最小公倍数",{"2":{"561":1}}],["计算最大公约数",{"2":{"560":1}}],["计算两个坐标点的距离",{"2":{"558":1}}],["计算百分比",{"2":{"550":1}}],["计算阶乘",{"2":{"545":1}}],["计算斐波那契数列的第n个数",{"2":{"544":1}}],["计算平均数",{"2":{"542":1}}],["计数排序",{"2":{"13":1}}],["然后调用isgbk检查gbk编码",{"2":{"886":1}}],["然后删除重复元素",{"2":{"697":1}}],["然后删除",{"2":{"534":1}}],["然后转为新的map",{"2":{"522":1,"523":1}}],["值对的切片创建map",{"2":{"525":1}}],["值对切片",{"2":{"524":1}}],["合并多个切片",{"2":{"675":1,"698":1,"699":1}}],["合并多个slices到slice中",{"2":{"641":1}}],["合并多个maps",{"2":{"517":1}}],["合并两个列表",{"2":{"261":1}}],["快速将map或者其他类型映射到结构体或者指定类型",{"2":{"507":1}}],["快速排序",{"2":{"10":1}}],["重试等",{"2":{"911":1}}],["重试执行函数retryfunc",{"2":{"629":1}}],["重试执行函数直到函数运行成功或被",{"2":{"620":1}}],["重置手表定时器",{"2":{"501":1}}],["重复执行函数fn",{"2":{"42":1}}],["停止",{"2":{"501":1}}],["可添加message",{"2":{"894":1}}],["可选参数",{"2":{"789":1}}],["可以直接使用tomap",{"2":{"741":2}}],["可以生成随机",{"2":{"606":1}}],["可以启动",{"2":{"501":1}}],["可能需要对结果调用roundtofloat方法四舍五入",{"2":{"542":1}}],["可复用的go语言工具函数库",{"2":{"0":1,"910":1}}],["每个键对应的值负责生成key的元素组成的数组",{"2":{"665":1}}],["每个元素将按条件分组",{"2":{"664":1}}],["每个树节点都有一个值",{"2":{"381":1}}],["每次持续时间调用函数",{"2":{"499":1}}],["延迟delay时间后调用函数",{"2":{"498":1}}],["之后再调用这个函数",{"2":{"494":1}}],["之间的原始列表的子列表",{"2":{"276":1}}],["之间的所有元素",{"2":{"169":1}}],["调用次数不超过n次",{"2":{"494":1}}],["调用函数返回true",{"2":{"277":1}}],["下的可读字节单位字符串",{"2":{"484":1,"485":1}}],["¥1",{"2":{"481":2}}],["¥",{"2":{"481":2}}],["$1",{"2":{"790":4}}],["$12",{"2":{"481":2}}],["$foo",{"2":{"762":2}}],["$",{"2":{"481":2,"789":10,"790":2,"856":2,"882":3,"884":2}}],["读取csv文件内容到切片",{"2":{"472":1}}],["读取文件内容并返回字符串",{"2":{"463":1}}],["读取时",{"2":{"133":1}}],["拷贝文件",{"2":{"454":1}}],["拷贝不同结构体之间的同名字段",{"2":{"82":1}}],["z",{"2":{"613":1,"878":4}}],["za",{"2":{"613":1,"878":4}}],["zhimg",{"2":{"592":2}}],["zip10",{"0":{"848":1},"2":{"812":1,"848":4}}],["zip9",{"0":{"844":1},"2":{"812":1,"844":4}}],["zip8",{"0":{"840":1},"2":{"812":1,"840":4}}],["zip7",{"0":{"836":1},"2":{"812":1,"836":4}}],["zip6",{"0":{"832":1},"2":{"812":1,"832":4}}],["zip5",{"0":{"828":1},"2":{"812":1,"828":4}}],["zip4",{"0":{"824":1},"2":{"812":1,"824":4}}],["zip3",{"0":{"820":1},"2":{"812":1,"820":4}}],["zip2",{"0":{"816":1},"2":{"812":1,"816":4}}],["zipfile",{"2":{"467":2,"468":2}}],["zip解压缩文件并保存在目录中",{"2":{"467":1}}],["zip压缩文件",{"2":{"465":1}}],["zipappendentry",{"0":{"466":1},"2":{"449":1,"466":4}}],["zip",{"0":{"465":1},"2":{"449":1,"465":6,"466":2,"467":4,"468":2}}],["zerotime",{"2":{"425":4}}],["验证参数是否是数字",{"2":{"873":1}}],["验证参数是否是浮点数",{"2":{"872":1}}],["验证参数是否是整数",{"2":{"871":1}}],["验证参数`left`的值是否大于或参数`right`的值",{"2":{"28":1}}],["验证参数`left`的值是否大于参数`right`的值",{"2":{"26":1}}],["验证参数`left`的值是否小于或等于参数`right`的值",{"2":{"27":1}}],["验证参数`left`的值是否小于参数`right`的值",{"2":{"25":1}}],["验证字符串全部为ascii字符",{"2":{"862":1}}],["验证字符串是否可以匹配正则表达式",{"2":{"878":1}}],["验证字符串是否是弱密码",{"2":{"884":1}}],["验证字符串是否是url",{"2":{"883":1}}],["验证字符串是否是强密码",{"2":{"882":1}}],["验证字符串是否是ipv6地址",{"2":{"881":1}}],["验证字符串是否是ipv4地址",{"2":{"880":1}}],["验证字符串是否是ip地址",{"2":{"879":1}}],["验证字符串是否是可以转换为数字",{"2":{"876":1}}],["验证字符串是否是可以转换为浮点数",{"2":{"875":1}}],["验证字符串是否是可以转换为整数",{"2":{"874":1}}],["验证字符串是否是空字符串",{"2":{"870":1}}],["验证字符串是否是有效json",{"2":{"877":1}}],["验证字符串是否是有效电子邮件地址",{"2":{"869":1}}],["验证字符串是否是有效dns",{"2":{"868":1}}],["验证字符串是否是信用卡号码",{"2":{"867":1}}],["验证字符串是否是中国电话座机号码",{"2":{"866":1}}],["验证字符串是否是中国身份证号码",{"2":{"865":1}}],["验证字符串是否是中国手机号码",{"2":{"864":1}}],["验证字符串是否是base64编码",{"2":{"863":1}}],["验证字符串是否全是小写英文字母",{"2":{"861":1}}],["验证字符串是否全是大写英文字母",{"2":{"860":1}}],["验证字符串是否只包含英文字母",{"2":{"859":1}}],["验证字符串是否包含至少一个英文大写字母",{"2":{"858":1}}],["验证字符串是否包含至少一个英文小写字母",{"2":{"857":1}}],["验证字符串是否包含至少一个英文字母",{"2":{"856":1}}],["验证字符串是否包含中文字符",{"2":{"855":1}}],["验证器包",{"2":{"850":1}}],["验证是否包含key",{"2":{"535":1}}],["验证是否是闰年",{"2":{"437":1}}],["验证两个map是否具有不同的key",{"2":{"527":1}}],["格式化器包含一些数据格式化处理方法",{"2":{"476":1}}],["格式化日期",{"2":{"398":1}}],["格式",{"2":{"423":1,"424":1}}],["默认的tag",{"2":{"745":1}}],["默认排序类型是升序",{"2":{"690":1}}],["默认排序顺序为升序",{"2":{"688":1}}],["默认3秒",{"2":{"628":1}}],["默认5",{"2":{"627":1}}],["默认为4",{"2":{"484":1,"485":1}}],["默认结束时间星期六",{"2":{"417":1}}],["默认开始时间星期日",{"2":{"411":1}}],["word",{"2":{"779":4,"780":2}}],["wordcount",{"0":{"780":1},"2":{"756":1,"780":14}}],["world",{"2":{"463":4,"464":2,"781":2,"785":2,"786":2,"787":2,"792":4,"793":4,"794":4}}],["www",{"2":{"573":4,"587":2,"593":2,"594":4,"595":4}}],["wg",{"2":{"532":8}}],["wg2",{"2":{"530":2,"531":2,"533":6,"534":6,"535":6}}],["wg1",{"2":{"530":8,"531":8,"533":8,"534":8,"535":8,"536":8}}],["wait",{"2":{"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["waitgroup",{"2":{"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["watcher用于记录代码执行时间",{"2":{"501":1}}],["watcher",{"0":{"501":1},"2":{"489":1,"491":1,"501":12}}],["whose",{"2":{"529":2}}],["w",{"2":{"501":20}}],["wrong",{"2":{"894":4}}],["wronly|os",{"2":{"463":2,"464":2,"473":2}}],["wraperr",{"2":{"894":4,"895":4}}],["wraptoken",{"2":{"778":2}}],["wrapwith",{"2":{"777":2}}],["wrap",{"0":{"777":1,"894":1,"896":1},"2":{"756":1,"777":10,"891":2,"894":4,"895":2,"896":4,"897":2,"903":2}}],["writer",{"2":{"483":2}}],["writestring",{"2":{"463":2,"464":2}}],["writestringtofile",{"0":{"475":1},"2":{"449":1,"475":4}}],["writebytestofile",{"0":{"474":1},"2":{"449":1,"474":4}}],["writecsvfile",{"0":{"473":1},"2":{"449":1,"473":4}}],["windows",{"2":{"807":3}}],["without",{"0":{"701":1},"2":{"633":1,"701":4}}],["with",{"0":{"898":1},"2":{"529":2,"891":1,"895":2,"896":2,"897":2,"898":4,"901":2,"903":2}}],["withcancel",{"2":{"38":2,"39":2,"40":2,"41":2,"42":2,"44":2,"45":2,"46":2,"625":2}}],["will",{"2":{"453":2,"906":2}}],["weekday",{"0":{"440":1},"2":{"411":2,"417":2}}],["减年数",{"2":{"407":1}}],["减分钟数",{"2":{"406":1}}],["减小时数",{"2":{"405":1}}],["减天数",{"2":{"404":1}}],["y2",{"2":{"558":2}}],["y1",{"2":{"558":2}}],["year",{"2":{"407":2,"437":2}}],["yesterday",{"2":{"404":4,"438":4}}],["yy",{"2":{"403":3,"427":2,"428":2}}],["yyyymmdd",{"2":{"403":1}}],["yyyy",{"2":{"403":11,"420":1,"422":1,"423":1,"424":1,"427":4,"428":4,"434":1,"441":4}}],["函数",{"2":{"728":1}}],["函数包控制函数执行流程",{"2":{"488":1}}],["函数中format参数值需要传以下值之一",{"2":{"403":1}}],["函数签名应该是func",{"2":{"652":1}}],["函数签名",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["注",{"0":{"403":1},"1":{"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1}}],["按字段对结构切片进行排序",{"2":{"690":1}}],["按照less函数确定的升序规则对切片进行排序",{"2":{"689":1}}],["按照size参数均分slice",{"2":{"639":1}}],["按行读取文件内容",{"2":{"464":1}}],["按节点层次遍历树节点",{"2":{"394":1}}],["按后序遍历树节点",{"2":{"393":1}}],["按中序遍历树节点",{"2":{"392":1}}],["按前序遍历树节点",{"2":{"391":1}}],["按顺序返回列表中元素的迭代器",{"2":{"274":1}}],["中文",{"2":{"784":2}}],["中",{"2":{"387":1}}],["中元素不重复",{"2":{"330":1}}],["一个指向左节点的左指针和一个指向右节点的右指针",{"2":{"381":1}}],["树是树节点的集合",{"2":{"381":1}}],["使",{"2":{"911":1}}],["使栈为空",{"2":{"370":1,"379":1}}],["使用时需要导入相应的包名",{"2":{"907":1}}],["使用powershell",{"2":{"807":1}}],["使用参数`replacechar`隐藏源字符串中的一些字符",{"2":{"791":1}}],["使用关联累加函数对stream的元素执行reduce操作",{"2":{"725":1}}],["使用快速排序算法",{"2":{"688":1}}],["使用sendrequest",{"2":{"586":1,"587":1,"588":1,"589":1,"590":1}}],["使用strconv",{"2":{"67":1}}],["使用给定的比较器函数返回切片的最小值",{"2":{"549":1}}],["使用给定的比较器函数返回切片的最大值",{"2":{"547":1}}],["使用绝对路径创建嵌套目录",{"2":{"453":1}}],["使用",{"0":{"440":1,"656":1,"658":1,"666":1,"667":1,"692":1},"2":{"807":1,"906":2}}],["使用des",{"2":{"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1}}],["使用aes",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1}}],["使用json",{"2":{"82":1}}],["链表实现的栈结构",{"2":{"371":1}}],["链表实现普通队列数据结构",{"2":{"299":1}}],["链表栈",{"0":{"360":1},"2":{"355":1}}],["栈数据结构",{"2":{"355":1}}],["且不同时存在于两个集合中",{"2":{"352":1}}],["终止遍历",{"2":{"348":1,"663":1}}],["比较日期",{"2":{"398":1}}],["比较两个集合是否相等",{"2":{"346":1}}],["比较一个列表和另一个列表",{"2":{"257":1}}],["克隆一个集合",{"2":{"345":1}}],["否则",{"2":{"532":1}}],["否则不做任何操作",{"2":{"340":1}}],["否则返回空字符串",{"2":{"481":1}}],["否则返回true",{"2":{"58":1}}],["否则返回false",{"2":{"52":1,"452":1}}],["不会消除重复元素",{"2":{"675":1}}],["不进行四舍五入",{"2":{"553":1}}],["不存在于mapb",{"2":{"518":1}}],["不做任何操作",{"2":{"339":1}}],["不包含",{"2":{"169":1,"276":1}}],["向csv文件写入内容",{"2":{"473":1}}],["向集合中添加元素",{"2":{"338":1}}],["向堆中插入数据",{"2":{"194":1}}],["集合数据结构",{"2":{"330":1}}],["移除队列的头元素并返回",{"2":{"291":1,"303":1,"314":1,"326":1}}],["移除此列表中指定位置的元素",{"2":{"163":1}}],["包",{"2":{"907":1,"908":1}}],["包封装了一个抽象的struct结构体",{"2":{"735":1}}],["包包含操作切片的方法集合",{"2":{"630":1}}],["包包括一些操作",{"2":{"502":1}}],["包支持一些指针类型的操作",{"2":{"596":1}}],["包支持文件基本操作",{"2":{"446":1}}],["包实现了一些数学计算的函数",{"2":{"537":1}}],["包括arraystack",{"2":{"355":1}}],["包括arrayqueue",{"2":{"278":1}}],["包含常用字符串格式验证函数",{"2":{"850":1}}],["包含处理字符串的相关函数",{"2":{"753":1}}],["包含n个传入的item",{"2":{"682":1}}],["包含部分函数式编程",{"2":{"488":1}}],["包含相同元素为相等",{"2":{"346":1}}],["包含",{"2":{"169":1,"276":1,"722":1,"795":1}}],["包含25个包",{"2":{"0":1}}],["队列数据结构",{"2":{"278":1}}],["基于键",{"2":{"525":1}}],["基于切片创建集合",{"2":{"336":1}}],["基于iteratee函数将列表转换为映射map",{"2":{"275":1}}],["基于传入的相等函数线性查找元素",{"2":{"16":1}}],["差集运算",{"2":{"269":1}}],["列表去除重复数据项",{"2":{"266":1}}],["反转切片中的元素顺序",{"2":{"676":1}}],["反转列表的数据项顺序",{"2":{"265":1}}],["反转链表所有节点顺序",{"2":{"217":1,"232":1}}],["js的启发",{"2":{"910":1}}],["jsonplaceholder",{"2":{"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["json字符串",{"2":{"482":1}}],["json",{"2":{"76":1,"586":2,"587":2,"588":6,"589":2,"590":6,"591":4}}],["je",{"2":{"779":4,"780":2}}],["join",{"0":{"703":1},"2":{"633":1,"703":6}}],["jpg",{"2":{"592":4,"593":2}}],["j++",{"2":{"530":2,"531":2,"533":2,"534":2,"535":2}}],["jim",{"2":{"473":4}}],["j",{"2":{"264":2,"524":4,"530":6,"531":6,"533":4,"534":6,"535":6,"846":12,"847":4,"848":8,"849":6}}],["清空文件内容",{"2":{"451":1}}],["清空栈元素",{"2":{"370":1,"379":1}}],["清空队列元素",{"2":{"297":1,"308":1,"320":1}}],["清空列表数据",{"2":{"259":1}}],["清空链表所有节点",{"2":{"221":1,"236":1}}],["索引应该在0和列表数据长度",{"2":{"256":1}}],["索引应大于或等于0且小于或等于链接节点数",{"2":{"213":1,"229":1}}],["索引应大于或等于0且小于或等于链表节点数",{"2":{"210":1,"226":1}}],["更新索引处的切片元素",{"2":{"700":1}}],["更新索引处列表的值",{"2":{"256":1}}],["更多有用的信息可以在truthy中找到",{"2":{"47":1}}],["则它返回一个有效值",{"2":{"905":1}}],["则在左侧填充字符串",{"2":{"771":1}}],["则在左右两侧填充字符串",{"2":{"769":1}}],["则在右侧填充字符串",{"2":{"770":1}}],["则将返回一个空stream",{"2":{"719":1}}],["则停止迭代",{"2":{"536":1}}],["则添加该元素返回true",{"2":{"339":1,"340":1}}],["则不执行任何操作",{"2":{"254":1,"255":1}}],["则返回错误",{"2":{"807":1}}],["则返回零值和false",{"2":{"726":1,"727":1}}],["则返回相应零值",{"2":{"605":1}}],["则返回fallback",{"2":{"604":1}}],["则返回",{"2":{"149":1,"151":1,"171":1,"248":1,"249":1,"250":1,"670":1,"671":1,"787":1}}],["则返回true",{"2":{"57":1,"652":1,"691":1}}],["打印树结构",{"2":{"397":1}}],["打印链表栈结构",{"2":{"380":1}}],["打印链表结构",{"2":{"222":1,"237":1}}],["打印堆的树形结构",{"2":{"199":1}}],["删除单个环境变量",{"2":{"805":1}}],["删除全部空格",{"2":{"794":1}}],["删除字符串中的空格",{"2":{"794":1}}],["删除字符串中不可打印的字符",{"2":{"781":1}}],["删除切片中的重复元素",{"2":{"696":1}}],["删除切片中指定开始索引到结束索引的元素",{"2":{"647":1}}],["删除key",{"2":{"533":1}}],["删除符合predicate函数的key",{"2":{"512":1}}],["删除文件",{"2":{"462":1}}],["删除插入二叉搜索树中指定的值",{"2":{"390":1}}],["删除栈顶元素并返回该元素指针",{"2":{"365":1,"374":1}}],["删除并返回集合中的顶部元素",{"2":{"354":1}}],["删除集合中元素",{"2":{"341":1}}],["删除列表中所有符合函数",{"2":{"277":1}}],["删除列表的最后一个值并返回该值",{"2":{"253":1}}],["删除列表的第一个值并返回该值",{"2":{"252":1}}],["删除索引处列表的值",{"2":{"254":1}}],["删除链表中指定的value值",{"2":{"216":1}}],["删除链表末尾节点",{"2":{"215":1,"231":1}}],["删除链表头节点",{"2":{"214":1,"230":1}}],["删除特定索引处的值",{"2":{"213":1,"229":1}}],["创建新的xerror对象并将消息和id复制到新的对象中",{"2":{"896":1}}],["创建xerror对象实例",{"2":{"893":1}}],["创建一组和tuple10元素相对应的切片",{"2":{"849":1}}],["创建一组和tuple9元素相对应的切片",{"2":{"845":1}}],["创建一组和tuple8元素相对应的切片",{"2":{"841":1}}],["创建一组和tuple7元素相对应的切片",{"2":{"837":1}}],["创建一组和tuple6元素相对应的切片",{"2":{"833":1}}],["创建一组和tuple5元素相对应的切片",{"2":{"829":1}}],["创建一组和tuple4元素相对应的切片",{"2":{"825":1}}],["创建一组和tuple3元素相对应的切片",{"2":{"821":1}}],["创建一组和tuple2元素相对应的切片",{"2":{"817":1}}],["创建一个tuple10元组切片",{"2":{"848":1}}],["创建一个tuple9元组切片",{"2":{"844":1}}],["创建一个tuple8元组切片",{"2":{"840":1}}],["创建一个tuple7元组切片",{"2":{"836":1}}],["创建一个tuple6元组切片",{"2":{"832":1}}],["创建一个tuple5元组切片",{"2":{"828":1}}],["创建一个tuple4元组切片",{"2":{"824":1}}],["创建一个tuple3元组切片",{"2":{"820":1}}],["创建一个tuple2元组切片",{"2":{"816":1}}],["创建一个延迟连接stream",{"2":{"714":1}}],["创建一个stream",{"2":{"713":1}}],["创建一个不包括所有给定值的切片",{"2":{"701":1}}],["创建一个map",{"2":{"665":1}}],["创建一个数字切片",{"2":{"554":1,"555":1}}],["创建一个切片",{"2":{"520":1,"521":1,"644":1,"682":1}}],["创建一个debounced函数",{"2":{"497":1}}],["创建一个函数",{"2":{"493":1,"494":1}}],["创建一个iso8601格式时间字符串的unix时间戳",{"2":{"432":1}}],["创建一个yyyy",{"2":{"431":1}}],["创建一个unix时间戳",{"2":{"430":1}}],["创建一个当前时间的unix时间戳",{"2":{"429":1}}],["创建一个集合",{"2":{"353":1}}],["创建一个传入值的深拷贝",{"2":{"81":1}}],["创建并返回一个stream",{"2":{"715":1}}],["创建元素为指定值的stream",{"2":{"709":1}}],["创建柯里化函数",{"2":{"495":1}}],["创建成功返回true",{"2":{"452":1}}],["创建文件",{"2":{"452":1}}],["创建newdoublylink指针实例",{"2":{"224":1}}],["创建singlylink指针实例",{"2":{"208":1}}],["根据error对象创建xerror对象实例",{"2":{"894":1}}],["根据传入的tuple10切片",{"2":{"849":1}}],["根据传入的tuple9切片",{"2":{"845":1}}],["根据传入的tuple8切片",{"2":{"841":1}}],["根据传入的tuple7切片",{"2":{"837":1}}],["根据传入的tuple6切片",{"2":{"833":1}}],["根据传入的tuple5切片",{"2":{"829":1}}],["根据传入的tuple4切片",{"2":{"825":1}}],["根据传入的tuple3切片",{"2":{"821":1}}],["根据传入的tuple2切片",{"2":{"817":1}}],["根据传入的值",{"2":{"40":1}}],["根据属性名获取一个struct对象的属性",{"2":{"743":1}}],["根据提供的less函数返回stream的最小元素",{"2":{"729":1}}],["根据提供的less函数返回stream的最大元素",{"2":{"728":1}}],["根据predicate函数判断切片是否包含某个值",{"2":{"637":1}}],["根据指定的位置和长度截取字符串",{"2":{"776":1}}],["根据指定的起始值",{"2":{"555":1}}],["根据指定的起始值和数量",{"2":{"554":1}}],["根据指定的格式和时区返回当前时间字符串",{"2":{"441":1}}],["根据key获取value",{"2":{"531":1}}],["根据checker函数判断元素是否在集合中",{"2":{"340":1}}],["根节点的key既大于等于左子树的key值且大于等于右子树的key值",{"2":{"192":1}}],["堆",{"2":{"187":1}}],["堆排序",{"2":{"11":1}}],["对stream的每个元素执行一个操作",{"2":{"724":1}}],["对slice中的每个元素执行map函数以创建一个新切片",{"2":{"672":1}}],["对切片的每个元素调用函数后",{"2":{"699":1}}],["对切片的每个元素调用iteratee函数",{"2":{"697":1}}],["对切片元素执行reduce操作",{"2":{"678":1}}],["对任何有序类型",{"2":{"688":1}}],["对两个切片的元素调用比较函数comparator",{"2":{"654":1}}],["对每个元素执行函数predicate",{"2":{"643":1}}],["对每个key和value执行iteratee函数",{"2":{"184":1}}],["对map中的每对key和value执行iteratee函数",{"2":{"508":1}}],["对列表的每个元素执行给定的操作",{"2":{"273":1}}],["对称差集运算",{"2":{"270":1}}],["对于其他类型",{"2":{"76":1}}],["对于数字",{"2":{"76":1}}],["迭代切片和数组",{"2":{"911":1}}],["迭代切片元素顺序从右至左",{"2":{"679":1}}],["迭代切片的元素",{"2":{"664":1}}],["迭代map",{"2":{"510":1,"511":1,"513":1,"514":1}}],["迭代map中的每对key和value",{"2":{"509":1,"512":1}}],["迭代结合",{"2":{"347":1}}],["迭代hashmap",{"2":{"184":1}}],["迭代器等等",{"2":{"0":1}}],["在windows中",{"2":{"807":1}}],["在linux中",{"2":{"807":1}}],["在不分配内存的情况下将字节切片转换为字符串",{"2":{"783":1}}],["在不分配内存的情况下将字符串转换为字节片",{"2":{"782":1}}],["在丢弃stream的前n个元素后",{"2":{"719":1}}],["在map中设置key和value",{"2":{"530":1}}],["在",{"2":{"387":1}}],["在每个元素上调用函数",{"2":{"347":1}}],["在每个元素上使用",{"2":{"257":1}}],["在索引处插入值到列表中",{"2":{"255":1}}],["在hashmap中根据key获取值",{"2":{"180":1}}],["在当前目录下创建rsa私钥文件和公钥文件",{"2":{"130":1}}],["新建指定容量和长度的hashmap指针实例",{"2":{"179":1}}],["新建默认容量",{"2":{"178":1}}],["的实用方法非常适合",{"2":{"911":1}}],["的泛型重写了大部分函数",{"2":{"906":1}}],["的范围内",{"2":{"722":1}}],["的切片进行排序",{"2":{"688":1}}],["的函数",{"2":{"502":1}}],["的日期字符串",{"2":{"434":1}}],["的元素",{"2":{"277":1}}],["的hashmap指针实例",{"2":{"178":1}}],["的长度",{"2":{"140":1}}],["数学",{"2":{"911":1}}],["数字",{"2":{"688":1}}],["数字或字符串",{"2":{"688":1}}],["数字+字母",{"2":{"617":1}}],["数据结构实现",{"2":{"173":1}}],["数组栈",{"0":{"359":1},"2":{"355":1}}],["数组",{"2":{"76":1}}],["左闭右开",{"2":{"169":1}}],["和linkedstack",{"2":{"355":1}}],["和toindex",{"2":{"276":1}}],["和列表数据长度之间",{"2":{"255":1}}],["和",{"2":{"169":1}}],["和error",{"2":{"73":1}}],["从error对象中解构出xerror",{"2":{"895":1}}],["从字符串的开头和结尾去除空格",{"2":{"789":1}}],["从通道创建stream",{"2":{"711":1}}],["从切片创建stream",{"2":{"710":1}}],["从切片的尾部删除n个元素",{"2":{"649":1,"651":1}}],["从切片的头部删除n个元素",{"2":{"648":1,"650":1}}],["从遍历slice的元素",{"2":{"659":1}}],["从指定的server地址下载文件",{"2":{"592":1}}],["从右至左组合函数列表fnlist",{"2":{"496":1}}],["从列表中删除给定列表中包含的所有元素",{"2":{"272":1}}],["从该列表中删除索引介于",{"2":{"169":1}}],["从此列表中删除第一个出现的指定元素",{"2":{"165":1,"167":1}}],["是以包的结构组织代码的",{"2":{"907":1}}],["是否包含某个元素",{"2":{"153":1}}],["是一个线程安全的",{"2":{"133":1}}],["是一个功能强大",{"2":{"0":1,"910":1}}],["判断传入的参数值是否为零值",{"2":{"885":1}}],["判断传入参数的数据类型是否为字符串",{"2":{"766":1}}],["判断字符串是否包括给定的子字符串切片中任意一个子字符串",{"2":{"793":1}}],["判断字符串是否包括全部给定的子字符串切片",{"2":{"792":1}}],["判断属性是否是切片",{"2":{"752":1}}],["判断属性是否为零值",{"2":{"749":1}}],["判断属性是否为嵌入",{"2":{"747":1}}],["判断属性是否导出",{"2":{"748":1}}],["判断是否为一个合法的struct对象",{"2":{"744":1}}],["判断stream的元素是否全部不匹配指定的判定函数",{"2":{"732":1}}],["判断stream的所有元素是否全部匹配指定判定函数",{"2":{"730":1}}],["判断stream是否包含匹配指定判定函数的元素",{"2":{"731":1}}],["判断slice是否包含subslice",{"2":{"638":1}}],["判断slice是否包含value",{"2":{"636":1}}],["判断ip是否是局域网ip",{"2":{"580":1}}],["判断ip是否是公共ip",{"2":{"579":1}}],["判断质数",{"2":{"559":1}}],["判断参数是否是目录",{"2":{"460":1}}],["判断文件是否是zip压缩文件",{"2":{"468":1}}],["判断文件是否是符号链接",{"2":{"459":1}}],["判断文件或目录是否存在",{"2":{"458":1}}],["判断日期是否是周末",{"2":{"440":1}}],["判断给定树是否是子树",{"2":{"396":1}}],["判断栈是否为空",{"2":{"369":1,"378":1}}],["判断集合是否为空",{"2":{"349":1}}],["判断集合是否包含另一个集合",{"2":{"343":1}}],["判断集合是否包含某个值",{"2":{"342":1}}],["判断队列是否包含某个值",{"2":{"298":1,"309":1,"321":1}}],["判断对了是否为满",{"2":{"296":1,"319":1,"328":1}}],["判断对了是否为空",{"2":{"295":1,"307":1,"318":1,"327":1}}],["判断列表是否为空",{"2":{"258":1}}],["判断列表中是否包含特定值",{"2":{"244":1}}],["判断链表是否为空",{"2":{"220":1,"235":1}}],["判断hashmap中是否包含指定的key",{"2":{"183":1}}],["判断",{"2":{"153":1}}],["直到函数运行成功",{"2":{"629":1}}],["直到关闭返回的",{"2":{"499":1}}],["直到取消上下文",{"2":{"38":1,"39":1,"41":1,"42":1,"44":1,"45":1,"46":1}}],["直接读取原来的切片",{"2":{"133":1}}],["再将新的切片赋值给原来的切片",{"2":{"133":1}}],["写入完成后",{"2":{"133":1}}],["写入时",{"2":{"133":1}}],["底层使用",{"2":{"133":1}}],["用另一个字符串解开包裹一个字符串",{"2":{"778":1}}],["用另一个字符串包裹一个字符串",{"2":{"777":1}}],["用指定的分隔符链接切片元素",{"2":{"703":1}}],["用于删除重复的项",{"2":{"715":1}}],["用于代替以下样板代码",{"2":{"528":1}}],["用于比较队列中t类型的值",{"2":{"323":1}}],["用逗号每隔3位分割数字",{"2":{"481":1}}],["用切片实现栈结构",{"2":{"362":1}}],["用go切片实现",{"2":{"238":1}}],["用私钥文件rsa解密数据",{"2":{"132":1}}],["用公钥文件ras加密数据",{"2":{"131":1}}],["用法",{"0":{"3":1,"20":1,"32":1,"49":1,"62":1,"88":1,"135":1,"175":1,"189":1,"202":1,"240":1,"280":1,"332":1,"357":1,"383":1,"400":1,"448":1,"478":1,"490":1,"504":1,"539":1,"569":1,"598":1,"608":1,"622":1,"632":1,"706":1,"737":1,"755":1,"797":1,"811":1,"852":1,"890":1,"907":1}}],["qs",{"2":{"572":4}}],["q",{"2":{"288":4,"289":6,"290":12,"291":14,"292":14,"293":14,"294":12,"295":14,"296":14,"297":14,"298":14,"300":4,"301":6,"302":12,"303":14,"304":14,"305":14,"306":12,"307":14,"308":14,"309":14,"311":4,"312":6,"313":12,"314":14,"315":14,"316":14,"317":12,"318":14,"319":14,"320":14,"321":14,"323":4,"324":6,"325":6,"326":6,"327":8,"328":8,"329":8}}],["qvtghdzf6klavt4po0gs2a6pq00=",{"2":{"125":2}}],["queryvalues",{"2":{"585":2}}],["queryparams",{"2":{"581":2}}],["query",{"2":{"573":1,"577":2}}],["queuenode",{"2":{"300":8}}],["queue",{"0":{"278":1},"1":{"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1},"2":{"279":4,"280":4,"288":6,"289":6,"290":6,"291":6,"292":6,"293":6,"294":6,"295":6,"296":6,"297":6,"298":6,"300":6,"301":6,"302":6,"303":6,"304":6,"305":6,"306":6,"307":6,"308":6,"309":6,"311":6,"312":6,"313":6,"314":6,"315":6,"316":6,"317":6,"318":6,"319":6,"320":6,"321":6,"323":6,"324":6,"325":6,"326":6,"327":6,"328":6,"329":6}}],["quicksort",{"0":{"10":1},"2":{"4":1,"10":4}}],["quot",{"2":{"3":4,"6":8,"7":28,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":8,"15":8,"16":8,"17":8,"20":4,"23":36,"24":16,"25":16,"26":24,"27":16,"28":24,"29":8,"32":4,"37":8,"38":12,"39":12,"40":12,"41":12,"42":16,"43":16,"44":12,"45":12,"46":12,"49":4,"52":16,"53":20,"54":20,"55":8,"56":8,"57":8,"58":8,"59":8,"62":4,"65":12,"66":8,"67":44,"68":12,"69":20,"70":8,"71":32,"72":24,"73":36,"74":16,"75":8,"76":12,"77":16,"78":36,"79":12,"80":8,"81":24,"82":136,"83":20,"84":16,"85":12,"88":4,"91":16,"92":16,"93":16,"94":16,"95":16,"96":16,"97":16,"98":16,"99":16,"100":12,"101":12,"102":16,"103":16,"104":16,"105":16,"106":16,"107":16,"108":16,"109":16,"110":16,"111":16,"112":16,"113":16,"114":16,"115":16,"116":16,"117":16,"118":16,"119":12,"120":12,"121":8,"122":12,"123":12,"124":12,"125":12,"126":12,"127":12,"128":12,"129":12,"130":16,"131":28,"132":28,"135":4,"139":8,"141":8,"143":8,"145":8,"148":8,"150":8,"152":8,"154":8,"156":8,"158":8,"160":8,"162":8,"164":8,"166":8,"168":8,"170":8,"172":8,"175":4,"178":8,"179":8,"180":12,"181":16,"182":24,"183":20,"184":20,"185":32,"186":20,"189":4,"193":8,"194":8,"195":8,"196":8,"197":8,"198":8,"199":8,"202":4,"208":8,"209":8,"210":8,"211":8,"212":8,"213":8,"214":8,"215":8,"216":8,"217":8,"218":8,"219":8,"220":8,"221":8,"222":8,"224":8,"225":8,"226":8,"227":8,"228":8,"229":8,"230":8,"231":8,"232":8,"233":8,"234":8,"235":8,"236":8,"237":8,"240":4,"243":8,"244":8,"245":8,"246":8,"247":8,"248":8,"249":8,"250":8,"251":8,"252":8,"253":8,"254":8,"255":8,"256":8,"257":8,"258":8,"259":8,"260":8,"261":8,"262":8,"263":8,"264":8,"265":8,"266":8,"267":8,"268":8,"269":8,"270":8,"271":8,"272":8,"273":8,"274":8,"275":8,"276":8,"277":8,"280":4,"288":8,"289":8,"290":8,"291":8,"292":8,"293":8,"294":8,"295":8,"296":8,"297":8,"298":8,"300":8,"301":8,"302":8,"303":8,"304":8,"305":8,"306":8,"307":8,"308":8,"309":8,"311":8,"312":8,"313":8,"314":8,"315":8,"316":8,"317":8,"318":8,"319":8,"320":8,"321":8,"323":8,"324":8,"325":8,"326":8,"327":8,"328":8,"329":8,"332":4,"335":8,"336":8,"337":8,"338":8,"339":8,"340":8,"341":8,"342":8,"343":8,"344":8,"345":8,"346":8,"347":8,"348":8,"349":8,"350":8,"351":8,"352":8,"353":8,"354":8,"357":4,"363":8,"364":8,"365":8,"366":8,"367":8,"368":8,"369":8,"370":8,"372":8,"373":8,"374":8,"375":8,"376":8,"377":8,"378":8,"379":8,"380":8,"383":4,"388":8,"389":8,"390":8,"391":8,"392":8,"393":8,"394":8,"395":8,"396":8,"397":8,"400":4,"404":12,"405":12,"406":12,"407":12,"408":12,"409":12,"410":12,"411":12,"412":12,"413":12,"414":12,"415":12,"416":12,"417":12,"418":12,"419":12,"420":8,"421":8,"422":8,"423":8,"424":8,"425":8,"426":8,"427":32,"428":32,"429":8,"430":8,"431":12,"432":12,"433":8,"434":12,"435":16,"436":12,"437":8,"438":8,"439":8,"440":8,"441":20,"442":8,"443":8,"444":8,"445":8,"448":4,"451":12,"452":12,"453":12,"454":16,"455":8,"456":12,"457":20,"458":16,"459":12,"460":16,"461":12,"462":12,"463":20,"464":28,"465":16,"466":16,"467":16,"468":12,"469":12,"470":12,"471":20,"472":12,"473":36,"474":16,"475":16,"478":4,"481":28,"482":40,"483":32,"484":8,"485":8,"486":24,"487":24,"490":4,"493":12,"494":12,"495":8,"496":12,"497":8,"498":12,"499":8,"500":8,"501":8,"504":4,"507":68,"508":24,"509":28,"510":36,"511":28,"512":28,"513":36,"514":28,"515":48,"516":28,"517":24,"518":32,"519":28,"520":24,"521":52,"522":24,"523":24,"524":24,"525":20,"526":24,"527":28,"528":32,"529":8,"530":16,"531":16,"532":12,"533":16,"534":20,"535":16,"536":12,"539":4,"542":8,"543":8,"544":8,"545":8,"546":8,"547":32,"548":8,"549":32,"550":8,"551":8,"552":8,"553":8,"554":8,"555":8,"556":8,"557":8,"558":8,"559":8,"560":8,"561":8,"562":8,"563":8,"564":8,"565":8,"566":8,"569":4,"572":20,"573":12,"574":12,"575":12,"576":12,"577":56,"578":20,"579":24,"580":24,"581":44,"582":16,"583":40,"584":40,"585":44,"586":28,"587":48,"588":48,"589":24,"590":48,"591":48,"592":16,"593":16,"594":16,"595":24,"598":4,"601":12,"602":12,"603":8,"604":20,"605":12,"608":4,"611":8,"612":8,"613":8,"614":8,"615":8,"616":8,"617":8,"618":8,"619":8,"622":4,"625":24,"626":20,"627":20,"628":20,"629":20,"632":4,"635":32,"636":24,"637":44,"638":48,"639":28,"640":24,"641":24,"642":8,"643":8,"644":8,"645":8,"646":8,"647":44,"648":56,"649":56,"650":8,"651":8,"652":8,"653":8,"654":8,"655":8,"656":8,"657":8,"658":8,"659":8,"660":24,"661":24,"662":8,"663":8,"664":8,"665":8,"666":8,"667":32,"668":8,"669":96,"670":32,"671":32,"672":8,"673":24,"674":32,"675":8,"676":24,"677":8,"678":16,"679":16,"680":64,"681":32,"682":12,"683":8,"684":8,"685":8,"686":8,"687":44,"688":36,"689":24,"690":28,"691":8,"692":32,"693":8,"694":20,"695":16,"696":20,"697":8,"698":8,"699":8,"700":88,"701":8,"702":20,"703":16,"706":4,"709":8,"710":8,"711":8,"712":8,"713":8,"714":8,"715":8,"716":8,"717":8,"718":12,"719":8,"720":8,"721":8,"722":8,"723":8,"724":8,"725":8,"726":8,"727":8,"728":8,"729":8,"730":8,"731":8,"732":8,"733":8,"734":8,"737":4,"740":12,"741":16,"742":16,"743":20,"744":16,"745":20,"746":20,"747":20,"748":20,"749":16,"750":16,"751":16,"752":12,"755":4,"758":48,"759":48,"760":40,"761":40,"762":28,"763":28,"764":28,"765":28,"766":20,"767":24,"768":24,"769":64,"770":64,"771":64,"772":12,"773":28,"774":28,"775":48,"776":32,"777":40,"778":48,"779":32,"780":32,"781":16,"782":12,"783":8,"784":20,"785":36,"786":36,"787":32,"788":28,"789":20,"790":24,"791":28,"792":28,"793":36,"794":12,"797":4,"800":8,"801":8,"802":8,"803":20,"804":20,"805":28,"806":24,"807":48,"808":8,"811":4,"814":12,"815":12,"816":8,"817":12,"818":16,"819":16,"820":12,"821":16,"822":16,"823":16,"824":12,"825":16,"826":16,"827":16,"828":12,"829":16,"830":16,"831":16,"832":12,"833":16,"834":20,"835":20,"836":16,"837":20,"838":24,"839":24,"840":20,"841":24,"842":28,"843":28,"844":20,"845":24,"846":32,"847":32,"848":20,"849":24,"852":4,"855":20,"856":20,"857":20,"858":20,"859":20,"860":20,"861":20,"862":28,"863":16,"864":16,"865":16,"866":16,"867":16,"868":20,"869":16,"870":20,"871":16,"872":16,"873":16,"874":24,"875":24,"876":24,"877":32,"878":16,"879":24,"880":16,"881":16,"882":16,"883":20,"884":16,"885":16,"886":16,"887":28,"890":4,"893":12,"894":16,"895":32,"896":28,"897":24,"898":24,"899":32,"900":32,"901":24,"902":16,"903":32,"904":12,"905":20,"907":4,"908":12}}],["获取属性kind",{"2":{"751":1}}],["获取属性名",{"2":{"750":1}}],["获取`field`属性的值",{"2":{"746":1}}],["获取`field`的`tag`",{"2":{"745":1}}],["获取一个struct对象的属性列表",{"2":{"742":1}}],["获取http请求ip",{"2":{"578":1}}],["获取公网ip信息",{"2":{"577":1}}],["获取mac地址列",{"2":{"576":1}}],["获取ipv4地址列表",{"2":{"575":1}}],["获取内部ip",{"2":{"574":1}}],["获取key命名的环境变量值并与compareenv进行比较",{"2":{"806":1}}],["获取key命名的环境变量的值",{"2":{"803":1}}],["获取key",{"2":{"534":1}}],["获取函数执行的时间",{"2":{"501":1}}],["获取文件mime类型",{"2":{"457":1}}],["获取文件mode信息",{"2":{"456":1}}],["获取文件md5值",{"2":{"123":1}}],["获取午夜时间戳",{"2":{"426":1}}],["获取零点时间戳",{"2":{"425":1}}],["获取当前操作系统位数",{"2":{"808":1}}],["获取当时日期和时间",{"2":{"422":1}}],["获取当时时间",{"2":{"421":1}}],["获取当天日期",{"2":{"420":1}}],["获取树的深度",{"2":{"395":1}}],["获取集合中元素的个数",{"2":{"344":1}}],["获取集合中所有元素的切片",{"2":{"337":1}}],["获取队列元素的数量",{"2":{"294":1,"306":1,"317":1,"329":1}}],["获取队列所有元素的切片",{"2":{"289":1,"301":1,"312":1,"324":1}}],["获取对列尾部元素",{"2":{"293":1,"305":1,"316":1}}],["获取对列头部元素",{"2":{"292":1,"304":1,"315":1}}],["获取链表节点数量",{"2":{"219":1,"234":1}}],["获取链表中部节点",{"2":{"218":1,"233":1}}],["获取byte",{"2":{"121":1,"122":1}}],["获取字符串sha1",{"2":{"125":1}}],["获取字符串sha1值",{"2":{"124":1}}],["获取字符串sha512值",{"2":{"128":1}}],["获取字符串sha512",{"2":{"117":1,"118":1,"129":1}}],["获取字符串sha256值",{"2":{"126":1}}],["获取字符串sha256",{"2":{"115":1,"116":1,"127":1}}],["获取字符串的sha1",{"2":{"113":1,"114":1}}],["获取字符串md5值",{"2":{"119":1}}],["获取字符串md5",{"2":{"111":1,"112":1,"120":1}}],["\\terr2",{"2":{"896":2}}],["\\toption",{"2":{"807":2}}],["\\tvar",{"2":{"604":4,"605":4}}],["\\tvalue",{"2":{"208":2,"224":2,"300":2,"372":2,"388":2}}],["\\tval2",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\tval1",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\tb",{"2":{"604":2,"605":2}}],["\\tbstree",{"2":{"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"397":6}}],["\\ta",{"2":{"604":2,"605":2}}],["\\twg2",{"2":{"530":4,"531":4,"533":2,"534":2,"535":2}}],["\\tsubtree",{"2":{"396":4}}],["\\tsupertree",{"2":{"396":10}}],["\\tsize",{"2":{"288":2,"323":2}}],["\\tright",{"2":{"388":2}}],["\\troot",{"2":{"388":2}}],["\\tresult4",{"2":{"604":2,"605":2}}],["\\tresult1",{"2":{"604":2,"605":2}}],["\\tresult3",{"2":{"566":2,"604":2,"605":2}}],["\\tresult2",{"2":{"441":2,"566":2,"604":2,"605":2}}],["\\trear",{"2":{"311":2}}],["\\treturn",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\ttop",{"2":{"372":2}}],["\\ttail",{"2":{"288":2,"300":2}}],["\\tcapacity",{"2":{"288":2,"311":2}}],["\\tcomparator",{"2":{"193":2,"323":2,"388":2}}],["\\titems",{"2":{"288":2,"323":2}}],["\\tif",{"2":{"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["\\thead",{"2":{"208":2,"224":2,"288":2,"300":2}}],["\\thms",{"2":{"118":2}}],["\\tnext",{"2":{"208":2,"224":2,"300":2,"372":2}}],["\\t\\t\\twg2",{"2":{"530":2,"531":2}}],["\\t\\tq",{"2":{"325":2,"326":2,"327":2,"328":2,"329":2}}],["\\t\\tmaxheap",{"2":{"194":2,"195":2,"196":2,"197":2,"198":2,"199":2}}],["\\t\\treturn",{"2":{"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4}}],["\\tfront",{"2":{"311":2}}],["\\tfor",{"2":{"194":2,"195":2,"196":2,"197":2,"198":2,"199":2}}],["\\tfmt",{"2":{"118":2,"120":2,"121":2,"122":2,"125":2,"127":2,"129":2,"143":2,"150":2,"152":2,"158":2,"162":2,"164":2,"566":6,"604":8,"605":8,"896":2}}],["\\tdata",{"2":{"193":2,"311":2,"363":2}}],["\\tleft",{"2":{"388":2}}],["\\tlength",{"2":{"208":2,"224":2,"300":2,"363":2,"372":2}}],["\\tlist",{"2":{"162":2,"164":2}}],["\\tl",{"2":{"139":2,"143":2,"150":2,"152":2,"158":4,"162":2,"164":2,"168":2}}],["\\t",{"2":{"118":4,"120":4,"121":4,"122":4,"125":4,"127":4,"129":4,"143":4,"145":4,"162":4,"164":4,"166":4,"168":4,"170":4,"172":4,"193":4,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6,"325":6,"326":6,"327":6,"328":6,"329":6,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"566":8,"604":10,"605":10,"896":4}}],["\\tkey",{"2":{"118":2}}],["解构xeerror为error对象",{"2":{"897":1}}],["解析http响应体到目标结构体",{"2":{"584":1}}],["解码base64字符串",{"2":{"101":1}}],["解码字节切片到目标对象",{"2":{"80":1}}],["解密数据",{"2":{"95":1,"106":1}}],["参数value必须是数字或者可以转为数字的字符串",{"2":{"481":1}}],["参数`command`是一个完整的命令字符串",{"2":{"807":1}}],["参数`shatype`",{"2":{"471":1}}],["参数`key`的长度是8",{"2":{"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1}}],["参数`key`的长度是16",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1}}],["参数的类型必须是string或者",{"2":{"457":1}}],["参数格式参考注1",{"2":{"427":1,"428":1}}],["参数",{"2":{"323":1}}],["参数comparator需要实现包lancetconstraints",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1}}],["支持链式操作",{"2":{"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1}}],["支持前缀添加符号",{"2":{"481":1}}],["支持",{"2":{"86":1}}],["无法克隆结构体的非导出字段",{"2":{"81":1}}],["目前最新的",{"2":{"906":1}}],["目标对象需要传入一个指针实例",{"2":{"80":1}}],["目录",{"0":{"4":1,"21":1,"33":1,"50":1,"63":1,"89":1,"136":1,"176":1,"190":1,"203":1,"241":1,"281":1,"333":1,"358":1,"384":1,"401":1,"449":1,"479":1,"491":1,"505":1,"540":1,"570":1,"599":1,"609":1,"623":1,"633":1,"707":1,"738":1,"756":1,"798":1,"812":1,"853":1,"891":1},"1":{"34":1,"204":1,"205":1,"282":1,"283":1,"284":1,"285":1,"359":1,"360":1,"385":1}}],["+$`",{"2":{"878":4}}],["+3e2",{"2":{"876":2}}],["+3",{"2":{"874":2,"875":2,"876":2}}],["+0000",{"2":{"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"428":6}}],["+=",{"2":{"348":2,"508":2,"509":2,"663":2,"724":2}}],["+xhyydsm",{"2":{"118":2}}],["+",{"2":{"78":4,"495":2,"500":2,"520":2,"523":2,"645":2,"672":2,"674":2,"677":2,"678":4,"679":2,"717":2,"725":2,"882":2,"884":1}}],["转为切片",{"2":{"78":1}}],["转换器包支持一些常见的数据类型转换",{"2":{"60":1}}],["`^",{"2":{"878":4}}],["`struct`结构体的构造函数",{"2":{"740":1}}],["`sortorder`",{"2":{"688":1}}],["`desc`",{"2":{"688":1}}],["`format`",{"2":{"427":1,"428":1}}],["`comarator`",{"2":{"323":1}}],["`",{"2":{"77":2,"82":42,"483":4,"507":12,"577":24,"583":8,"584":8,"585":6,"588":6,"590":6,"591":8,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2}}],["`json",{"2":{"77":2,"82":42,"483":4,"507":12,"577":24,"583":8,"584":8,"585":6,"588":6,"590":6,"591":8,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2}}],["只支持字母字符单词",{"2":{"779":1,"780":1}}],["只包含字母",{"2":{"613":1}}],["只会转换struct中可导出的字段",{"2":{"77":1}}],["只检查值",{"2":{"24":1}}],["映射",{"2":{"76":1}}],["切片长度相同",{"2":{"653":1}}],["切片实现的额优先级队列",{"2":{"322":1}}],["切片实现的循环队列",{"2":{"310":1}}],["切片实现的二叉堆数据结构",{"2":{"187":1}}],["切片实现普通队列数据结构",{"2":{"287":1}}],["切片",{"2":{"76":1,"133":1,"245":1,"911":1}}],["切片处理",{"2":{"0":1}}],["会覆盖原有的文件",{"2":{"454":1}}],["会复制一份新的切片",{"2":{"133":1}}],["会返回",{"2":{"73":1}}],["会返回0和error",{"2":{"71":1,"72":1}}],["会调用该方法并返回",{"2":{"52":1}}],["颜色值rgb转十六进制",{"2":{"66":1}}],["颜色值十六进制转rgb",{"2":{"65":1}}],["三元运算符",{"2":{"59":1}}],["异或的取反操作",{"2":{"56":1}}],["逻辑异或操作",{"2":{"55":1}}],["逻辑或操作",{"2":{"54":1}}],["逻辑且操作",{"2":{"53":1}}],["u0000",{"2":{"887":2}}],["u00a0",{"2":{"781":2}}],["u200bworld",{"2":{"781":2}}],["uuid",{"2":{"618":4}}],["uuidv4",{"0":{"618":1},"2":{"609":1,"618":4}}],["urlencoded",{"2":{"587":2}}],["url",{"2":{"581":6,"585":2,"586":6,"587":6,"588":6,"589":6,"590":6,"591":4,"592":2}}],["urladdr",{"2":{"573":4}}],["urlstr",{"2":{"573":2}}],["uintfunc",{"2":{"545":1}}],["uint",{"2":{"483":2,"545":3,"627":2,"689":2,"690":3,"776":2}}],["uint64",{"2":{"179":6,"486":2,"487":2}}],["username",{"2":{"896":4,"897":4,"903":4}}],["users",{"2":{"689":8,"690":6}}],["userid",{"2":{"581":2,"583":4,"584":4,"585":8,"587":2,"588":4,"590":4,"591":4}}],["user",{"2":{"483":8,"689":6,"690":4}}],["used",{"2":{"82":14}}],["utc",{"2":{"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"428":6}}],["utf8",{"2":{"84":2,"85":2}}],["utf8data",{"2":{"84":6,"85":6}}],["utf8编码转gbk编码",{"2":{"84":1}}],["utf8togbk",{"0":{"84":1},"2":{"63":1,"84":4,"85":2}}],["unbox",{"0":{"815":1,"819":1,"823":1,"827":1,"831":1,"835":1,"839":1,"843":1,"847":1},"2":{"812":9,"815":4,"819":4,"823":4,"827":4,"831":4,"835":4,"839":4,"843":4,"847":4}}],["unwarpordefault",{"0":{"605":1},"2":{"599":1,"605":8}}],["unwarpor",{"0":{"604":1},"2":{"599":1,"604":8}}],["unwrap",{"0":{"602":1,"778":1,"895":1,"897":1},"2":{"599":1,"602":6,"756":1,"778":12,"891":2,"895":4,"897":4}}],["unzip10",{"0":{"849":1},"2":{"812":1,"849":4}}],["unzip9",{"0":{"845":1},"2":{"812":1,"845":4}}],["unzip8",{"0":{"841":1},"2":{"812":1,"841":4}}],["unzip7",{"0":{"837":1},"2":{"812":1,"837":4}}],["unzip6",{"0":{"833":1},"2":{"812":1,"833":4}}],["unzip5",{"0":{"829":1},"2":{"812":1,"829":4}}],["unzip4",{"0":{"825":1},"2":{"812":1,"825":4}}],["unzip3",{"0":{"821":1},"2":{"812":1,"821":4}}],["unzip2",{"0":{"817":1},"2":{"812":1,"817":4}}],["unzip",{"0":{"467":1},"2":{"449":1,"467":4}}],["unit",{"2":{"871":1}}],["unix",{"2":{"429":2,"430":4,"431":2,"432":2,"470":1}}],["unionby",{"0":{"699":1},"2":{"633":1,"699":4}}],["union",{"0":{"267":1,"350":1,"698":1},"2":{"241":1,"267":4,"333":1,"350":4,"633":1,"698":4}}],["uniqueby",{"0":{"697":1},"2":{"633":1,"697":4}}],["unique",{"0":{"266":1,"696":1},"2":{"241":1,"266":4,"633":1,"696":4}}],["unexported",{"2":{"81":4}}],["uppersnakecase",{"0":{"774":1},"2":{"756":1,"774":4}}],["upperfirst",{"0":{"768":1},"2":{"756":1,"768":4}}],["upperkebabcase",{"0":{"764":1},"2":{"756":1,"764":4}}],["uploadfile",{"0":{"593":1},"2":{"570":1,"593":4}}],["updateat",{"0":{"256":1,"700":1},"2":{"241":1,"256":8,"633":1,"700":12}}],["uptime",{"2":{"82":8}}],["ufunc",{"2":{"59":1,"672":1,"673":1,"674":1,"678":1,"679":1}}],["u",{"2":{"53":4,"54":4,"55":4,"56":4,"57":4,"58":4,"59":7,"82":4,"654":6,"665":6,"672":5,"673":5,"674":5,"678":9,"679":9,"702":6}}],["当设置repalceall为true时",{"2":{"794":1}}],["当前切片中不包含值时",{"2":{"635":1}}],["当他被调用n或更多次之后将马上触发fn",{"2":{"493":1}}],["当iteratee函数返回false时",{"2":{"348":1,"663":1}}],["当切仅当a和b都为false时返回false",{"2":{"54":1}}],["当切仅当a和b都为true时返回true",{"2":{"53":1}}],["当任何读取channel关闭时将结束读取",{"2":{"43":1}}],["其他工具",{"2":{"911":1}}],["其他特性请参考api",{"2":{"909":1}}],["其他类型会判断是否是零值",{"2":{"52":1}}],["其元素是第一个stream的所有元素",{"2":{"714":1}}],["其元素是每个map的value调用mapper函数的结果",{"2":{"521":1}}],["其元素是每个map的key调用mapper函数的结果",{"2":{"520":1}}],["其元素不包含在另一个给定切片中",{"2":{"644":1}}],["其元素在原始集中但不在比较集中",{"2":{"353":1}}],["其value不包括给定的value值",{"2":{"514":1}}],["其value都是给定的value值",{"2":{"511":1}}],["其key不包括给定的key值",{"2":{"513":1}}],["其key都是给定的key值",{"2":{"510":1}}],["其中元组的元素和传入切片元素相对应",{"2":{"816":1,"820":1,"824":1,"828":1,"832":1,"836":1,"840":1,"844":1,"848":1}}],["其中元素在第一个集合或第二个集合中",{"2":{"352":1}}],["其中每个元素都由提供的生成器函数生成",{"2":{"713":1}}],["其中每个节点有两个孩子",{"2":{"387":1}}],["其中的元素存在于参数切片中",{"2":{"693":1}}],["其中的key存在于mapa",{"2":{"518":1}}],["其中前n个不重叠的old替换为new",{"2":{"680":1}}],["其值从另一个channel获取",{"2":{"45":1}}],["xgo",{"2":{"906":2}}],["xgqdsmzlkunu0di",{"2":{"114":2}}],["xyz",{"2":{"785":2,"786":2,"869":2}}],["xxx",{"2":{"593":2,"902":2}}],["x2",{"2":{"558":2}}],["x1",{"2":{"558":2}}],["x的n次方",{"2":{"543":1}}],["x",{"2":{"500":14,"543":2,"545":2,"551":2,"552":2,"553":2,"566":2,"578":2,"587":2,"680":24,"681":6,"886":2,"906":12}}],["xufakrxlkna5cz2rebffkg==",{"2":{"120":2,"122":2}}],["xnor",{"0":{"57":1},"2":{"50":1,"57":10}}],["xor",{"0":{"55":1},"2":{"50":1,"55":10}}],["xerrorfunc",{"2":{"894":1,"895":1,"896":1,"898":1,"899":1}}],["xerrortype",{"2":{"893":1}}],["xerror",{"0":{"888":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1},"1":{"889":1,"890":1,"891":1,"892":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1},"2":{"0":1,"888":1,"889":2,"890":2,"891":9,"893":7,"894":7,"895":7,"896":7,"897":6,"898":7,"899":11,"900":10,"901":6,"902":6,"903":6,"904":6,"905":6}}],["感谢carlmjohnson",{"2":{"47":1}}],["并对该数组的每个元素调用trim",{"2":{"790":1}}],["并reduce操作结果",{"2":{"725":1}}],["并根据提供的less函数进行排序",{"2":{"723":1}}],["并在从生成的stream中消耗元素时对每个元素执行所提供的操作",{"2":{"718":1}}],["并比较它们的返回值",{"2":{"645":1}}],["并将结果放入返回的channel",{"2":{"42":1}}],["并发包包含一些支持并发编程的功能",{"2":{"30":1}}],["并发",{"2":{"0":1}}],["将合并所有xerror键和值",{"2":{"901":1}}],["将返回错误",{"2":{"700":1}}],["将返回一次最后调用fn的结果",{"2":{"494":1}}],["将可变参数转为指针切片",{"2":{"695":1}}],["将可变参数转为切片",{"2":{"694":1}}],["将接口切片转换为字符串切片",{"2":{"692":1}}],["将接口切片转换为int切片",{"2":{"666":1}}],["将其中old全部替换为new",{"2":{"681":1}}],["将元素插入到索引处的切片中",{"2":{"669":1}}],["将元素加入链表栈",{"2":{"373":1}}],["将元素加入数组栈",{"2":{"364":1}}],["将切片每个元素调用函数后转为map",{"2":{"702":1}}],["将切片中的元素依次运行iteratee函数",{"2":{"677":1}}],["将切片转换为其它类型切片",{"2":{"674":1}}],["将切片转为map",{"2":{"74":1}}],["将切片转为只读channel",{"2":{"70":1}}],["将切片压平一层",{"2":{"660":1}}],["将两个slice中的每个元素调用iteratee函数",{"2":{"645":1}}],["将该值追加到切片中",{"2":{"635":1}}],["将文件上传指定的server地址",{"2":{"593":1}}],["将http请求响应解码成特定struct值",{"2":{"591":1}}],["将结构体转为url",{"2":{"585":1}}],["将map转换成http查询字符串",{"2":{"572":1}}],["将map转换为其他类型的map",{"2":{"526":1}}],["将map转换为键",{"2":{"524":1}}],["将弧度值转为角度值",{"2":{"557":1}}],["将角度值转为弧度值",{"2":{"556":1}}],["将字节单位字符串转换成其所表示的字节数",{"2":{"486":1,"487":1}}],["将字符串str按字符串delimiter拆分为一个切片",{"2":{"790":1}}],["将字符串偏移idxfrom后",{"2":{"787":1}}],["将字符串拆分为单词",{"2":{"779":1}}],["将字符串的第一个字符转换为小写",{"2":{"767":1}}],["将字符串的第一个字符转换为大写形式",{"2":{"768":1}}],["将字符串的第一个字符转换为大写",{"2":{"765":1}}],["将字符串转换为大写snake",{"2":{"774":1}}],["将字符串转换为大写kebab",{"2":{"764":1}}],["将字符串转换为snake",{"2":{"773":1}}],["将字符串转换为kebab",{"2":{"763":1}}],["将字符串转换为驼峰式字符串",{"2":{"762":1}}],["将字符串写入文件",{"2":{"475":1}}],["将字符串格式化成时间",{"2":{"428":1}}],["将字符串base64编码",{"2":{"100":1}}],["将bytes写入文件",{"2":{"474":1}}],["将日期格式化成字符串",{"2":{"427":1}}],["将日期加",{"2":{"404":1,"405":1,"406":1,"407":1}}],["将值转换为接口切片",{"2":{"667":1}}],["将值转换为字符串",{"2":{"76":1}}],["将值插入二叉搜索树",{"2":{"389":1}}],["将值插入到链表末尾",{"2":{"212":1,"228":1}}],["将值插入到链表表头",{"2":{"211":1,"227":1}}],["将值插入到索引处的链表中",{"2":{"210":1,"226":1}}],["将值附加到列表末尾",{"2":{"251":1}}],["将key",{"2":{"181":1}}],["将指定的key从hashmap中删除",{"2":{"182":1}}],["将指定的元素追加到此列表的末尾",{"2":{"157":1}}],["将指定元素插入此列表中的指定位置",{"2":{"161":1}}],["将指定集合中的所有元素追加到此列表的末尾",{"2":{"159":1}}],["将此列表中指定位置的元素替换为指定元素",{"2":{"144":1}}],["将反射值转换成对应的interface类型",{"2":{"83":1}}],["将data编码成字节切片",{"2":{"79":1}}],["将struct转成map",{"2":{"77":1}}],["将调用",{"2":{"76":1}}],["将转换为字符串",{"2":{"76":1}}],["将interface转成json字符串",{"2":{"73":1}}],["将interface转成int64类型",{"2":{"72":1}}],["将interface转成float64类型",{"2":{"71":1}}],["将一个合法的struct对象转换为map",{"2":{"741":1}}],["将一个channel分成两个channel",{"2":{"46":1}}],["将一个channel读入另一个channel",{"2":{"44":1}}],["将一个或多个channel读取到一个channel中",{"2":{"43":1}}],["将参数`values`重复放入channel",{"2":{"41":1}}],["将多个channel合并为一个channel",{"2":{"39":1}}],["将多个channel链接到一个channel",{"2":{"38":1}}],["返回可打印的xerror对象信息",{"2":{"903":1}}],["返回与pkg",{"2":{"902":1}}],["返回由with设置的键和值的映射",{"2":{"901":1}}],["返回由源stream的元素组成的stream",{"2":{"720":1}}],["返回由源stream的其余元素组成的stream",{"2":{"719":1}}],["返回元组的字段值",{"2":{"815":1,"819":1,"823":1,"827":1,"831":1,"835":1,"839":1,"843":1,"847":1}}],["返回元素与源stream的顺序相反的stream",{"2":{"721":1}}],["返回元素索引",{"2":{"14":1,"15":1,"16":1}}],["返回32或64",{"2":{"808":1}}],["返回命令的stdout和stderr字符串",{"2":{"807":1}}],["返回`str`的副本",{"2":{"788":1}}],["返回有意义单词的数量",{"2":{"780":1}}],["返回字符顺序与给定字符串相反的字符串",{"2":{"772":1}}],["返回字符串中第一个",{"2":{"787":1}}],["返回字符串",{"2":{"552":1}}],["返回字符串切片包含每一行",{"2":{"464":1}}],["返回源字符串中指定字符串最后一次出现时的位置之前的子字符串",{"2":{"761":1}}],["返回源字符串中指定字符串最后一次出现时的位置之后的子字符串",{"2":{"759":1}}],["返回源字符串中指定字符串第一次出现时的位置之前的子字符串",{"2":{"760":1}}],["返回源字符串中特定字符串首次出现时的位置之后的子字符串",{"2":{"758":1}}],["返回stream中的元素切片",{"2":{"734":1}}],["返回stream中元素的数量",{"2":{"733":1}}],["返回set结构体对象",{"2":{"335":1}}],["返回此stream最后一个元素和true",{"2":{"727":1}}],["返回此stream的第一个元素和true",{"2":{"726":1}}],["返回切片的副本",{"2":{"680":1,"681":1}}],["返回切片中通过predicate函数真值测试的所有元素",{"2":{"655":1}}],["返回切片中指定元素的个数",{"2":{"642":1}}],["返回运行结果",{"2":{"677":1}}],["返回在切片中找到最后一个值的索引",{"2":{"671":1}}],["返回在切片中找到值的第一个匹配项的索引",{"2":{"670":1}}],["返回两个切片",{"2":{"664":1}}],["返回两个时间的间隔秒数",{"2":{"438":1}}],["返回最后一个通过predicate函数真值测试的元素",{"2":{"658":1,"659":1}}],["返回最后一个符合函数条件的元素的索引",{"2":{"250":1}}],["返回第一个通过predicate函数真值测试的元素",{"2":{"656":1,"657":1}}],["返回第一个符合函数条件的元素的索引",{"2":{"249":1}}],["返回符合函数返回值为true的元素的个数",{"2":{"643":1}}],["返回符合predicate函数的key",{"2":{"509":1}}],["返回指针的值",{"2":{"604":1,"605":1}}],["返回指定时间的星期结束时间",{"2":{"417":1}}],["返回指定时间的小时结束时间",{"2":{"415":1}}],["返回指定时间的小时开始时间",{"2":{"409":1}}],["返回指定时间的分钟结束时间",{"2":{"414":1}}],["返回指定时间的分钟开始时间",{"2":{"408":1}}],["返回指定时间的当年结束时间",{"2":{"419":1}}],["返回指定时间的当年开始时间",{"2":{"413":1}}],["返回指定时间的当月结束时间",{"2":{"418":1}}],["返回指定时间的当月开始时间",{"2":{"412":1}}],["返回指定时间的当天结束时间",{"2":{"416":1}}],["返回指定时间的当天开始时间",{"2":{"410":1}}],["返回指定时间的每周开始时间",{"2":{"411":1}}],["返回指定的fromindex",{"2":{"276":1}}],["返回指定元素在此列表中最后出现的索引",{"2":{"149":1}}],["返回参数中的最小数",{"2":{"548":1}}],["返回参数中的最大数",{"2":{"546":1}}],["返回参数日期是一年中的第几天",{"2":{"439":1}}],["返回键的现有值",{"2":{"532":1}}],["返回零值",{"2":{"531":1}}],["返回零值并返回false",{"2":{"195":1,"196":1}}],["返回map中所有value的切片",{"2":{"519":1}}],["返回map中所有key的切片",{"2":{"516":1}}],["返回新map",{"2":{"512":1}}],["返回新的列表",{"2":{"261":1}}],["返回组合后的函数",{"2":{"496":1}}],["返回binary标准",{"2":{"485":1}}],["返回bstree指针实例",{"2":{"388":1}}],["返回十进制标准",{"2":{"484":1}}],["返回pretty",{"2":{"482":1}}],["返回文件sha值",{"2":{"471":1}}],["返回文件修改时间",{"2":{"470":1}}],["返回文件字节大小",{"2":{"469":1}}],["返回目录下所有文件名",{"2":{"461":1}}],["返回当前位置的绝对路径",{"2":{"455":1}}],["返回当前纳秒级时间戳",{"2":{"445":1}}],["返回当前微秒级时间戳",{"2":{"444":1}}],["返回当前毫秒级时间戳",{"2":{"443":1}}],["返回当前秒级时间戳",{"2":{"442":1}}],["返回当天结束时间",{"2":{"424":1}}],["返回当天开始时间",{"2":{"423":1}}],["返回iso8601日期字符串",{"2":{"436":1}}],["返回iszero方法返回值的取反",{"2":{"52":1}}],["返回tpl格式指定的日期字符串",{"2":{"435":1}}],["返回true",{"2":{"52":1,"654":1}}],["返回unix时间戳",{"2":{"433":1}}],["返回格式",{"2":{"420":1,"421":1,"422":1,"434":1}}],["返回栈中元素的数量",{"2":{"368":1,"377":1}}],["返回栈中所有元素组成的切片",{"2":{"367":1,"376":1}}],["返回栈顶元素指针",{"2":{"366":1,"375":1}}],["返回arraystack指针实例",{"2":{"363":1}}],["返回具有特定容量的circularqueue指针",{"2":{"311":1}}],["返回具有特定容量的arrayqueue指针",{"2":{"288":1}}],["返回linkedstack指针实例",{"2":{"372":1}}],["返回linkedqueue指针",{"2":{"300":1}}],["返回list中所有数据",{"2":{"245":1}}],["返回list指针实例",{"2":{"243":1}}],["返回删除元素的数量",{"2":{"277":1}}],["返回列表数据容量",{"2":{"263":1}}],["返回列表数据项的数量",{"2":{"262":1}}],["返回列表的一个拷贝",{"2":{"260":1}}],["返回列表中最后一次出现的值的索引",{"2":{"248":1}}],["返回列表中索引处的值指针",{"2":{"155":1,"246":1}}],["返回列表中值的索引",{"2":{"147":1,"247":1}}],["返回列表中指定位置的元素",{"2":{"142":1}}],["返回链表中所有节点值的切片",{"2":{"209":1,"225":1}}],["返回堆中元素的数量",{"2":{"198":1}}],["返回堆中全部元素的切片",{"2":{"197":1}}],["返回堆中最大值",{"2":{"196":1}}],["返回堆中最大值并将其从堆中删除",{"2":{"195":1}}],["返回newmaxheap指针实例",{"2":{"193":1}}],["返回hashmap所有值的切片",{"2":{"186":1}}],["返回hashmap所有key的切片",{"2":{"185":1}}],["返回",{"2":{"140":1}}],["返回一个由源stream的元素组成的stream",{"2":{"718":1}}],["返回一个stream",{"2":{"717":1,"722":1,"723":1}}],["返回一个通过判定函数的stream",{"2":{"716":1}}],["返回一个切片",{"2":{"693":1}}],["返回一个将filter和map操作应用于给定切片的切片",{"2":{"673":1}}],["返回一个map",{"2":{"518":1}}],["返回一个新map",{"2":{"510":1,"511":1,"513":1,"514":1}}],["返回一个集合",{"2":{"352":1}}],["返回一个具有特定容量的priorityqueue指针",{"2":{"323":1}}],["返回一个具有空切片的",{"2":{"138":1}}],["返回一个channel",{"2":{"41":1,"42":1,"45":1}}],["返回一个channel指针实例",{"2":{"37":1}}],["返回传入interface的底层值",{"2":{"603":1}}],["返回传入指针指向的值",{"2":{"602":1}}],["返回传入参数的指针值",{"2":{"601":1}}],["返回传入参数的bool值",{"2":{"52":1}}],["返回传入值的指针",{"2":{"75":1}}],["返回false",{"2":{"58":1,"339":1,"340":1}}],["等",{"2":{"30":1}}],["例如",{"2":{"30":1,"453":1,"907":1,"911":1}}],["||",{"2":{"583":2,"584":2}}],["|",{"2":{"29":2,"481":4,"542":2,"546":2,"548":2,"554":2,"555":2,"565":2,"566":2,"712":2}}],["检查error",{"2":{"905":1}}],["检查目标error是否为xerror",{"2":{"900":1}}],["检查数据编码是否为gbk",{"2":{"886":1}}],["检查当前操作系统是否是macos",{"2":{"802":1}}],["检查当前操作系统是否是linux",{"2":{"801":1}}],["检查当前操作系统是否是windows",{"2":{"800":1}}],["检查字符串是否全部为可打印字符",{"2":{"887":1}}],["检查字符串是否以指定字符串数组中的任何一个结尾",{"2":{"786":1}}],["检查字符串是否以指定字符串数组中的任何一个开头",{"2":{"785":1}}],["检查字符串是否为空格或空",{"2":{"784":1}}],["检查切片元素是否是有序的",{"2":{"686":1,"687":1}}],["检查切片元素是否按降序排列",{"2":{"685":1}}],["检查切片元素是否按升序排列",{"2":{"684":1}}],["检查两个切片是否相等",{"2":{"653":1,"654":1}}],["检查两个值是否相等",{"2":{"23":1,"24":1}}],["检查能否telnet到主机",{"2":{"595":1}}],["检查能否ping通主机",{"2":{"594":1}}],["检查map是否包含某个key",{"2":{"528":1}}],["检查增量内两个值是否相等",{"2":{"29":1}}],["检查类型和值",{"2":{"23":1}}],["kebabcase",{"0":{"763":1},"2":{"756":1,"763":4}}],["key是json",{"2":{"745":1}}],["key是iteratee遍历slice中的每个元素返回的结果",{"2":{"665":1}}],["keyby",{"0":{"702":1},"2":{"633":1,"702":4}}],["keysby",{"0":{"520":1},"2":{"505":1,"520":4}}],["keys",{"0":{"185":1,"516":1},"2":{"176":1,"185":8,"505":1,"510":2,"513":2,"516":10,"520":6}}],["keysize",{"2":{"130":2}}],["key",{"2":{"17":6,"78":4,"91":8,"92":8,"93":8,"94":8,"95":8,"96":8,"97":8,"98":8,"99":8,"102":8,"103":8,"104":8,"105":8,"106":8,"107":8,"108":8,"109":8,"110":8,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":4,"180":2,"181":2,"182":2,"183":2,"184":6,"508":2,"509":2,"512":2,"522":2,"523":2,"524":2,"525":8,"526":2,"528":4,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":4,"803":2,"804":2,"805":2,"806":2,"898":2}}],["k2",{"2":{"526":6}}],["k23proa=",{"2":{"114":2}}],["k1",{"2":{"526":6}}],["kfunc",{"2":{"516":1}}],["kindfunc",{"2":{"751":1}}],["kind",{"0":{"751":1},"2":{"738":1,"751":7}}],["king",{"2":{"483":4}}],["kib",{"2":{"487":4}}],["kb",{"2":{"486":4}}],["k",{"2":{"17":18,"74":6,"78":6,"275":6,"508":6,"509":8,"510":8,"511":6,"512":8,"513":8,"514":6,"515":6,"516":5,"517":6,"518":6,"519":4,"520":6,"521":4,"522":10,"523":12,"524":10,"525":10,"526":4,"527":4,"528":6,"529":4,"530":4,"531":4,"532":4,"533":4,"534":4,"535":4,"536":4,"687":4}}],["二分迭代查找",{"2":{"15":1}}],["二分递归查找",{"2":{"14":1}}],["9元元组",{"2":{"842":1}}],["90",{"2":{"556":2,"557":2,"562":2,"563":2}}],["9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043",{"2":{"128":2}}],["999z",{"2":{"432":2,"436":2}}],["999999999",{"2":{"414":2,"415":2,"416":2,"417":2,"418":2,"419":2}}],["99",{"2":{"68":2,"79":2,"80":2,"782":2}}],["98",{"2":{"68":2,"79":2,"80":2,"782":2}}],["97",{"2":{"68":2,"79":2,"80":2,"782":2}}],["96",{"2":{"29":4}}],["9",{"2":{"14":2,"15":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"396":2,"515":4,"560":2,"561":2,"574":2,"575":2}}],["7元元组",{"2":{"834":1}}],["720w",{"2":{"592":2}}],["76",{"2":{"576":2}}],["7853981633974483",{"2":{"556":2}}],["74",{"2":{"29":4,"576":4}}],["7",{"2":{"14":2,"15":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"397":4,"515":2,"550":2,"619":2,"646":2,"769":2,"770":2,"771":2,"791":4}}],["未找到元素返回",{"2":{"14":1,"15":1,"16":1}}],["归并排序",{"2":{"12":1}}],["希尔排序",{"2":{"9":1}}],["选择排序",{"2":{"8":1}}],["e003",{"2":{"899":2,"900":2}}],["e001",{"2":{"899":4,"900":4,"903":4}}],["email",{"2":{"869":2}}],["empty",{"2":{"259":2}}],["even",{"2":{"664":4,"716":4}}],["every",{"0":{"652":1},"2":{"633":1,"652":4}}],["e6",{"2":{"576":6}}],["ee",{"2":{"576":6}}],["exec",{"2":{"807":2}}],["execcommand",{"0":{"807":1},"2":{"798":1,"807":8}}],["exe执行命令",{"2":{"807":1}}],["expect",{"2":{"695":4}}],["exponent",{"0":{"543":1},"2":{"540":1,"543":8}}],["extractpointer",{"0":{"603":1},"2":{"599":1,"603":4}}],["excuting",{"2":{"501":4}}],["eapsedtime",{"2":{"501":4}}],["eachwithbreak",{"0":{"348":1},"2":{"348":4}}],["est",{"2":{"441":2}}],["elems",{"2":{"709":2}}],["element",{"2":{"340":2}}],["elsevalue",{"2":{"59":2}}],["else",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["entry",{"0":{"524":1},"2":{"524":4,"525":6}}],["entries",{"2":{"505":1,"524":4,"525":2}}],["enqueue",{"0":{"290":1,"302":1,"313":1,"325":1},"2":{"282":1,"283":1,"284":1,"285":1,"290":8,"291":6,"292":6,"293":6,"294":6,"295":6,"296":6,"297":6,"298":6,"302":8,"303":6,"304":6,"305":6,"306":6,"307":6,"308":6,"309":6,"313":8,"314":6,"315":6,"316":6,"317":6,"318":6,"319":6,"320":6,"321":6,"325":4,"326":2,"327":2,"328":2,"329":2}}],["endtime",{"2":{"424":4}}],["endwith",{"2":{"417":2}}],["endofyear",{"0":{"419":1},"2":{"401":1,"419":4}}],["endofmonth",{"0":{"418":1},"2":{"401":1,"418":4}}],["endofminute",{"0":{"414":1},"2":{"401":1,"414":4}}],["endofweek",{"0":{"417":1},"2":{"401":1,"417":4}}],["endofday",{"0":{"416":1},"2":{"401":1,"416":4}}],["endofhour",{"0":{"415":1},"2":{"401":1,"415":4}}],["end",{"2":{"169":2,"555":2,"647":2,"712":2,"722":2,"791":3}}],["encoding",{"2":{"587":2,"588":2,"589":2,"590":2,"591":2,"886":2}}],["encodedurl",{"2":{"573":4}}],["encodeurl",{"0":{"573":1},"2":{"570":1,"573":4}}],["encode数据到writer",{"2":{"483":1}}],["encodebyte",{"0":{"79":1},"2":{"63":1,"79":4}}],["encrypted",{"2":{"91":4,"92":6,"93":4,"94":6,"95":4,"96":4,"97":6,"98":4,"99":6,"102":4,"103":6,"104":4,"105":6,"106":4,"107":4,"108":6,"109":4,"110":6,"131":4,"132":4}}],["e834306eab892d872525d4918a7a639a",{"2":{"111":2}}],["ecb算法模式解决密数据",{"2":{"103":1}}],["ecb算法模式解密数据",{"2":{"92":1}}],["ecb算法模式加密数据",{"2":{"91":1,"102":1}}],["errinfo",{"2":{"903":11}}],["errinfofunc",{"2":{"903":1}}],["err3",{"2":{"899":4,"900":4}}],["errlevel",{"2":{"898":4,"901":4}}],["err2",{"2":{"805":4,"896":2,"897":4,"899":4,"900":4}}],["err1",{"2":{"805":4,"895":4,"896":4,"897":4,"899":6,"900":6}}],["err",{"2":{"68":6,"71":4,"72":4,"73":6,"80":4,"82":6,"130":6,"131":4,"132":4,"365":4,"366":4,"374":4,"375":4,"431":2,"432":2,"451":6,"453":4,"454":6,"456":6,"462":6,"465":6,"466":6,"467":6,"469":4,"470":4,"471":4,"472":4,"473":8,"474":12,"475":12,"483":4,"507":4,"573":6,"577":6,"583":8,"584":8,"586":6,"587":6,"588":6,"589":6,"590":6,"591":12,"592":4,"593":4,"618":4,"626":4,"627":6,"628":4,"629":4,"690":4,"803":4,"804":4,"806":4,"807":18,"893":4,"894":4,"895":6,"897":4,"898":4,"901":4,"902":4,"903":4,"904":4,"905":6}}],["error兼容的堆栈信息",{"2":{"902":1}}],["errortype",{"2":{"626":1}}],["errors",{"2":{"625":4,"626":4,"627":4,"628":4,"629":4,"895":4,"896":4,"897":3,"903":2}}],["errorfunc",{"2":{"80":1,"130":1,"313":1,"451":1,"453":1,"454":1,"462":1,"465":1,"466":1,"467":1,"473":1,"474":1,"475":1,"483":1,"507":1,"584":1,"591":1,"592":1,"629":1,"690":1,"804":1,"805":1,"897":1}}],["error",{"0":{"904":1},"2":{"67":2,"68":2,"71":2,"72":2,"73":2,"77":2,"79":2,"80":1,"82":2,"84":2,"85":2,"123":2,"130":1,"303":2,"304":2,"305":2,"313":1,"365":2,"366":2,"374":2,"375":2,"428":2,"431":2,"432":2,"451":1,"453":1,"454":1,"456":2,"461":2,"462":1,"463":2,"464":2,"465":1,"466":1,"467":1,"469":2,"470":2,"471":2,"472":2,"473":1,"474":1,"475":1,"482":2,"483":1,"486":2,"487":2,"507":1,"573":2,"577":2,"583":2,"584":1,"586":2,"587":2,"588":2,"589":2,"590":2,"591":1,"592":1,"593":2,"618":2,"625":4,"626":5,"627":4,"628":4,"629":5,"690":1,"741":4,"804":1,"805":1,"807":6,"891":1,"893":8,"894":8,"895":4,"896":8,"897":5,"898":2,"899":6,"900":8,"901":2,"902":2,"903":4,"904":8,"905":6}}],["equalwith",{"0":{"654":1},"2":{"633":1,"654":4}}],["equalvalue",{"0":{"24":1},"2":{"21":1,"24":10}}],["equalfunc",{"2":{"16":6}}],["equal",{"0":{"23":1,"171":1,"257":1,"346":1,"653":1},"1":{"172":1},"2":{"16":2,"21":1,"23":16,"136":1,"171":2,"172":2,"241":1,"257":6,"333":1,"346":6,"633":1,"653":6,"807":2,"899":4,"900":4}}],["e",{"2":{"7":4,"144":2,"147":2,"149":2,"153":2,"157":2,"159":2,"161":2,"167":2,"171":2,"509":2,"510":2,"511":2,"512":4,"513":4,"514":2,"515":2,"639":12,"688":6,"776":2,"779":4,"780":2,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2}}],["8编码",{"2":{"886":1}}],["8编码格式的每个字节都在gbk编码范围内",{"2":{"886":1}}],["87562",{"2":{"866":2}}],["8760h0m0s",{"2":{"407":4}}],["8元元组",{"2":{"838":1}}],["8976",{"2":{"791":2}}],["894",{"2":{"563":2}}],["80",{"2":{"595":2}}],["801",{"2":{"563":2}}],["86400",{"2":{"438":4}}],["8",{"2":{"7":4,"14":2,"15":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"396":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"457":4,"564":2,"646":2}}],["插入排序",{"2":{"7":1}}],["olleh",{"2":{"908":2}}],["old",{"2":{"680":2,"681":2}}],["oldvalue",{"2":{"144":2,"163":2,"165":2}}],["only",{"2":{"884":2}}],["oops",{"2":{"895":2}}],["oom",{"2":{"785":2,"786":2}}],["oof",{"2":{"772":2}}],["odd",{"2":{"664":4}}],["option",{"2":{"629":2,"807":2}}],["opts",{"2":{"629":2,"807":2}}],["openfile",{"2":{"463":2,"464":2,"473":2}}],["open",{"2":{"457":2}}],["occurs",{"2":{"625":2,"626":2,"627":2,"628":2,"629":2}}],["obj",{"2":{"591":2}}],["omitempty",{"2":{"585":2,"745":2,"746":2}}],["omitbyvalues",{"0":{"514":1},"2":{"505":1,"514":4}}],["omitbykeys",{"0":{"513":1},"2":{"505":1,"513":4}}],["omitby",{"0":{"512":1},"2":{"505":1,"512":4}}],["o",{"2":{"463":4,"464":4,"473":4,"787":4}}],["osbit",{"2":{"808":4}}],["os",{"2":{"457":5,"463":6,"464":6,"473":4,"474":4,"475":4,"795":1,"796":1}}],["offset",{"2":{"776":2}}],["of",{"0":{"601":1,"709":1},"2":{"425":1,"426":1,"599":1,"601":6,"707":1,"709":4,"734":2,"906":4}}],["ofb算法模式解密数据",{"2":{"99":1,"110":1}}],["ofb算法模式加密数据",{"2":{"98":1,"109":1}}],["othervalue",{"2":{"646":2}}],["other",{"2":{"257":2,"261":2,"267":2,"268":2,"269":2,"270":2,"343":2,"346":2,"350":2,"351":2,"352":2}}],["out",{"2":{"38":8,"483":2,"807":6}}],["output",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"38":2,"40":2,"41":2,"42":2,"44":2,"45":2,"46":2,"52":2,"59":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":2,"85":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"131":2,"132":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"530":2,"531":2,"532":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"572":2,"573":2,"574":2,"575":2,"576":2,"578":2,"579":2,"580":2,"583":2,"584":2,"585":2,"594":2,"595":2,"601":2,"602":2,"603":2,"604":2,"605":2,"625":2,"626":2,"627":2,"628":2,"629":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"803":2,"804":2,"805":2,"806":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"903":2,"904":2,"905":2}}],["origin",{"2":{"791":3}}],["original",{"2":{"715":6,"716":4,"717":4,"718":6,"719":10,"720":10,"721":4,"722":10,"723":6,"724":4,"725":4,"726":4,"727":4,"728":4,"729":4,"730":6,"731":6,"732":6}}],["org",{"2":{"577":4,"886":2}}],["ordone",{"0":{"44":1},"2":{"34":1,"44":4}}],["ordered类型",{"2":{"688":1}}],["ordered",{"2":{"684":2,"685":2,"686":2,"687":2,"688":2}}],["order",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"530":2,"531":2,"532":2,"683":2}}],["or",{"0":{"43":1,"54":1},"2":{"34":1,"39":2,"43":4,"50":1,"54":10,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"807":2,"808":2,"873":1,"884":2}}],["ok",{"2":{"17":4,"83":6,"144":2,"163":2,"165":2,"195":4,"196":2,"246":4,"252":4,"253":4,"326":2,"340":4,"354":6,"530":4,"531":4,"532":6,"534":10,"535":4,"593":4,"656":4,"657":6,"658":4,"659":6,"713":2,"726":4,"727":4,"728":4,"729":4}}],["ok3",{"2":{"17":4}}],["ok2",{"2":{"17":4}}],["ok1",{"2":{"17":4}}],["pkg",{"2":{"895":2,"897":1}}],["pgwsze",{"2":{"613":2}}],["ping",{"2":{"807":1}}],["picx",{"2":{"592":2}}],["pi",{"2":{"557":6,"562":4,"563":4}}],["pipeline",{"0":{"500":1},"2":{"491":1,"500":4}}],["phone",{"2":{"507":6,"866":2}}],["plain",{"2":{"457":4}}],["pq",{"2":{"326":2}}],["programmeur",{"2":{"779":4,"780":2}}],["programmer",{"2":{"779":4,"780":2}}],["prefixes",{"2":{"785":2}}],["predicate",{"2":{"509":2,"512":2,"637":2,"643":2,"650":2,"651":2,"652":2,"655":2,"656":2,"657":2,"658":2,"659":2,"691":2,"699":2,"716":2,"730":2,"731":2,"732":2}}],["precision",{"2":{"484":2,"485":2,"562":2,"563":2}}],["precision参数指定小数点后的位数",{"2":{"484":1,"485":1}}],["prettytowriter",{"0":{"483":1},"2":{"479":1,"483":4}}],["pretty",{"0":{"482":1},"2":{"479":1,"482":6,"483":1}}],["preordertraverse",{"0":{"391":1},"2":{"385":1,"389":2,"390":2,"391":4}}],["pre指针指向前一个节点",{"2":{"223":1}}],["pre",{"2":{"222":6,"224":2}}],["priorityqueue",{"0":{"285":1,"322":1},"2":{"278":1,"279":1,"323":4,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2}}],["privatekeyfilename",{"2":{"132":2}}],["private",{"2":{"130":2,"131":4,"132":4}}],["prikeyfile",{"2":{"130":2}}],["print",{"0":{"222":1,"237":1,"380":1,"397":1},"2":{"204":1,"205":1,"222":2,"237":2,"360":1,"380":4,"385":1,"397":4,"498":4}}],["printstructure",{"0":{"199":1},"2":{"199":4}}],["printf",{"2":{"73":2,"83":4,"673":2,"674":2,"689":2,"814":2,"815":2,"817":2,"818":2,"819":2,"821":2,"822":2,"823":2,"825":2,"826":2,"827":2,"829":2,"830":2,"831":2,"833":2,"834":2,"835":2,"837":2,"838":2,"839":2,"841":2,"842":2,"843":2,"845":2,"846":2,"847":2,"849":2}}],["println",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":4,"15":4,"16":4,"17":10,"23":14,"24":8,"25":12,"26":14,"27":12,"28":14,"29":12,"38":2,"39":2,"40":6,"41":2,"42":2,"43":2,"44":2,"45":2,"46":4,"52":18,"53":8,"54":8,"55":8,"56":8,"57":8,"58":8,"59":4,"65":2,"66":2,"67":2,"68":4,"69":6,"70":6,"71":12,"72":10,"73":2,"74":2,"75":2,"76":14,"77":2,"78":2,"79":2,"80":2,"81":2,"82":6,"83":2,"84":4,"85":4,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"178":2,"179":2,"180":2,"181":2,"182":4,"183":4,"184":4,"185":2,"186":2,"193":2,"194":2,"195":4,"196":4,"197":2,"198":2,"199":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":4,"221":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":4,"236":2,"243":2,"244":4,"245":2,"246":4,"247":4,"248":4,"249":4,"250":4,"251":2,"252":6,"253":6,"254":8,"255":8,"256":6,"257":4,"258":4,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":6,"272":6,"273":2,"274":2,"275":2,"276":2,"277":4,"288":2,"289":2,"290":2,"291":4,"292":4,"293":4,"294":2,"295":4,"296":4,"297":2,"298":4,"300":2,"301":2,"302":2,"303":4,"304":4,"305":4,"306":2,"307":4,"308":2,"309":4,"311":2,"312":2,"313":2,"314":4,"315":4,"316":4,"317":2,"318":4,"319":4,"320":2,"321":4,"323":2,"324":2,"325":2,"326":4,"327":4,"328":4,"329":4,"335":2,"336":2,"337":2,"338":2,"339":6,"340":6,"341":2,"342":4,"343":4,"344":2,"345":4,"346":4,"347":2,"348":2,"349":4,"350":2,"351":2,"352":2,"353":4,"354":4,"363":2,"364":2,"365":6,"366":6,"367":2,"368":2,"369":4,"370":2,"372":2,"373":2,"374":6,"375":6,"376":2,"377":2,"378":4,"379":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":4,"397":2,"404":4,"405":4,"406":4,"407":4,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":6,"428":6,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":4,"438":4,"439":6,"440":6,"441":4,"442":2,"443":2,"444":2,"445":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":4,"457":4,"458":2,"459":2,"460":4,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":4,"470":4,"471":8,"472":4,"473":2,"474":2,"475":2,"481":6,"482":4,"483":4,"484":8,"485":8,"486":8,"487":8,"493":2,"494":2,"495":2,"496":2,"497":4,"498":2,"499":2,"500":2,"501":4,"507":4,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":6,"516":2,"517":2,"518":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":4,"528":6,"530":2,"531":2,"532":2,"534":4,"535":2,"536":2,"542":4,"543":6,"544":6,"545":6,"546":4,"547":6,"548":4,"549":6,"550":6,"551":6,"552":6,"553":6,"554":8,"555":8,"556":6,"557":6,"558":2,"559":8,"560":10,"561":6,"562":10,"563":10,"564":6,"565":4,"566":6,"572":2,"573":4,"574":2,"575":2,"576":2,"577":4,"578":2,"579":6,"580":6,"583":2,"584":2,"585":8,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":4,"594":4,"595":4,"601":4,"602":4,"603":2,"604":8,"605":8,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"625":2,"626":2,"627":2,"628":2,"629":2,"635":4,"636":4,"637":8,"638":4,"639":10,"640":8,"641":4,"642":4,"643":2,"644":2,"645":2,"646":2,"647":6,"648":8,"649":8,"650":6,"651":6,"652":2,"653":4,"654":2,"655":2,"656":4,"657":4,"658":4,"659":4,"660":2,"661":2,"662":2,"663":2,"664":4,"665":2,"666":2,"667":2,"668":2,"669":10,"670":4,"671":4,"672":2,"675":2,"676":2,"677":2,"678":4,"679":2,"680":10,"681":2,"682":2,"683":2,"684":6,"685":6,"686":6,"687":6,"688":8,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":10,"701":2,"702":2,"703":4,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":4,"716":2,"717":2,"718":6,"719":8,"720":8,"721":2,"722":8,"723":4,"724":2,"725":2,"726":4,"727":4,"728":4,"729":4,"730":4,"731":4,"732":4,"733":4,"734":2,"741":4,"742":2,"743":2,"744":2,"745":2,"746":2,"747":4,"748":4,"749":4,"750":4,"751":4,"752":2,"758":10,"759":10,"760":8,"761":8,"762":2,"763":2,"764":2,"765":2,"766":10,"767":2,"768":2,"769":14,"770":14,"771":14,"772":4,"773":2,"774":2,"775":10,"776":12,"777":8,"778":10,"779":12,"780":12,"781":4,"782":4,"783":2,"784":6,"785":4,"786":4,"787":10,"788":2,"789":6,"790":4,"791":8,"792":4,"793":6,"794":4,"800":2,"801":2,"802":2,"803":4,"804":4,"805":8,"806":2,"807":14,"808":2,"816":2,"820":2,"824":2,"828":2,"832":2,"836":2,"840":2,"844":2,"848":2,"855":6,"856":6,"857":6,"858":6,"859":6,"860":6,"861":6,"862":10,"863":4,"864":4,"865":4,"866":4,"867":4,"868":6,"869":4,"870":6,"871":8,"872":8,"873":8,"874":8,"875":8,"876":8,"877":8,"878":4,"879":8,"880":4,"881":4,"882":4,"883":6,"884":4,"885":8,"886":2,"887":10,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":4,"900":4,"901":2,"902":6,"903":8,"904":2,"905":4,"908":2}}],["port",{"2":{"595":2}}],["post请求",{"2":{"587":1}}],["post请求体",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["post",{"2":{"581":2}}],["postdata",{"2":{"581":8,"587":8}}],["postordertraverse",{"0":{"393":1},"2":{"385":1,"393":4}}],["pointdistance",{"0":{"558":1},"2":{"540":1,"558":4}}],["pointer",{"0":{"596":1},"1":{"597":1,"598":1,"599":1,"600":1,"601":1,"602":1,"603":1,"604":1,"605":1},"2":{"0":1,"596":1,"597":2,"598":2,"601":6,"602":6,"603":4,"604":10,"605":10,"811":2}}],["poplast",{"2":{"241":1,"253":4}}],["popfirst",{"0":{"252":1,"253":1},"2":{"241":1,"252":4}}],["pop",{"0":{"195":1,"354":1,"365":1,"374":1},"2":{"190":1,"195":4,"354":4,"359":1,"360":1,"365":4,"374":4}}],["push",{"0":{"194":1,"251":1,"364":1,"373":1},"2":{"190":1,"194":4,"195":2,"196":2,"197":2,"198":2,"199":2,"241":1,"251":4,"359":1,"360":1,"364":8,"365":6,"366":6,"367":6,"368":6,"369":6,"370":6,"373":8,"374":6,"375":6,"376":6,"377":6,"378":6,"379":6,"380":6}}],["publicip",{"2":{"578":4}}],["publicipinfo",{"2":{"577":8}}],["public",{"2":{"130":2,"131":4,"132":4}}],["pubkeyfilename",{"2":{"131":2}}],["pubkeyfile",{"2":{"130":2}}],["put请求",{"2":{"588":1}}],["put",{"0":{"181":1},"2":{"17":6,"176":1,"181":4,"182":2,"183":2,"184":6,"185":6,"186":6}}],["personinfo",{"2":{"507":4}}],["person",{"2":{"507":4}}],["percent",{"0":{"550":1},"2":{"82":14,"540":1,"550":8}}],["peak",{"0":{"366":1,"375":1},"2":{"359":1,"360":1,"366":4,"375":4}}],["peekstream",{"2":{"718":4}}],["peek",{"0":{"196":1,"718":1},"2":{"190":1,"196":4,"707":1,"718":4}}],["pem",{"2":{"130":4,"131":8,"132":8}}],["peoples",{"2":{"7":6}}],["peopleagecomparator",{"2":{"7":6}}],["peopleaagecomparator",{"2":{"7":2}}],["people",{"2":{"7":10,"77":4,"740":4,"741":4,"742":4,"743":4,"744":4}}],["pm",{"2":{"77":4}}],["p",{"2":{"77":4,"507":6,"602":2,"604":2,"605":2}}],["password",{"2":{"882":2,"884":2,"894":4}}],["padstr",{"2":{"769":2,"770":2,"771":2}}],["padstart",{"0":{"771":1},"2":{"756":1,"771":16}}],["padend",{"0":{"770":1},"2":{"756":1,"770":16}}],["pad",{"0":{"769":1},"2":{"756":1,"769":16}}],["pacwgf",{"2":{"614":2}}],["package",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"139":1,"141":1,"143":1,"145":1,"148":1,"150":1,"152":1,"154":1,"156":1,"158":1,"160":1,"162":1,"164":1,"166":1,"168":1,"170":1,"172":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"626":1,"627":1,"628":1,"629":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1,"908":1}}],["patch请求",{"2":{"590":1}}],["path",{"2":{"451":2,"452":2,"456":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":10,"464":10,"469":2}}],["parent",{"2":{"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"752":4}}],["params",{"2":{"586":10,"587":10,"588":10,"589":10,"590":10}}],["param",{"2":{"572":2}}],["parsing",{"2":{"71":2,"72":2}}],["parseip",{"2":{"574":2,"579":6,"580":6}}],["parseint",{"2":{"72":2}}],["parsehttpresponse",{"0":{"591":1},"2":{"570":1,"591":4}}],["parsebinarybytes",{"0":{"487":1},"2":{"479":1,"487":10}}],["parsebool",{"2":{"67":1}}],["parsedecimalbytes",{"0":{"486":1},"2":{"479":1,"486":10}}],["parse",{"2":{"427":2}}],["parsefloat",{"2":{"71":2}}],["p2",{"2":{"7":6}}],["p1",{"2":{"7":6,"740":4,"741":6,"742":4,"743":4,"744":4,"745":4,"746":4,"748":4,"749":4,"750":4,"751":4,"752":4}}],["pc",{"2":{"7":2}}],["4o2",{"2":{"905":4}}],["4111111111111111",{"2":{"867":2}}],["434324324",{"2":{"864":2}}],["4321",{"2":{"679":2}}],["4元元组",{"2":{"822":1}}],["447",{"2":{"562":2}}],["456",{"2":{"604":6}}],["45",{"2":{"556":2,"557":2}}],["42",{"2":{"550":2,"905":4}}],["408420",{"2":{"550":2}}],["4096",{"2":{"130":2,"131":2,"132":2}}],["48",{"2":{"29":8}}],["4",{"0":{"285":1,"322":1},"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":2,"38":2,"41":2,"45":2,"145":2,"158":2,"160":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"199":4,"210":4,"213":2,"214":4,"226":4,"229":2,"230":4,"251":4,"254":10,"255":10,"256":6,"257":4,"261":8,"262":4,"264":4,"265":4,"266":4,"267":6,"268":6,"269":2,"270":4,"271":6,"272":12,"273":4,"274":4,"275":4,"276":4,"277":4,"298":2,"309":2,"321":2,"325":2,"326":2,"329":2,"339":4,"340":2,"342":2,"343":2,"346":2,"348":2,"350":4,"351":2,"352":4,"353":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":6,"397":4,"508":2,"509":4,"510":2,"511":6,"512":2,"513":4,"514":4,"516":4,"519":2,"520":2,"530":2,"531":2,"532":2,"542":2,"546":6,"548":4,"554":18,"555":8,"557":2,"558":2,"611":2,"619":2,"625":2,"636":2,"639":2,"641":4,"642":2,"643":2,"644":4,"645":4,"646":4,"648":2,"649":2,"650":4,"651":4,"654":2,"655":4,"656":2,"657":2,"658":4,"659":4,"662":2,"663":2,"664":4,"665":6,"668":2,"672":2,"673":4,"674":4,"675":4,"678":4,"679":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"693":4,"697":2,"698":4,"699":4,"701":4,"703":6,"711":2,"712":2,"713":2,"714":4,"716":4,"717":2,"719":8,"720":4,"723":6,"728":4,"729":2,"769":2,"770":2,"771":2,"780":2,"791":2,"906":1}}],["6元元组",{"2":{"830":1}}],["64",{"2":{"808":2}}],["6dqwbqujlycljdsrinpjmg==",{"2":{"112":2}}],["66667",{"2":{"29":2}}],["6",{"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":2,"15":2,"16":2,"79":2,"80":2,"160":2,"162":2,"170":2,"172":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"261":4,"267":4,"268":2,"276":2,"325":2,"326":2,"348":2,"388":2,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"396":4,"397":4,"515":2,"545":2,"560":2,"561":2,"613":2,"614":2,"615":2,"616":2,"617":2,"644":2,"646":2,"654":2,"663":2,"665":10,"677":2,"697":2,"698":6,"714":4,"724":2,"725":2,"769":2,"770":2,"771":2,"882":2}}],["3元元组",{"2":{"818":1}}],["36",{"2":{"500":2,"578":4,"579":2,"580":2}}],["345",{"2":{"481":2}}],["33",{"2":{"421":2,"422":2,"518":2,"550":4}}],["31",{"2":{"418":2,"419":2,"439":2,"576":2}}],["315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75",{"2":{"115":2}}],["3jrlnpkcji8pzm6xbhxx6zg4uumxadezjr1wuxdre9g9zvn7aqw==",{"2":{"129":2}}],["3y8skkndi9nu4ljtmi6c6m",{"2":{"118":2}}],["32116675",{"2":{"866":2}}],["32",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"564":2,"808":2}}],["30305",{"2":{"550":2}}],["30",{"2":{"82":2,"441":4}}],["300",{"2":{"82":2}}],["39",{"2":{"81":2,"121":4,"777":14,"779":14,"780":8,"782":12,"783":12}}],["3",{"0":{"284":1,"310":1},"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":2,"15":2,"16":6,"17":2,"23":6,"29":4,"38":2,"40":4,"42":2,"43":2,"44":2,"45":6,"59":2,"69":4,"70":4,"72":2,"73":4,"76":4,"78":4,"79":2,"80":2,"82":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":4,"184":2,"185":2,"186":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"209":4,"210":4,"211":4,"212":4,"213":6,"214":4,"215":2,"216":4,"217":4,"218":2,"219":4,"220":2,"221":2,"222":4,"225":4,"226":4,"227":4,"228":4,"229":6,"230":4,"231":2,"232":4,"233":2,"234":4,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":2,"247":2,"248":4,"249":2,"250":4,"251":4,"252":4,"253":4,"254":10,"255":12,"256":6,"257":6,"258":2,"259":2,"260":4,"261":4,"262":2,"264":6,"265":4,"266":4,"267":4,"268":2,"269":4,"270":4,"271":10,"272":12,"273":4,"274":4,"275":4,"276":4,"277":4,"290":4,"291":4,"292":4,"293":6,"294":4,"295":2,"296":4,"297":2,"298":2,"302":4,"303":4,"304":4,"305":6,"306":4,"307":2,"308":2,"309":2,"313":4,"314":4,"315":4,"316":6,"317":4,"318":2,"319":4,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"335":4,"336":4,"337":4,"338":4,"339":4,"340":4,"341":4,"342":2,"343":4,"344":4,"345":2,"346":6,"347":4,"348":4,"349":2,"350":6,"351":6,"352":4,"353":6,"354":4,"364":4,"365":4,"366":6,"367":4,"368":4,"369":2,"370":2,"373":4,"374":4,"375":6,"376":4,"377":4,"378":2,"379":2,"380":4,"484":2,"495":2,"508":2,"509":2,"510":2,"511":6,"512":4,"513":4,"514":4,"515":4,"516":4,"517":4,"518":4,"519":2,"520":4,"521":6,"522":4,"523":4,"524":4,"525":4,"526":4,"527":2,"530":2,"531":2,"532":2,"542":2,"545":2,"546":4,"548":2,"550":2,"551":2,"552":2,"553":2,"554":8,"555":4,"556":2,"560":4,"561":2,"564":6,"565":2,"572":2,"586":2,"587":2,"588":2,"589":2,"590":2,"625":2,"626":4,"627":2,"628":4,"629":4,"636":2,"639":2,"640":4,"641":4,"642":6,"643":2,"644":4,"645":4,"646":2,"650":4,"651":4,"652":2,"653":6,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"662":4,"663":4,"664":4,"665":4,"666":6,"668":6,"669":6,"672":4,"673":2,"674":4,"675":8,"677":2,"678":4,"679":2,"680":2,"682":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":2,"693":4,"697":4,"698":4,"699":2,"700":2,"701":4,"702":2,"703":6,"709":4,"710":4,"711":2,"712":2,"713":2,"714":4,"715":14,"716":2,"717":4,"718":6,"719":8,"720":4,"721":4,"722":6,"723":6,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":4,"732":4,"733":4,"734":4,"752":2,"769":2,"770":2,"771":2,"776":6,"780":4,"791":8,"844":4,"845":4,"848":4,"849":4,"871":2,"872":2,"873":2,"874":4,"875":2,"876":2}}],["5元元组",{"2":{"826":1}}],["56",{"2":{"576":2}}],["567",{"2":{"481":2}}],["5d",{"2":{"573":2}}],["5d41402abc4b2a76b9719d911017c592",{"2":{"119":2}}],["5b2",{"2":{"573":2}}],["5707963267948966",{"2":{"556":2}}],["57",{"2":{"421":2}}],["598",{"2":{"562":2}}],["59",{"2":{"414":2,"415":4,"416":4,"417":4,"418":4,"419":4,"422":2,"424":6,"426":1}}],["50",{"2":{"408":4,"409":2,"410":2,"411":2,"412":2,"413":2,"414":4,"415":2,"416":2,"417":2,"418":2,"419":2,"497":2,"550":2,"625":2,"626":2,"628":2,"629":2}}],["5c6a9db0cccb92e36ed0323fd09b7f936de9ace0",{"2":{"113":2}}],["512",{"2":{"471":3}}],["51",{"2":{"65":2,"66":2}}],["54",{"2":{"29":4}}],["5",{"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":2,"38":4,"45":4,"160":2,"170":4,"172":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"256":2,"261":4,"267":4,"268":2,"271":2,"272":2,"276":6,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"297":2,"298":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"320":2,"321":2,"325":2,"326":2,"329":2,"348":2,"350":4,"351":2,"352":4,"353":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"396":4,"397":4,"509":2,"510":2,"511":2,"512":4,"513":4,"514":4,"516":4,"519":2,"530":8,"531":8,"532":4,"533":8,"534":8,"535":8,"536":4,"544":4,"558":4,"564":2,"619":4,"639":2,"643":2,"644":4,"645":4,"646":6,"650":4,"651":4,"652":2,"655":2,"656":2,"657":2,"658":2,"659":2,"663":2,"664":4,"673":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":2,"697":2,"698":4,"703":6,"712":4,"714":4,"716":2,"719":2,"720":2,"769":2,"770":2,"771":2,"776":2,"787":2}}],["2元元组",{"2":{"814":1}}],["2e",{"2":{"576":6}}],["2a",{"2":{"576":6}}],["27",{"2":{"564":2}}],["22",{"2":{"473":4,"518":2,"527":4}}],["256",{"2":{"471":3}}],["2658976",{"2":{"791":2}}],["26",{"2":{"441":4}}],["210911192105130715",{"2":{"865":2}}],["21",{"2":{"427":2,"428":2,"473":4,"689":4,"690":4}}],["29",{"2":{"423":2,"424":2}}],["2m0s",{"2":{"406":4}}],["2h0m0s",{"2":{"405":4}}],["2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",{"2":{"126":2}}],["24h0m0s",{"2":{"404":4}}],["24",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"578":4,"579":2,"580":2}}],["235mb",{"2":{"484":2}}],["2346mb",{"2":{"484":2}}],["234",{"2":{"481":2}}],["23",{"2":{"76":4,"416":2,"417":2,"418":2,"419":2,"424":3,"426":1}}],["23e3",{"2":{"71":2}}],["28",{"2":{"7":4,"420":2,"422":2,"507":4}}],["2021",{"2":{"427":6,"428":10}}],["2022",{"2":{"420":2,"422":2,"431":2,"434":4,"435":4}}],["2023",{"2":{"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"423":2,"424":2,"439":6,"440":6,"441":4}}],["2001",{"2":{"437":2}}],["2000",{"2":{"437":2}}],["2006",{"2":{"427":2,"432":2,"435":2,"436":4}}],["200",{"2":{"82":2,"583":2,"584":2}}],["20",{"2":{"7":4,"29":4,"82":2,"469":2}}],["2",{"0":{"205":1,"223":1,"283":1,"299":1,"360":1,"371":1},"2":{"6":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":2,"15":2,"16":2,"17":14,"23":12,"24":2,"25":10,"26":10,"27":8,"28":8,"29":6,"38":2,"39":6,"40":4,"41":6,"43":2,"45":4,"46":2,"52":2,"59":4,"69":4,"70":4,"73":4,"76":4,"78":4,"81":4,"139":2,"141":2,"143":4,"145":4,"148":2,"150":2,"154":2,"156":4,"158":2,"160":2,"162":4,"164":4,"166":4,"168":4,"170":4,"172":4,"184":2,"185":2,"186":4,"194":4,"195":2,"196":2,"197":4,"198":2,"199":4,"209":4,"210":8,"211":4,"212":4,"213":4,"214":4,"215":4,"216":6,"217":4,"218":4,"219":2,"220":2,"221":2,"222":4,"225":4,"226":8,"227":4,"228":4,"229":4,"230":4,"231":4,"232":4,"233":4,"234":2,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":2,"247":2,"248":2,"249":2,"250":2,"251":4,"252":4,"253":4,"254":12,"255":12,"256":10,"257":6,"258":2,"259":2,"260":4,"261":4,"262":2,"264":4,"265":4,"266":6,"267":4,"268":2,"269":4,"270":4,"271":18,"272":12,"273":4,"274":4,"275":4,"276":4,"277":4,"290":4,"291":4,"292":4,"293":4,"294":2,"295":2,"296":2,"297":2,"298":2,"302":4,"303":4,"304":4,"305":4,"306":2,"307":2,"308":2,"309":2,"313":4,"314":4,"315":4,"316":4,"317":2,"318":2,"319":2,"320":2,"321":2,"325":2,"326":2,"335":6,"336":6,"337":6,"338":4,"339":4,"340":8,"341":4,"342":2,"343":6,"344":2,"345":2,"346":6,"347":4,"348":2,"349":2,"350":6,"351":6,"352":4,"353":6,"354":2,"364":4,"365":4,"366":4,"367":4,"368":2,"369":2,"370":2,"373":4,"374":4,"375":4,"376":4,"377":2,"378":2,"379":2,"380":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":2,"397":4,"405":4,"406":4,"485":2,"486":2,"487":2,"493":2,"494":2,"495":2,"497":2,"498":2,"499":6,"500":4,"508":2,"509":6,"510":4,"511":2,"512":4,"513":2,"514":4,"515":8,"516":4,"517":6,"518":2,"519":2,"520":4,"521":6,"522":4,"523":4,"524":4,"525":4,"526":4,"527":2,"528":2,"530":2,"531":2,"532":2,"542":4,"543":2,"544":2,"545":4,"546":4,"548":4,"550":8,"551":4,"552":4,"553":4,"554":8,"555":10,"557":2,"559":2,"561":4,"562":2,"563":2,"564":8,"565":2,"566":4,"572":2,"573":2,"586":2,"587":2,"588":2,"589":2,"590":2,"627":4,"636":2,"637":6,"639":2,"640":4,"641":4,"642":4,"643":6,"644":4,"645":4,"646":4,"647":2,"650":6,"651":8,"652":4,"653":6,"654":6,"655":6,"656":6,"657":6,"658":4,"659":4,"662":4,"663":2,"664":6,"665":4,"666":6,"668":6,"669":6,"672":4,"673":7,"674":4,"675":4,"677":2,"678":4,"679":2,"680":2,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":4,"693":4,"697":4,"698":4,"699":6,"700":2,"701":4,"702":2,"703":6,"709":4,"710":4,"711":2,"712":2,"713":2,"714":4,"715":10,"716":6,"717":4,"718":6,"719":8,"720":4,"721":4,"722":8,"723":6,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":4,"752":2,"769":2,"770":2,"771":2,"776":8,"780":2,"788":2,"826":4,"827":4,"828":4,"829":4,"830":12,"831":12,"832":12,"833":12,"834":12,"835":12,"836":12,"837":12,"838":12,"839":12,"840":12,"841":12,"842":12,"843":12,"844":12,"845":12,"846":12,"847":12,"848":12,"849":12}}],["n++",{"2":{"713":2}}],["nworld",{"2":{"464":2}}],["nighttime",{"2":{"426":4}}],["nil",{"2":{"68":2,"73":2,"76":2,"80":2,"81":8,"82":2,"130":2,"131":2,"132":2,"180":2,"182":2,"222":8,"365":2,"366":2,"374":2,"375":2,"380":2,"451":2,"454":2,"456":2,"462":2,"465":2,"466":2,"467":2,"469":2,"470":2,"471":2,"472":2,"473":4,"474":6,"475":6,"483":2,"507":2,"573":2,"577":2,"583":4,"584":4,"586":2,"587":4,"588":4,"589":2,"590":4,"591":4,"618":2,"626":4,"627":4,"628":4,"629":4,"640":1,"690":2,"803":2,"804":2,"805":4,"806":2,"807":2}}],["n",{"2":{"83":4,"275":6,"348":6,"493":2,"494":2,"520":4,"530":10,"531":10,"532":6,"533":10,"534":14,"535":10,"536":6,"543":2,"544":2,"550":2,"551":2,"552":2,"553":2,"559":2,"564":2,"619":2,"627":2,"648":2,"649":2,"650":10,"651":10,"663":6,"680":2,"682":2,"699":4,"713":6,"716":4,"717":4,"718":4,"719":2,"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"781":2,"784":2,"794":2}}],["numerror",{"2":{"905":2}}],["num",{"2":{"643":4,"652":4,"655":4,"656":4,"657":4,"658":4,"659":4,"664":4,"665":4,"673":6,"674":4,"691":4}}],["nums2",{"2":{"668":4,"675":4,"693":4,"698":4}}],["nums1",{"2":{"668":4,"675":4,"693":4,"698":4}}],["nums",{"2":{"52":10,"642":6,"643":4,"652":4,"655":4,"656":4,"657":4,"658":4,"659":4,"662":4,"664":4,"665":4,"666":4,"672":4,"673":4,"674":4,"677":4,"683":4,"691":4,"697":4,"699":4,"703":6}}],["number++",{"2":{"625":2,"626":2,"627":2,"628":2,"629":2}}],["number",{"2":{"45":2,"507":6,"625":6,"626":6,"627":4,"628":6,"629":6,"882":1,"884":2}}],["numbers",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":4,"14":10,"15":10,"16":6,"45":16,"542":2,"546":2,"548":2,"565":2,"650":6,"651":8,"663":4,"688":10,"689":6}}],["nabcd",{"2":{"789":2}}],["nand",{"0":{"58":1},"2":{"50":1,"58":10}}],["name",{"0":{"750":1},"2":{"7":12,"74":8,"77":6,"82":14,"483":8,"507":6,"585":8,"689":8,"690":8,"738":1,"740":6,"741":10,"742":6,"743":10,"744":6,"745":10,"746":6,"747":6,"748":6,"749":4,"750":12,"751":4,"752":2,"877":2}}],["nonematch",{"0":{"732":1},"2":{"707":1,"732":6}}],["notequal",{"2":{"899":4,"900":4}}],["nothin",{"2":{"507":4}}],["nothing",{"2":{"210":2,"226":2}}],["notok",{"2":{"340":4}}],["nor",{"0":{"56":1},"2":{"50":1,"56":10}}],["nowdateortime",{"0":{"441":1},"2":{"401":1,"441":6}}],["now",{"2":{"25":2,"26":2,"27":2,"28":2,"43":2,"404":12,"405":12,"406":12,"407":12,"438":2}}],["net",{"2":{"568":1,"574":4,"575":2,"576":2,"579":10,"580":10,"581":2,"582":2,"583":2,"584":2}}],["netutil",{"0":{"567":1},"1":{"568":1,"569":1,"570":1,"571":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1},"2":{"0":1,"567":1,"568":2,"569":2,"572":4,"573":4,"574":4,"575":4,"576":4,"577":4,"578":4,"579":8,"580":8,"581":4,"582":6,"583":6,"584":6,"585":4,"586":4,"587":4,"588":4,"589":4,"590":4,"591":6,"592":4,"593":4,"594":6,"595":6}}],["next指针指向下一个节点",{"2":{"223":1}}],["next",{"2":{"222":6,"274":2,"380":6}}],["newencoder",{"2":{"886":2}}],["newtuple10",{"2":{"846":4,"847":2}}],["newtuple9",{"2":{"842":4,"843":2}}],["newtuple8",{"2":{"838":4,"839":2}}],["newtuple7",{"2":{"834":4,"835":2}}],["newtuple6",{"2":{"830":4,"831":2}}],["newtuple5",{"2":{"826":4,"827":2}}],["newtuple4",{"2":{"822":4,"823":2}}],["newtuple3",{"2":{"818":4}}],["newtuple2",{"2":{"814":4,"815":2,"819":2}}],["newhttpclientwithconfig",{"2":{"582":4}}],["newhttpclient",{"2":{"582":2,"583":2,"584":2}}],["newhashmapwithcapacity",{"0":{"179":1},"2":{"176":1,"179":4}}],["newhashmap",{"0":{"178":1},"2":{"176":1,"178":4,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2}}],["newwatcher",{"2":{"501":4}}],["new",{"0":{"740":1,"893":1},"2":{"495":4,"625":2,"626":2,"627":2,"628":2,"629":2,"680":2,"681":2,"738":1,"740":4,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"891":1,"893":4,"894":2,"895":2,"896":4,"897":4,"898":2,"899":6,"900":6,"901":2,"902":2,"903":2,"904":2}}],["newiso8601",{"0":{"432":1},"2":{"401":1,"432":4,"436":2}}],["newformat",{"0":{"431":1},"2":{"401":1,"431":4,"434":2,"435":2}}],["newunix",{"0":{"430":1},"2":{"401":1,"430":4}}],["newunixnow",{"0":{"429":1},"2":{"401":1,"429":4,"433":2}}],["newbstree",{"0":{"388":1},"2":{"385":1,"388":4,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":4,"397":2}}],["newarraystack",{"0":{"363":1},"2":{"359":1,"363":4,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2}}],["newarrayqueue",{"0":{"288":1},"2":{"282":1,"288":4,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2}}],["newsetfromslice",{"0":{"336":1},"2":{"333":1,"336":4}}],["newset",{"0":{"335":1},"2":{"333":1,"335":4,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":6,"344":2,"345":2,"346":6,"347":2,"348":2,"349":4,"350":4,"351":4,"352":4,"353":6,"354":2}}],["newsinglylink",{"0":{"208":1},"2":{"204":1,"208":4,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2}}],["newpriorityqueue",{"0":{"323":1},"2":{"285":1,"323":4,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2}}],["newlinkedstack",{"0":{"372":1},"2":{"360":1,"372":4,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2}}],["newlinkedqueue",{"0":{"300":1},"2":{"283":1,"300":4,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2}}],["newlist",{"0":{"243":1},"2":{"241":1,"243":4,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":6,"258":4,"259":2,"260":2,"261":4,"262":2,"263":2,"264":2,"265":2,"266":2,"267":4,"268":4,"269":4,"270":4,"271":12,"272":12,"273":2,"274":2,"275":2,"276":2,"277":2}}],["newlrucache",{"2":{"17":4}}],["newdoublylink",{"0":{"224":1},"2":{"205":1,"224":4,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2}}],["newmaxheap",{"0":{"193":1},"2":{"193":4,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2}}],["newconcurrentmap",{"0":{"529":1},"2":{"505":1,"529":6,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2}}],["newcopyonwritelist",{"0":{"138":1},"1":{"139":1},"2":{"136":1,"138":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2}}],["newcircularqueue",{"0":{"311":1},"2":{"284":1,"311":4,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2}}],["newchannel",{"0":{"37":1},"2":{"34":1,"37":4,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2}}],["0或",{"2":{"700":1}}],["0aw7cq",{"2":{"617":2}}],["0f",{"2":{"576":6}}],["09",{"2":{"576":2}}],["0777",{"2":{"463":2,"464":2,"473":2}}],["07",{"2":{"441":4}}],["035172",{"2":{"616":2}}],["03",{"2":{"431":2,"434":4,"435":4,"440":2}}],["05+08",{"2":{"436":2}}],["05",{"2":{"427":2,"431":2,"432":2,"434":4,"435":6,"436":2}}],["04",{"2":{"427":8,"428":8,"431":2,"432":2,"434":4,"435":6,"436":4,"440":2}}],["024kb",{"2":{"484":2}}],["02t23",{"2":{"436":2}}],["02t15",{"2":{"432":2,"436":2}}],["02",{"2":{"427":10,"428":12,"435":2,"439":4,"440":2,"441":2}}],["06",{"2":{"423":2,"424":2,"440":6}}],["08",{"2":{"408":2,"409":2,"410":2,"411":2,"414":2,"415":2,"416":2,"427":6,"428":8}}],["010",{"2":{"866":2}}],["01",{"2":{"408":2,"409":2,"410":2,"411":2,"412":4,"413":4,"414":2,"415":2,"416":2,"417":2,"418":2,"420":2,"422":2,"427":10,"428":12,"432":2,"435":2,"436":4,"439":8,"441":4}}],["0xc000010250",{"2":{"380":2}}],["0xc000010260",{"2":{"380":2}}],["0xc0000a4060",{"2":{"222":2}}],["0xc0000a4048",{"2":{"222":2}}],["0cc175b9c0f1b6a831c399e269772661",{"2":{"121":2}}],["0jt",{"2":{"114":2}}],["00",{"2":{"408":2,"409":4,"410":6,"411":6,"412":6,"413":6,"423":9,"425":2,"428":6,"436":2}}],["002",{"2":{"82":2}}],["003",{"2":{"82":2}}],["003366",{"2":{"65":2,"66":2}}],["003s",{"2":{"43":2}}],["001",{"2":{"29":4,"82":6}}],["0",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":6,"15":6,"16":2,"17":2,"29":24,"39":10,"52":2,"53":10,"54":10,"55":8,"56":8,"57":8,"58":8,"59":6,"65":2,"66":2,"67":8,"71":8,"72":4,"76":4,"79":2,"80":2,"81":8,"82":8,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"210":2,"226":2,"244":2,"246":2,"247":4,"248":2,"249":4,"250":2,"254":2,"255":5,"256":2,"263":2,"264":2,"273":2,"274":2,"325":2,"326":2,"327":2,"328":2,"329":2,"340":4,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"439":8,"440":24,"495":2,"496":4,"497":2,"499":2,"501":2,"509":2,"512":2,"530":6,"531":6,"532":4,"533":4,"534":4,"535":4,"536":2,"543":2,"550":4,"551":12,"552":12,"553":12,"554":2,"555":8,"556":2,"559":2,"562":8,"563":10,"564":2,"565":2,"566":8,"579":6,"580":6,"586":2,"587":2,"588":2,"589":2,"590":2,"605":2,"619":4,"625":2,"626":2,"627":2,"628":2,"629":2,"640":9,"643":2,"647":4,"648":2,"649":2,"650":2,"651":2,"652":2,"655":2,"656":2,"657":2,"658":2,"659":2,"664":2,"669":4,"670":2,"673":2,"677":2,"678":2,"680":2,"691":2,"697":2,"700":2,"713":2,"716":2,"719":2,"720":2,"722":8,"724":2,"725":2,"730":2,"733":2,"776":2,"780":4,"787":2,"807":2,"814":4,"815":4,"816":4,"817":4,"818":4,"819":4,"820":4,"821":4,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"871":4,"872":4,"873":4,"879":28,"880":16,"881":16,"885":2,"902":6}}],["1c",{"2":{"788":4}}],["1bar",{"2":{"762":2,"763":2,"764":2,"773":2,"774":2}}],["1😄$",{"2":{"762":2,"763":2,"764":2,"773":2,"774":2}}],["192",{"2":{"574":2,"575":2,"579":2,"580":2}}],["13263527980",{"2":{"864":2}}],["1324265",{"2":{"791":2}}],["13242658976",{"2":{"791":4}}],["132",{"2":{"791":4}}],["13",{"2":{"551":2,"552":2}}],["1mib",{"2":{"485":2}}],["1kib",{"2":{"485":2}}],["1kb",{"2":{"484":2}}],["168",{"2":{"574":2,"575":2,"579":2,"580":2}}],["1682391110",{"2":{"470":2}}],["1690363051331788000",{"2":{"445":2}}],["1690363051331784",{"2":{"444":2}}],["1690363051331",{"2":{"443":2}}],["1690363051",{"2":{"442":2}}],["1647594245",{"2":{"431":2}}],["1647597438",{"2":{"429":2,"430":4,"433":2}}],["1643385599",{"2":{"426":2}}],["1643299200",{"2":{"425":2}}],["16",{"2":{"427":6,"428":8,"472":2}}],["15",{"2":{"421":2,"422":2,"427":2,"435":2,"441":2,"689":4,"690":4}}],["18+泛型代替",{"0":{"666":1,"667":1,"692":1}}],["180",{"2":{"556":2,"557":2,"562":2,"563":2}}],["18mib",{"2":{"485":2}}],["18",{"2":{"408":4,"409":4,"410":2,"411":2,"412":2,"413":2,"414":4,"415":4,"416":2,"417":2,"418":2,"419":2,"431":2,"434":4,"435":4,"561":2,"576":2,"787":2,"906":5}}],["1之间",{"2":{"256":1}}],["125",{"2":{"551":6,"552":6,"553":6}}],["124",{"2":{"551":2,"552":2,"553":2}}],["12492",{"2":{"487":2}}],["12288",{"2":{"487":4}}],["12200",{"2":{"486":2}}],["12000",{"2":{"486":4}}],["12ki",{"2":{"487":2}}],["12k",{"2":{"486":2}}],["127",{"2":{"82":4,"579":2,"580":2,"807":1,"879":4,"880":2,"881":2}}],["12",{"2":{"72":4,"79":2,"80":2,"194":4,"195":4,"196":6,"197":4,"199":4,"277":2,"419":2,"472":2,"486":8,"487":8,"551":2,"552":2,"553":4,"787":2,"788":4,"875":2}}],["1234",{"2":{"678":2}}],["123456",{"2":{"863":2,"865":2,"867":2}}],["123456789",{"2":{"507":4}}],["1234567",{"2":{"481":2,"484":4,"485":4}}],["12345",{"2":{"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"481":2}}],["1230",{"2":{"71":2}}],["123",{"2":{"67":2,"72":8,"75":4,"481":4,"585":4,"595":2,"601":4,"602":4,"604":4,"605":4,"793":2,"862":2,"866":2,"887":2}}],["111",{"2":{"745":2,"746":4,"747":2}}],["112",{"2":{"578":4,"579":2,"580":2}}],["1136214245",{"2":{"432":2}}],["11",{"2":{"71":4,"194":4,"195":2,"196":2,"197":4,"199":4,"325":2,"326":2,"327":2,"328":2,"518":2,"740":2,"741":6,"742":2,"743":4,"744":2,"747":2,"748":4,"749":2,"750":2,"751":2,"791":2}}],["141592653589793",{"2":{"556":2}}],["14",{"2":{"29":2,"417":2,"472":2}}],["1e",{"2":{"29":2}}],["1774mib",{"2":{"485":2}}],["17",{"2":{"7":4,"431":2,"434":4,"435":4}}],["10元元组",{"2":{"846":1}}],["101",{"2":{"74":4}}],["10000000",{"2":{"501":2}}],["10000",{"2":{"483":4}}],["1000",{"2":{"179":2,"484":2}}],["100",{"2":{"74":4,"77":2,"82":2,"179":2,"263":4,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"497":4,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"543":2,"689":4,"690":4}}],["1024",{"2":{"484":2,"485":6}}],["102",{"2":{"65":2,"66":2}}],["10",{"2":{"7":4,"82":2,"178":1,"194":4,"195":2,"196":2,"197":4,"199":4,"325":4,"326":4,"327":2,"328":2,"329":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"508":2,"543":8,"578":4,"579":2,"580":2,"582":2,"612":2,"619":2,"673":2,"674":2,"678":2,"882":2}}],["1",{"0":{"192":1,"204":1,"207":1,"282":1,"287":1,"359":1,"362":1,"385":1,"387":1},"1":{"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"6":8,"7":4,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":13,"15":13,"16":5,"17":8,"23":28,"24":14,"25":10,"26":10,"27":12,"28":12,"29":6,"38":6,"39":8,"40":4,"41":6,"43":4,"44":8,"45":4,"46":10,"52":4,"53":4,"54":4,"55":8,"56":8,"57":8,"58":8,"59":8,"67":2,"69":4,"70":4,"71":6,"73":4,"76":8,"78":4,"81":20,"82":12,"139":2,"141":2,"143":2,"145":2,"147":1,"148":4,"149":1,"150":6,"154":4,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":4,"178":1,"181":4,"182":4,"183":2,"184":2,"185":2,"186":4,"193":4,"194":8,"195":6,"196":6,"197":8,"198":4,"199":8,"209":4,"210":10,"211":4,"212":4,"213":5,"214":2,"215":4,"216":4,"217":4,"218":2,"219":2,"220":2,"221":2,"222":4,"225":4,"226":10,"227":4,"228":4,"229":5,"230":2,"231":4,"232":4,"233":2,"234":2,"235":2,"236":2,"237":2,"243":2,"244":4,"245":4,"246":4,"247":7,"248":9,"249":7,"250":9,"251":4,"252":4,"253":4,"254":8,"255":12,"256":10,"257":6,"258":2,"259":2,"260":4,"261":4,"262":2,"264":4,"265":4,"266":4,"267":4,"268":2,"269":4,"270":4,"271":14,"272":12,"273":4,"274":4,"275":6,"276":2,"277":26,"290":4,"291":4,"292":6,"293":4,"294":2,"295":2,"296":2,"297":2,"298":4,"302":4,"303":4,"304":6,"305":4,"306":2,"307":2,"308":2,"309":4,"313":4,"314":4,"315":6,"316":4,"317":2,"318":2,"319":2,"320":2,"321":4,"325":8,"326":8,"327":6,"328":6,"329":6,"335":4,"336":4,"337":4,"338":4,"339":6,"340":4,"341":4,"342":4,"343":6,"344":2,"345":2,"346":6,"347":4,"348":2,"349":2,"350":4,"351":2,"352":4,"353":4,"354":2,"364":4,"365":4,"366":4,"367":4,"368":2,"369":2,"370":2,"373":4,"374":4,"375":4,"376":4,"377":2,"378":2,"379":2,"380":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"404":4,"407":4,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"438":4,"439":20,"471":3,"482":4,"484":6,"485":4,"495":4,"497":2,"500":2,"507":4,"508":2,"509":2,"510":4,"511":2,"512":4,"513":2,"514":4,"515":12,"516":4,"517":8,"518":2,"519":2,"520":4,"521":6,"522":4,"523":4,"524":4,"525":4,"526":4,"527":2,"528":2,"530":2,"531":2,"532":2,"542":12,"543":4,"544":18,"545":4,"546":14,"548":18,"550":4,"554":14,"555":22,"556":2,"558":4,"559":4,"560":24,"561":8,"562":4,"563":2,"565":10,"566":8,"572":2,"574":2,"575":2,"579":4,"580":4,"581":2,"583":4,"584":4,"585":4,"586":4,"587":4,"588":8,"589":4,"590":8,"591":2,"603":4,"612":2,"619":2,"636":2,"637":10,"639":2,"640":4,"641":4,"642":6,"643":2,"644":4,"645":6,"646":4,"647":2,"648":4,"649":4,"650":2,"651":6,"652":2,"653":6,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"662":2,"663":2,"664":4,"665":4,"666":6,"668":2,"669":22,"670":3,"671":5,"672":4,"673":3,"674":4,"675":4,"677":2,"678":4,"679":2,"680":4,"683":4,"684":6,"685":6,"686":6,"688":6,"689":4,"691":2,"693":4,"697":4,"698":6,"699":4,"700":20,"701":4,"702":2,"703":6,"709":4,"710":4,"711":4,"712":6,"713":2,"714":4,"715":6,"716":2,"717":4,"718":6,"719":10,"720":10,"721":4,"722":10,"723":6,"724":2,"725":2,"726":4,"727":4,"728":2,"729":4,"730":4,"731":4,"732":4,"733":2,"734":4,"742":2,"752":2,"763":4,"764":4,"766":2,"769":2,"770":2,"771":2,"773":4,"774":4,"776":6,"787":11,"788":2,"790":2,"807":1,"814":8,"815":8,"816":8,"817":8,"818":8,"819":8,"820":8,"821":8,"822":8,"823":8,"824":8,"825":8,"826":8,"827":8,"828":8,"829":8,"830":8,"831":8,"832":8,"833":8,"834":8,"835":8,"836":8,"837":8,"838":8,"839":8,"840":8,"841":8,"842":12,"843":12,"844":8,"845":8,"846":12,"847":12,"848":8,"849":8,"871":2,"872":2,"873":2,"879":4,"880":4,"881":4,"885":2,"906":1}}],["==",{"0":{"440":1},"2":{"16":2,"81":2,"166":2,"249":4,"250":4,"277":2,"345":2,"509":2,"512":2,"626":2,"627":2,"628":2,"629":2,"637":12,"643":2,"646":2,"650":2,"651":2,"652":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"664":2,"673":2,"691":2,"716":2}}],["=",{"2":{"6":8,"7":8,"8":8,"9":8,"10":8,"11":8,"12":8,"13":10,"14":12,"15":12,"16":8,"17":10,"23":14,"24":8,"25":16,"26":18,"27":16,"28":18,"29":12,"37":2,"38":16,"39":14,"40":6,"41":8,"42":10,"43":8,"44":8,"45":10,"46":10,"52":22,"59":8,"65":4,"66":8,"67":6,"68":4,"69":6,"70":8,"71":12,"72":10,"73":6,"74":4,"75":2,"76":14,"77":4,"78":4,"79":2,"80":6,"81":8,"82":8,"83":4,"84":4,"85":4,"91":8,"92":8,"93":8,"94":8,"95":8,"96":8,"97":8,"98":8,"99":8,"100":2,"101":2,"102":8,"103":8,"104":8,"105":8,"106":8,"107":8,"108":8,"109":8,"110":8,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":6,"119":4,"120":2,"121":2,"122":2,"123":2,"124":4,"125":2,"126":4,"127":2,"128":4,"129":2,"130":4,"131":10,"132":10,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"178":2,"179":2,"180":4,"181":4,"182":6,"183":2,"184":2,"185":4,"186":4,"193":6,"194":10,"195":12,"196":12,"197":10,"198":10,"199":10,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":4,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":4,"234":2,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":4,"247":2,"248":2,"249":2,"250":2,"251":2,"252":4,"253":4,"254":2,"255":2,"256":2,"257":6,"258":4,"259":2,"260":4,"261":6,"262":2,"263":4,"264":2,"265":2,"266":2,"267":6,"268":6,"269":6,"270":6,"271":12,"272":12,"273":6,"274":10,"275":4,"276":2,"277":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":4,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":10,"326":12,"327":10,"328":10,"329":10,"335":2,"336":2,"337":2,"338":2,"339":6,"340":10,"341":2,"342":2,"343":6,"344":2,"345":4,"346":6,"347":6,"348":2,"349":4,"350":6,"351":6,"352":6,"353":10,"354":4,"363":2,"364":2,"365":4,"366":4,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":4,"375":4,"376":2,"377":2,"378":2,"379":2,"380":2,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"396":8,"397":6,"404":10,"405":10,"406":10,"407":10,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":8,"428":6,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":4,"436":4,"437":4,"438":10,"439":12,"440":12,"441":4,"442":2,"443":2,"444":2,"445":2,"451":4,"452":2,"453":2,"454":4,"455":2,"456":4,"457":6,"458":2,"459":2,"460":4,"461":2,"462":4,"463":6,"464":6,"465":4,"466":4,"467":4,"468":2,"469":2,"470":2,"471":6,"472":2,"473":14,"474":14,"475":14,"481":6,"482":4,"483":6,"484":8,"485":8,"486":8,"487":8,"493":2,"494":2,"495":8,"496":8,"497":6,"498":2,"499":6,"500":10,"501":8,"507":4,"508":2,"509":6,"510":4,"511":4,"512":6,"513":4,"514":4,"515":12,"516":4,"517":6,"518":6,"519":4,"520":4,"521":4,"522":4,"523":4,"524":4,"525":2,"526":4,"527":10,"528":8,"529":2,"530":8,"531":8,"532":6,"533":6,"534":10,"535":8,"536":4,"542":6,"543":6,"544":6,"545":6,"546":4,"547":6,"548":4,"549":6,"550":6,"551":6,"552":6,"553":6,"554":8,"555":8,"556":6,"557":6,"558":2,"559":8,"560":10,"561":6,"562":10,"563":10,"564":6,"565":4,"566":6,"572":4,"573":6,"574":4,"575":2,"576":2,"577":4,"578":6,"579":6,"580":6,"581":6,"582":4,"583":14,"584":14,"585":4,"586":10,"587":12,"588":14,"589":8,"590":14,"591":14,"592":2,"593":2,"594":4,"595":4,"601":4,"602":8,"603":10,"604":12,"605":12,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":4,"619":2,"625":8,"626":10,"627":8,"628":10,"629":10,"635":4,"636":4,"637":12,"638":4,"639":12,"640":8,"641":4,"642":6,"643":6,"644":6,"645":8,"646":8,"647":6,"648":8,"649":8,"650":8,"651":10,"652":6,"653":10,"654":8,"655":6,"656":6,"657":6,"658":6,"659":6,"660":4,"661":4,"662":6,"663":2,"664":6,"665":6,"666":4,"667":4,"668":6,"669":10,"670":6,"671":6,"672":6,"673":6,"674":6,"675":6,"676":2,"677":6,"678":4,"679":2,"680":12,"681":2,"682":2,"683":4,"684":6,"685":6,"686":6,"687":6,"688":4,"689":4,"690":6,"691":6,"692":4,"693":6,"694":2,"695":10,"696":2,"697":4,"698":6,"699":6,"700":10,"701":2,"702":2,"703":6,"709":4,"710":4,"711":8,"712":4,"713":10,"714":8,"715":8,"716":6,"717":6,"718":8,"719":10,"720":10,"721":4,"722":10,"723":4,"724":4,"725":4,"726":4,"727":4,"728":4,"729":4,"730":6,"731":6,"732":6,"733":4,"734":4,"740":4,"741":8,"742":6,"743":6,"744":4,"745":8,"746":6,"747":12,"748":8,"749":8,"750":8,"751":8,"752":6,"758":10,"759":10,"760":8,"761":8,"762":6,"763":6,"764":6,"765":6,"766":10,"767":6,"768":6,"769":14,"770":14,"771":14,"772":4,"773":6,"774":6,"775":26,"776":12,"777":8,"778":10,"779":12,"780":12,"781":4,"782":4,"783":4,"784":6,"785":4,"786":4,"787":12,"788":6,"789":8,"790":6,"791":10,"792":6,"793":8,"794":6,"800":2,"801":2,"802":2,"803":4,"804":4,"805":8,"806":6,"807":8,"808":2,"814":2,"815":4,"816":2,"817":2,"818":2,"819":4,"820":2,"821":2,"822":2,"823":4,"824":2,"825":2,"826":2,"827":4,"828":2,"829":2,"830":2,"831":4,"832":2,"833":2,"834":2,"835":4,"836":2,"837":2,"838":2,"839":4,"840":2,"841":2,"842":2,"843":4,"844":2,"845":2,"846":2,"847":4,"848":2,"849":2,"855":6,"856":6,"857":6,"858":6,"859":6,"860":6,"861":6,"862":10,"863":4,"864":4,"865":4,"866":4,"867":4,"868":6,"869":4,"870":6,"871":8,"872":8,"873":8,"874":8,"875":8,"876":8,"877":8,"878":4,"879":8,"880":4,"881":4,"882":4,"883":6,"884":4,"885":8,"886":6,"887":10,"893":2,"894":4,"895":8,"896":4,"897":6,"898":4,"899":10,"900":10,"901":4,"902":6,"903":6,"904":2,"905":8,"908":4}}],["运行",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["示例",{"0":{"139":1,"141":1,"143":1,"145":1,"148":1,"150":1,"152":1,"154":1,"156":1,"158":1,"160":1,"162":1,"164":1,"166":1,"168":1,"170":1,"172":1,"908":1},"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["tunwarpordefault",{"2":{"605":1}}],["tunwarpor",{"2":{"604":1}}],["tuples",{"2":{"817":2,"821":2,"825":2,"829":2,"833":2,"837":2,"841":2,"845":2,"849":2}}],["tuple10",{"0":{"846":1,"847":1},"2":{"812":2,"846":4,"847":2,"848":2,"849":4}}],["tuple9",{"0":{"842":1,"843":1},"2":{"812":2,"842":4,"843":2,"844":2,"845":4}}],["tuple8",{"0":{"838":1,"839":1},"2":{"812":2,"838":4,"839":2,"840":2,"841":4}}],["tuple7",{"0":{"834":1,"835":1},"2":{"812":2,"834":4,"835":2,"836":2,"837":4}}],["tuple6",{"0":{"830":1,"831":1},"2":{"812":2,"830":4,"831":2,"832":2,"833":4}}],["tuple5",{"0":{"826":1,"827":1},"2":{"812":2,"826":4,"827":2,"828":2,"829":4}}],["tuple4",{"0":{"822":1,"823":1},"2":{"812":2,"822":4,"823":2,"824":2,"825":4}}],["tuple3",{"0":{"818":1,"819":1},"2":{"812":2,"818":4,"819":2,"820":2,"821":4}}],["tuple2",{"0":{"814":1,"815":1},"2":{"812":2,"814":4,"815":2,"816":2,"817":4}}],["tuple包实现一个元组数据类型",{"2":{"809":1}}],["tuple",{"0":{"809":1},"1":{"810":1,"811":1,"812":1,"813":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1},"2":{"0":1,"810":2,"814":4,"815":4,"816":4,"817":6,"818":4,"819":4,"820":4,"821":6,"822":4,"823":4,"824":4,"825":6,"826":4,"827":4,"828":4,"829":6,"830":4,"831":4,"832":4,"833":6,"834":4,"835":4,"836":4,"837":6,"838":4,"839":4,"840":4,"841":6,"842":4,"843":4,"844":4,"845":6,"846":4,"847":4,"848":4,"849":6}}],["tlsconfig",{"2":{"582":2}}],["tls",{"2":{"582":6}}],["typicode",{"2":{"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["type2",{"2":{"457":4}}],["type1",{"2":{"457":4}}],["type",{"2":{"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"37":1,"74":2,"77":2,"81":2,"82":8,"193":3,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"208":3,"224":3,"243":1,"288":2,"300":4,"311":2,"323":2,"325":2,"326":2,"327":2,"328":2,"329":2,"335":1,"363":1,"372":3,"388":6,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"431":1,"432":1,"483":2,"507":2,"524":1,"529":4,"577":2,"581":3,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":4,"590":4,"591":4,"637":2,"689":2,"690":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":4,"748":2,"749":2,"750":2,"751":2,"752":2,"807":1,"814":1,"818":1,"822":1,"826":1,"830":1,"834":1,"838":1,"842":1,"846":3,"847":2}}],["title",{"2":{"581":2,"583":4,"584":4,"587":2,"588":4,"590":4,"591":4}}],["times",{"2":{"627":2}}],["timestampnano",{"0":{"445":1},"2":{"401":1,"445":4}}],["timestampmicro",{"0":{"444":1},"2":{"401":1,"444":4}}],["timestampmilli",{"0":{"443":1},"2":{"401":1,"443":4}}],["timestamp",{"0":{"442":1},"2":{"401":1,"425":1,"426":1,"442":4,"470":1}}],["timezone",{"2":{"427":2,"428":2,"441":2,"442":2,"443":2,"444":2,"445":2}}],["timefunc",{"2":{"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1}}],["time2",{"2":{"25":4,"26":4,"27":4,"28":4}}],["time",{"2":{"25":4,"26":4,"27":4,"28":4,"43":14,"404":11,"405":11,"406":11,"407":11,"408":13,"409":13,"410":13,"411":15,"412":13,"413":13,"414":13,"415":13,"416":13,"417":15,"418":13,"419":13,"427":8,"428":4,"438":10,"439":16,"440":16,"497":12,"498":4,"499":8,"501":2,"582":8,"583":2,"584":2,"625":4,"626":2,"628":4,"629":2}}],["time1",{"2":{"25":6,"26":6,"27":6,"28":6}}],["ttype",{"2":{"495":1}}],["txt",{"2":{"451":2,"452":2,"454":4,"456":2,"457":2,"458":4,"459":2,"460":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"469":2,"470":2,"471":6,"474":2,"475":2}}],["t2",{"2":{"438":2}}],["t1",{"2":{"438":2}}],["ts",{"2":{"435":4,"436":4,"442":4,"443":4,"444":4,"445":4}}],["tpl",{"2":{"435":2}}],["tm",{"2":{"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4}}],["thetimetype",{"2":{"429":1,"430":1}}],["thetime",{"2":{"429":3,"430":3,"431":4,"432":4,"433":2,"434":2,"435":2,"436":2}}],["t类型应该实现lancetconstraints",{"2":{"387":1}}],["tryunwrap",{"0":{"905":1},"2":{"891":1,"905":6}}],["trim",{"0":{"789":1},"2":{"756":1,"789":8}}],["transform",{"0":{"526":1},"2":{"496":4,"505":1,"526":4}}],["truncround",{"0":{"553":1},"2":{"540":1,"553":8,"564":4}}],["trunc",{"2":{"463":2,"464":2,"473":2}}],["true",{"2":{"17":6,"23":8,"24":6,"25":8,"26":8,"27":8,"28":8,"29":6,"52":18,"53":2,"54":6,"55":4,"56":2,"57":4,"58":6,"67":10,"71":2,"72":2,"76":4,"81":8,"83":2,"84":4,"85":2,"151":1,"171":1,"183":2,"195":2,"220":2,"235":2,"244":2,"246":2,"252":2,"253":2,"257":2,"258":2,"275":6,"295":2,"296":2,"297":2,"298":2,"307":2,"308":2,"309":2,"318":2,"319":2,"320":2,"321":2,"327":2,"328":2,"339":2,"340":2,"342":2,"343":2,"345":4,"346":2,"348":2,"349":2,"354":2,"369":2,"378":2,"396":2,"437":2,"440":4,"458":2,"460":2,"475":2,"501":2,"527":2,"528":2,"530":10,"531":10,"534":2,"535":2,"536":2,"559":2,"579":2,"580":4,"582":2,"594":2,"595":2,"636":2,"637":4,"638":2,"640":8,"650":2,"651":2,"653":2,"654":2,"656":2,"657":2,"658":2,"659":2,"663":2,"673":2,"684":2,"685":2,"686":4,"687":4,"691":2,"695":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"744":2,"747":2,"748":2,"749":2,"752":2,"766":6,"775":6,"782":2,"784":4,"785":2,"786":2,"792":2,"793":4,"794":2,"806":2,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"855":4,"856":2,"857":4,"858":4,"859":2,"860":2,"861":2,"862":6,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":4,"874":4,"875":6,"876":6,"877":4,"878":2,"879":4,"880":2,"881":2,"882":2,"883":4,"884":2,"885":4,"886":2,"887":8,"899":2,"900":2,"905":2}}],["treenode",{"2":{"388":8}}],["tree",{"0":{"381":1},"1":{"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"382":1,"383":4,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"396":8,"397":6}}],["to",{"2":{"740":2}}],["toslicepointer",{"0":{"695":1},"2":{"633":1,"695":4}}],["toslice",{"0":{"694":1,"734":1},"2":{"633":1,"694":4,"707":1,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":4,"716":2,"717":2,"718":4,"719":8,"720":8,"721":2,"722":8,"723":4,"734":4}}],["tostring",{"0":{"76":1},"2":{"63":1,"76":16}}],["todoresp",{"2":{"591":6}}],["todovalues",{"2":{"585":8}}],["todoquery",{"2":{"585":4}}],["todo",{"2":{"583":10,"584":10,"588":8,"590":8,"591":4,"625":2}}],["todos",{"2":{"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["today",{"2":{"438":10}}],["tolower",{"2":{"496":6}}],["toupper",{"2":{"496":6}}],["tounix",{"0":{"433":1},"2":{"401":1,"433":4}}],["tomorrow",{"2":{"404":4,"438":4}}],["tomap",{"0":{"74":1,"741":1},"2":{"63":1,"74":4,"738":1,"741":9}}],["toiso8601",{"0":{"436":1},"2":{"401":1,"436":4}}],["toindex",{"2":{"169":1,"276":2}}],["tointerface",{"0":{"83":1},"2":{"63":1,"83":4}}],["toint",{"0":{"72":1},"2":{"63":1,"72":12}}],["toformatfortpl",{"0":{"435":1},"2":{"401":1,"435":4}}],["toformat",{"0":{"434":1},"2":{"401":1,"434":4}}],["tofloat",{"0":{"71":1},"2":{"63":1,"71":14}}],["total",{"2":{"82":14,"550":2}}],["topointer",{"0":{"75":1},"2":{"63":1,"75":4}}],["tojson",{"0":{"73":1},"2":{"63":1,"73":4}}],["tochannel",{"0":{"70":1},"2":{"63":1,"70":4}}],["tochar",{"0":{"69":1},"2":{"63":1,"69":8}}],["tobytes",{"0":{"68":1},"2":{"63":1,"68":4}}],["tobool",{"0":{"67":1},"2":{"63":1,"67":4}}],["text",{"2":{"457":4,"464":2,"886":2}}],["testpatchtodo",{"2":{"590":2}}],["testputtodo",{"2":{"588":2}}],["testtodo",{"2":{"587":2}}],["testitem",{"2":{"581":2}}],["testdata",{"2":{"469":2,"470":2,"471":6,"472":2}}],["test",{"2":{"77":4,"81":4,"451":2,"452":2,"454":4,"456":2,"457":2,"458":4,"459":2,"460":2,"462":2,"463":2,"465":4,"466":4,"467":4,"469":2,"470":2,"471":6,"472":2,"473":2,"475":2,"507":4,"585":4,"593":2,"877":2}}],["ternaryoperator",{"0":{"59":1},"2":{"50":1,"59":6}}],["tee",{"0":{"46":1},"2":{"34":1,"46":4}}],["tagfunc",{"2":{"745":1}}],["tagname",{"2":{"740":2}}],["tag",{"0":{"745":1},"2":{"82":1,"585":1,"738":1,"745":9}}],["tag标记",{"2":{"77":1}}],["take",{"0":{"45":1},"2":{"34":1,"39":2,"41":2,"42":2,"44":2,"45":4,"46":2}}],["targetstruct",{"2":{"585":2}}],["target",{"2":{"14":2,"15":2,"16":2,"80":2,"584":2,"636":2,"900":2}}],["tfunc",{"2":{"13":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"70":1,"75":1,"78":1,"81":1,"142":1,"155":1,"197":1,"209":1,"225":1,"245":1,"289":1,"292":1,"293":1,"301":1,"312":1,"315":1,"316":1,"324":1,"337":1,"367":1,"376":1,"391":1,"392":1,"393":1,"394":1,"496":1,"500":1,"520":1,"521":1,"523":1,"542":1,"546":1,"547":1,"548":1,"549":1,"554":1,"555":1,"560":1,"561":1,"565":1,"566":1,"601":1,"602":1,"635":1,"639":1,"640":1,"641":1,"644":1,"645":1,"646":1,"648":1,"649":1,"650":1,"651":1,"655":1,"665":1,"668":1,"669":1,"675":1,"677":1,"680":1,"681":1,"682":1,"683":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"725":1,"734":1,"905":1}}],["t",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":5,"14":6,"15":6,"16":8,"29":4,"37":6,"38":5,"39":5,"40":5,"41":5,"42":5,"43":5,"44":5,"45":5,"46":8,"52":4,"53":4,"54":4,"55":4,"56":4,"57":4,"58":4,"59":4,"70":5,"74":6,"75":5,"78":5,"81":7,"82":4,"83":2,"138":4,"140":2,"142":3,"144":6,"147":4,"149":4,"151":2,"153":4,"155":3,"157":4,"159":4,"161":4,"163":4,"165":6,"167":6,"169":2,"171":4,"193":8,"194":4,"195":4,"196":4,"197":3,"198":2,"199":2,"208":14,"209":3,"210":4,"211":4,"212":4,"213":2,"214":2,"215":2,"216":4,"217":2,"218":4,"219":2,"220":2,"221":2,"222":2,"224":16,"225":3,"226":4,"227":4,"228":4,"229":2,"230":2,"231":2,"232":2,"233":4,"234":2,"235":2,"236":2,"237":2,"243":10,"244":4,"245":3,"246":4,"247":4,"248":4,"249":4,"250":4,"251":4,"252":4,"253":4,"254":2,"255":4,"256":4,"257":4,"258":2,"259":2,"260":4,"261":6,"262":2,"263":2,"264":2,"265":2,"266":2,"267":6,"268":6,"269":6,"270":6,"271":4,"272":4,"273":4,"274":4,"275":6,"276":4,"277":4,"288":8,"289":3,"290":4,"291":4,"292":3,"293":3,"294":2,"295":2,"296":2,"297":2,"298":4,"300":16,"301":3,"302":4,"303":4,"304":4,"305":4,"306":2,"307":2,"308":2,"309":4,"311":8,"312":3,"313":4,"314":4,"315":3,"316":3,"317":2,"318":2,"319":2,"320":2,"321":4,"323":8,"324":3,"325":4,"326":4,"327":2,"328":2,"329":2,"335":10,"336":6,"337":3,"338":4,"339":4,"340":6,"341":4,"342":4,"343":4,"344":2,"345":4,"346":4,"347":4,"348":4,"349":2,"350":6,"351":6,"352":6,"353":6,"354":4,"363":8,"364":4,"365":4,"366":4,"367":3,"368":2,"369":2,"370":2,"372":14,"373":4,"374":4,"375":4,"376":3,"377":2,"378":2,"379":2,"380":2,"388":18,"389":6,"390":6,"391":5,"392":5,"393":5,"394":5,"395":4,"396":6,"397":4,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"427":10,"431":2,"433":2,"434":2,"435":2,"436":2,"439":2,"440":2,"481":4,"495":13,"496":9,"500":9,"520":5,"521":5,"522":6,"523":5,"542":5,"546":5,"547":9,"548":5,"549":9,"554":5,"555":5,"560":5,"561":5,"565":5,"566":5,"601":5,"602":5,"604":7,"605":5,"635":7,"636":6,"637":14,"638":4,"639":5,"640":5,"641":7,"642":6,"643":6,"644":5,"645":11,"646":9,"647":4,"648":5,"649":5,"650":7,"651":7,"652":6,"653":4,"654":6,"655":7,"656":8,"657":8,"658":8,"659":8,"662":6,"663":6,"664":10,"665":7,"668":5,"669":5,"670":6,"671":6,"672":6,"673":6,"674":6,"675":5,"676":4,"677":11,"678":6,"679":6,"680":9,"681":9,"682":5,"683":5,"684":4,"685":4,"686":4,"687":6,"688":4,"689":6,"691":6,"693":5,"694":5,"695":5,"696":5,"697":9,"698":5,"699":7,"700":7,"701":7,"702":7,"703":4,"709":6,"710":6,"711":6,"712":6,"713":6,"714":6,"715":4,"716":6,"717":8,"718":6,"719":4,"720":4,"721":4,"722":4,"723":6,"724":4,"725":9,"726":4,"727":4,"728":6,"729":6,"730":4,"731":4,"732":4,"733":2,"734":3,"784":2,"794":2,"814":6,"815":6,"818":8,"819":6,"822":10,"823":6,"826":12,"827":6,"830":14,"831":6,"834":16,"835":6,"838":18,"839":6,"842":20,"843":6,"846":22,"847":6,"870":2,"905":5}}],["冒泡排序",{"2":{"6":1}}],["文档",{"0":{"5":1,"22":1,"35":1,"51":1,"64":1,"90":1,"137":1,"177":1,"206":1,"242":1,"286":1,"334":1,"361":1,"386":1,"402":1,"450":1,"480":1,"492":1,"506":1,"541":1,"571":1,"600":1,"610":1,"624":1,"634":1,"708":1,"739":1,"757":1,"799":1,"813":1,"854":1,"892":1},"1":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"626":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["文件处理",{"2":{"0":1}}],["more",{"0":{"909":1}}],["mobilenum",{"2":{"864":2}}],["mode",{"2":{"456":4}}],["multipart",{"2":{"581":2}}],["m3",{"2":{"515":4,"527":4}}],["m3hsjl1i83hdltrq0+o9czgb+8kjdkra4t",{"2":{"129":2}}],["m2",{"2":{"515":6,"517":4,"518":4,"527":4,"741":4}}],["m1",{"2":{"515":8,"517":4,"518":4,"527":6,"741":4}}],["m",{"2":{"508":6,"509":8,"510":6,"511":6,"512":6,"513":6,"514":6,"516":6,"519":6,"520":6,"521":6,"522":6,"523":6,"524":6,"526":6,"528":8,"572":4}}],["mtime",{"0":{"470":1},"2":{"449":1,"470":8}}],["mmddyy",{"2":{"403":1}}],["mm",{"2":{"403":24,"420":1,"421":1,"422":2,"423":1,"424":1,"427":10,"428":10,"431":2,"434":2,"441":8}}],["minby",{"0":{"549":1},"2":{"540":1,"549":8}}],["min",{"0":{"548":1,"729":1},"2":{"540":1,"548":6,"612":3,"619":2,"707":1,"729":8}}],["minute",{"2":{"406":2}}],["minus",{"0":{"353":1,"518":1},"2":{"333":1,"353":6,"505":1,"518":4}}],["milliseconds",{"2":{"501":2}}],["millisecond",{"2":{"497":4}}],["microsecond",{"2":{"497":2,"625":2,"626":2,"628":2,"629":2}}],["mimetype",{"0":{"457":1},"2":{"449":1,"457":6}}],["midnode",{"2":{"218":4,"233":4}}],["mvu5pe6ymgk6ccti4f1zpfn2yzbw14btqwwydqwf3nu=",{"2":{"116":2}}],["md5str",{"2":{"119":4,"120":4,"121":4,"122":4}}],["md5stringwithbase64",{"0":{"120":1},"2":{"89":1,"120":4}}],["md5string",{"0":{"119":1},"2":{"89":1,"119":4}}],["md5file",{"0":{"123":1},"2":{"89":1,"123":4}}],["md5bytewithbase64",{"0":{"122":1},"2":{"89":1,"122":4}}],["md5byte",{"0":{"121":1},"2":{"89":1,"121":4}}],["md5",{"2":{"86":1}}],["msg",{"2":{"74":6}}],["method",{"2":{"578":2,"581":4,"583":2,"584":2}}],["merge",{"0":{"261":1,"517":1,"675":1},"2":{"241":1,"261":4,"505":1,"517":4,"633":1,"675":4}}],["mergesort",{"0":{"12":1},"2":{"4":1,"12":4}}],["messages",{"2":{"74":4}}],["message",{"2":{"74":6,"893":2,"894":2,"903":2}}],["mac",{"2":{"807":2}}],["macaddrs",{"2":{"576":4}}],["math",{"2":{"557":6,"562":4,"563":4,"665":2}}],["mathutil",{"0":{"537":1},"1":{"538":1,"539":1,"540":1,"541":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1},"2":{"0":1,"537":1,"538":2,"539":2,"542":8,"543":8,"544":8,"545":8,"546":6,"547":8,"548":6,"549":8,"550":8,"551":8,"552":8,"553":8,"554":10,"555":10,"556":8,"557":8,"558":4,"559":10,"560":12,"561":8,"562":12,"563":12,"564":12,"565":6,"566":2}}],["maxsize",{"2":{"720":2}}],["maxby",{"0":{"547":1},"2":{"540":1,"547":8}}],["max",{"0":{"546":1,"728":1},"2":{"540":1,"546":6,"612":3,"619":2,"707":1,"713":4,"728":8}}],["maxheap是通过slice实现的二叉堆树",{"2":{"192":1}}],["maxheap",{"0":{"192":1},"2":{"188":1,"190":1,"193":8,"194":6,"195":6,"196":8,"197":6,"198":6,"199":6}}],["may",{"2":{"530":2,"531":2,"532":2}}],["male",{"2":{"472":4,"473":4}}],["marshal序列化",{"2":{"82":1}}],["marshal",{"2":{"76":1,"588":2,"590":2}}],["make",{"2":{"38":4,"39":2,"43":2,"45":2,"263":2,"273":2,"274":2,"711":2}}],["mapper",{"2":{"520":2,"521":2,"717":2}}],["mapb",{"2":{"518":2,"527":2}}],["mapa",{"2":{"518":2,"527":2}}],["maps",{"2":{"515":2,"517":2}}],["mapvalues",{"0":{"523":1},"2":{"505":1,"523":4}}],["mapkeys",{"0":{"522":1},"2":{"505":1,"522":4}}],["mapto",{"0":{"507":1},"2":{"505":1,"507":4}}],["maptoslice",{"0":{"78":1},"2":{"63":1,"78":4}}],["map中key和value执行函数iteratee后",{"2":{"78":1}}],["map",{"0":{"672":1,"717":1},"2":{"23":4,"73":2,"74":4,"77":4,"78":4,"81":4,"275":4,"335":2,"482":2,"502":1,"503":1,"507":4,"508":4,"509":8,"510":8,"511":8,"512":8,"513":8,"514":8,"515":16,"516":4,"517":10,"518":10,"519":4,"520":4,"521":4,"522":8,"523":8,"524":4,"525":4,"526":8,"527":8,"528":6,"572":4,"586":2,"587":2,"588":2,"590":2,"591":2,"633":1,"665":6,"672":4,"702":4,"707":1,"717":4,"741":8,"788":4,"842":4,"843":4,"846":4,"847":4,"893":2,"901":2}}],["maputil",{"0":{"502":1},"1":{"503":1,"504":1,"505":1,"506":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1},"2":{"0":1,"502":1,"503":1,"504":2,"507":2,"508":4,"509":4,"510":4,"511":4,"512":4,"513":4,"514":4,"515":8,"516":4,"517":4,"518":4,"519":4,"520":4,"521":4,"522":4,"523":4,"524":4,"525":4,"526":2,"527":6,"528":6,"529":4,"530":4,"531":4,"532":4,"533":4,"534":4,"535":4,"536":4}}],["main",{"2":{"2":3,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":4,"19":2,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"31":1,"37":4,"38":4,"39":4,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":4,"48":1,"52":4,"53":4,"54":4,"55":4,"56":4,"57":4,"58":4,"59":4,"61":1,"65":4,"66":4,"67":4,"68":4,"69":4,"70":4,"71":4,"72":4,"73":4,"74":4,"75":4,"76":4,"77":4,"78":4,"79":4,"80":4,"81":4,"82":4,"83":4,"84":4,"85":4,"87":2,"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"101":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":4,"119":4,"120":4,"121":4,"122":4,"123":6,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"130":4,"131":4,"132":4,"134":1,"139":4,"141":4,"143":4,"145":4,"148":4,"150":4,"152":4,"154":4,"156":4,"158":4,"160":4,"162":4,"164":4,"166":4,"168":4,"170":4,"172":4,"174":1,"178":4,"179":4,"180":4,"181":4,"182":4,"183":4,"184":4,"185":4,"186":4,"188":1,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"201":2,"208":4,"209":4,"210":4,"211":4,"212":4,"213":4,"214":4,"215":4,"216":4,"217":4,"218":4,"219":4,"220":4,"221":4,"222":4,"224":4,"225":4,"226":4,"227":4,"228":4,"229":4,"230":4,"231":4,"232":4,"233":4,"234":4,"235":4,"236":4,"237":4,"239":1,"243":4,"244":4,"245":4,"246":4,"247":4,"248":4,"249":4,"250":4,"251":4,"252":4,"253":4,"254":4,"255":4,"256":4,"257":4,"258":4,"259":4,"260":4,"261":4,"262":4,"263":4,"264":4,"265":4,"266":4,"267":4,"268":4,"269":4,"270":4,"271":4,"272":4,"273":4,"274":4,"275":4,"276":4,"277":4,"279":4,"288":4,"289":4,"290":4,"291":4,"292":4,"293":4,"294":4,"295":4,"296":4,"297":4,"298":4,"300":4,"301":4,"302":4,"303":4,"304":4,"305":4,"306":4,"307":4,"308":4,"309":4,"311":4,"312":4,"313":4,"314":4,"315":4,"316":4,"317":4,"318":4,"319":4,"320":4,"321":4,"323":4,"324":4,"325":4,"326":4,"327":4,"328":4,"329":4,"331":1,"335":4,"336":4,"337":4,"338":4,"339":4,"340":4,"341":4,"342":4,"343":4,"344":4,"345":4,"346":4,"347":4,"348":4,"349":4,"350":4,"351":4,"352":4,"353":4,"354":4,"356":2,"363":4,"364":4,"365":4,"366":4,"367":4,"368":4,"369":4,"370":4,"372":4,"373":4,"374":4,"375":4,"376":4,"377":4,"378":4,"379":4,"380":4,"382":1,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"399":1,"404":4,"405":4,"406":4,"407":4,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":4,"421":4,"422":4,"423":4,"424":4,"425":4,"426":4,"427":4,"428":4,"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4,"437":4,"438":4,"439":4,"440":4,"441":4,"442":4,"443":4,"444":4,"445":4,"447":1,"451":4,"452":4,"453":4,"454":4,"455":4,"456":4,"457":4,"458":4,"459":4,"460":4,"461":4,"462":4,"463":4,"464":4,"465":4,"466":4,"467":4,"468":4,"469":4,"470":4,"471":4,"472":4,"473":4,"474":4,"475":4,"477":2,"481":4,"482":4,"483":4,"484":4,"485":4,"486":4,"487":4,"489":2,"493":4,"494":4,"495":4,"496":4,"497":4,"498":4,"499":4,"500":4,"501":4,"503":1,"507":4,"508":4,"509":4,"510":4,"511":4,"512":4,"513":4,"514":4,"515":4,"516":4,"517":4,"518":4,"519":4,"520":4,"521":4,"522":4,"523":4,"524":4,"525":4,"526":4,"527":4,"528":4,"529":4,"530":4,"531":4,"532":4,"533":4,"534":4,"535":4,"536":4,"538":1,"542":4,"543":4,"544":4,"545":4,"546":4,"547":4,"548":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"558":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"565":4,"566":4,"568":2,"572":4,"573":4,"574":4,"575":4,"576":4,"577":4,"578":4,"579":4,"580":4,"581":4,"582":4,"583":4,"584":4,"585":4,"586":4,"587":4,"588":4,"589":4,"590":4,"591":4,"592":4,"593":4,"594":4,"595":4,"597":1,"601":4,"602":4,"603":4,"604":4,"605":4,"607":1,"611":4,"612":4,"613":4,"614":4,"615":4,"616":4,"617":4,"618":4,"619":4,"621":1,"625":2,"626":4,"627":8,"628":4,"629":4,"631":1,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"740":4,"741":4,"742":4,"743":4,"744":4,"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"752":4,"754":1,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"814":4,"815":4,"816":4,"817":4,"818":4,"819":4,"820":4,"821":4,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"851":1,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"893":4,"894":4,"895":4,"896":4,"897":4,"898":4,"899":4,"900":4,"901":4,"902":4,"903":4,"904":4,"905":4,"908":4}}],["host",{"2":{"594":2,"595":2}}],["hour",{"2":{"405":2}}],["handshaketimeout",{"2":{"582":4}}],["hassuffixany",{"0":{"786":1},"2":{"756":1,"786":6}}],["hassubtree",{"0":{"396":1},"2":{"385":1,"396":6}}],["hasprefixany",{"0":{"785":1},"2":{"756":1,"785":6}}],["has",{"0":{"535":1},"2":{"505":1,"528":2,"535":4}}],["haskey",{"0":{"528":1},"2":{"505":1,"528":10}}],["hasnext",{"2":{"274":2}}],["hashmapfunc",{"2":{"178":1,"179":1}}],["hashmap",{"0":{"173":1},"1":{"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1},"2":{"173":1,"174":2,"175":4,"178":5,"179":5,"180":6,"181":6,"182":6,"183":6,"184":6,"185":6,"186":6}}],["hash",{"2":{"86":1}}],["httpdelete",{"0":{"589":1},"2":{"589":4}}],["httpdeletedeprecated",{"2":{"570":1}}],["http查询字符串",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["http请求header",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["httpget",{"0":{"586":1},"2":{"586":4,"591":2}}],["httpgetdeprecated",{"2":{"570":1}}],["httppatch",{"0":{"590":1},"2":{"590":4}}],["httppatchdeprecated",{"2":{"570":1}}],["httpput",{"0":{"588":1},"2":{"588":4}}],["httpputdeprecated",{"2":{"570":1}}],["httppost",{"0":{"587":1},"2":{"587":4}}],["httppostdeprecated",{"2":{"570":1}}],["httpclient发送http请求",{"2":{"583":1}}],["httpclientcfg",{"2":{"582":4}}],["httpclientconfig",{"2":{"582":8}}],["httpclienttype",{"2":{"582":1}}],["httpclient是用于发送http请求的结构体",{"2":{"582":1}}],["httpclient",{"0":{"582":1},"2":{"570":1,"582":7,"583":8,"584":8}}],["httprequest用于抽象http请求实体的结构",{"2":{"581":1}}],["httprequest",{"0":{"581":1},"2":{"570":1,"581":4,"583":4,"584":2}}],["http",{"2":{"567":1,"568":1,"573":4,"578":6,"581":4,"582":4,"583":2,"584":2,"586":4,"587":4,"588":4,"589":4,"590":4,"591":2,"593":2,"868":2,"883":2}}],["https",{"2":{"2":3,"19":2,"31":1,"48":1,"61":1,"87":2,"134":1,"174":1,"188":1,"201":2,"239":1,"279":4,"331":1,"356":2,"382":1,"399":1,"447":1,"477":2,"489":2,"503":1,"538":1,"568":2,"581":2,"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"597":1,"607":1,"621":1,"631":1,"705":1,"736":2,"754":1,"796":1,"810":1,"851":1,"889":1}}],["hh",{"2":{"403":10,"421":1,"422":1,"427":4,"428":4,"431":1,"434":1,"441":4}}],["h",{"2":{"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["hm",{"2":{"178":4,"179":4,"180":6,"181":8,"182":12,"183":10,"184":12,"185":12,"186":12}}],["hms",{"2":{"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":2}}],["hmac值",{"2":{"111":1,"113":1,"115":1,"117":1}}],["hmacsha512withbase64",{"0":{"118":1},"2":{"89":1,"118":4}}],["hmacsha512",{"0":{"117":1},"2":{"89":1,"117":4}}],["hmacsha256withbase64",{"0":{"116":1},"2":{"89":1,"116":4}}],["hmacsha256",{"0":{"115":1},"2":{"89":1,"115":4}}],["hmacsha1withbase64",{"0":{"114":1},"2":{"89":1,"114":4}}],["hmacsha1",{"0":{"113":1},"2":{"89":1,"113":4}}],["hmacmd5withbase64",{"0":{"112":1},"2":{"89":1,"112":4}}],["hmacmd5",{"0":{"111":1},"2":{"89":1,"111":4}}],["hmac",{"2":{"86":1,"112":1,"116":1,"118":1}}],["high",{"2":{"895":4,"896":2,"897":2,"898":4,"901":4,"903":4}}],["highindex",{"2":{"14":2,"15":2}}],["hidestring",{"0":{"791":1},"2":{"756":1,"791":10}}],["hi",{"2":{"74":4,"674":10}}],["header或者map",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["headers",{"2":{"581":4}}],["header",{"2":{"578":4,"581":10,"586":4,"587":4,"588":4,"590":4,"591":4}}],["heap",{"0":{"187":1},"1":{"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1},"2":{"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":4,"193":6,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6}}],["heapsort",{"0":{"11":1},"2":{"4":1,"11":4}}],["helloworld",{"2":{"794":2}}],["hello",{"2":{"42":8,"74":4,"84":2,"85":4,"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":2,"101":2,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"122":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"131":4,"132":4,"463":4,"464":4,"474":4,"475":4,"493":4,"494":6,"498":4,"781":4,"785":2,"786":2,"787":2,"792":6,"793":6,"794":4,"855":2,"908":2}}],["bin",{"2":{"807":1}}],["binarybytes",{"0":{"485":1},"2":{"479":1,"485":10}}],["binaryiterativesearch",{"0":{"15":1},"2":{"4":1,"15":6}}],["binarysearch",{"0":{"14":1},"2":{"4":1,"14":6}}],["bcde",{"2":{"776":2}}],["bcd",{"2":{"776":2}}],["bfoo",{"2":{"771":2}}],["bfooba",{"2":{"769":2}}],["bfoob",{"2":{"769":2}}],["bf",{"2":{"576":2}}],["b=",{"2":{"573":4}}],["b=2",{"2":{"572":2}}],["b2",{"2":{"523":2}}],["bucket",{"2":{"593":2}}],["buffer",{"2":{"483":2}}],["buf",{"2":{"483":6}}],["bubblesort",{"0":{"6":1},"2":{"4":1,"6":4}}],["bonjour",{"2":{"779":4,"780":2}}],["bodyparams",{"2":{"588":4,"590":4}}],["body",{"2":{"581":2,"586":6,"587":6,"588":6,"589":6,"590":6}}],["bob",{"2":{"472":2}}],["boolfunc",{"2":{"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"151":1,"153":1,"157":1,"159":1,"161":1,"171":1,"183":1,"220":1,"235":1,"244":1,"257":1,"258":1,"271":1,"272":1,"290":1,"295":1,"296":1,"298":1,"307":1,"309":1,"318":1,"319":1,"321":1,"325":1,"327":1,"328":1,"339":1,"340":1,"342":1,"343":1,"346":1,"349":1,"369":1,"378":1,"396":1,"437":1,"440":1,"452":1,"458":1,"459":1,"460":1,"468":1,"499":1,"527":1,"528":1,"535":1,"559":1,"579":1,"580":1,"594":1,"595":1,"636":1,"637":1,"638":1,"652":1,"653":1,"654":1,"684":1,"685":1,"686":1,"687":1,"691":1,"730":1,"731":1,"732":1,"744":1,"747":1,"748":1,"749":1,"752":1,"766":1,"784":1,"785":1,"786":1,"792":1,"793":1,"800":1,"801":1,"802":1,"806":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"900":1}}],["bool",{"0":{"52":1},"2":{"16":4,"17":4,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"50":1,"52":23,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"67":2,"81":6,"82":2,"83":2,"144":2,"151":1,"153":1,"157":1,"159":1,"161":1,"163":2,"165":4,"166":2,"167":2,"171":1,"183":1,"195":2,"196":2,"220":1,"235":1,"244":1,"246":2,"249":6,"250":6,"252":2,"253":2,"257":1,"258":1,"271":1,"272":1,"275":4,"277":4,"290":1,"291":2,"295":1,"296":1,"298":1,"307":1,"309":1,"314":2,"318":1,"319":1,"321":1,"325":1,"326":2,"327":1,"328":1,"335":2,"339":1,"340":7,"342":1,"343":1,"346":1,"348":4,"349":1,"354":2,"369":1,"378":1,"396":1,"437":1,"440":1,"452":1,"458":1,"459":1,"460":1,"468":1,"473":2,"475":2,"499":2,"501":2,"509":4,"512":4,"524":2,"527":1,"528":1,"531":2,"532":2,"534":2,"535":1,"536":4,"547":8,"549":8,"559":1,"579":1,"580":1,"582":6,"583":2,"584":2,"591":2,"593":2,"594":1,"595":1,"636":1,"637":11,"638":1,"640":2,"643":4,"646":4,"650":8,"651":8,"652":6,"653":1,"654":5,"655":4,"656":6,"657":6,"658":6,"659":6,"663":4,"664":4,"673":4,"684":1,"685":1,"686":1,"687":1,"689":6,"691":5,"713":6,"716":4,"723":4,"726":2,"727":2,"728":6,"729":6,"730":7,"731":7,"732":7,"744":1,"747":1,"748":1,"749":1,"752":1,"766":1,"775":2,"784":1,"785":1,"786":1,"792":1,"793":1,"794":2,"800":1,"801":1,"802":1,"806":1,"824":2,"825":2,"828":2,"829":2,"832":2,"833":2,"836":2,"837":2,"840":2,"841":2,"844":2,"845":2,"848":4,"849":4,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"900":1}}],["bafoo",{"2":{"771":2}}],["bafooba",{"2":{"769":2}}],["barbfoo",{"2":{"771":2}}],["barfoo",{"2":{"771":2}}],["bar大",{"2":{"767":4,"768":4}}],["bar$baz",{"2":{"762":2}}],["bar",{"2":{"758":12,"759":8,"760":4,"761":6,"763":10,"764":12,"765":4,"767":8,"768":8,"769":14,"770":14,"771":14,"773":10,"774":12,"785":4,"786":6,"787":2}}],["baidu",{"2":{"594":2,"595":4}}],["baz",{"2":{"528":4,"758":4,"759":8,"760":2,"761":2}}],["back",{"0":{"293":1,"305":1,"316":1},"2":{"282":1,"283":1,"284":1,"293":4,"305":4,"316":4}}],["background",{"2":{"38":2,"39":2,"40":2,"41":2,"42":2,"44":2,"45":2,"46":2}}],["bash",{"2":{"807":1}}],["base",{"2":{"564":2}}],["base64值",{"2":{"114":1,"116":1,"118":1,"120":1,"122":1,"125":1,"127":1,"129":1}}],["base64字符串值",{"2":{"112":1}}],["base64str",{"2":{"100":4}}],["base64stddecode",{"0":{"101":1},"2":{"89":1,"101":4}}],["base64stdencode",{"0":{"100":1},"2":{"89":1,"100":4}}],["base64",{"2":{"86":1,"863":2}}],["basic",{"2":{"87":1}}],["bstree是一种二叉搜索树数据结构",{"2":{"387":1}}],["bstree",{"0":{"385":1,"387":1},"1":{"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"382":1,"387":1,"388":8,"389":8,"390":10,"391":8,"392":8,"393":8,"394":8,"395":8,"396":4,"397":8}}],["bs",{"2":{"84":2,"85":2}}],["below",{"2":{"906":2}}],["beginfrom",{"2":{"411":2}}],["beginofyear",{"0":{"413":1},"2":{"401":1,"413":4}}],["beginofmonth",{"0":{"412":1},"2":{"401":1,"412":4}}],["beginofminute",{"0":{"408":1},"2":{"401":1,"408":4}}],["beginofweek",{"0":{"411":1},"2":{"401":1,"411":4}}],["beginofday",{"0":{"410":1},"2":{"401":1,"410":4}}],["beginofhour",{"0":{"409":1},"2":{"401":1,"409":4}}],["beforelast",{"0":{"761":1},"2":{"756":1,"761":10}}],["before",{"0":{"494":1,"760":1},"2":{"491":1,"494":4,"756":1,"760":10}}],["before1year",{"2":{"407":4}}],["before2minutes",{"2":{"406":4}}],["before2hours",{"2":{"405":4}}],["betweenseconds",{"0":{"438":1},"2":{"401":1,"438":6}}],["be",{"2":{"81":2}}],["blue",{"2":{"65":2,"66":2}}],["blob",{"2":{"2":3,"19":2,"31":1,"48":1,"61":1,"87":2,"134":1,"174":1,"188":1,"201":2,"239":1,"279":4,"331":1,"356":2,"382":1,"399":1,"447":1,"477":2,"489":2,"503":1,"538":1,"568":2,"597":1,"607":1,"621":1,"631":1,"705":1,"736":2,"754":1,"796":1,"810":1,"851":1,"889":1}}],["bridge",{"0":{"38":1},"2":{"34":1,"38":4}}],["b",{"2":{"7":4,"16":6,"23":4,"25":2,"26":4,"27":2,"28":6,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"65":4,"66":4,"69":2,"73":4,"78":4,"81":4,"183":2,"184":2,"185":4,"186":2,"453":5,"482":4,"495":4,"508":2,"509":4,"510":6,"511":2,"512":2,"513":4,"514":4,"515":10,"516":2,"517":4,"518":4,"519":4,"520":2,"521":8,"522":4,"523":2,"524":4,"525":4,"526":4,"527":2,"528":2,"572":2,"602":4,"603":4,"604":2,"605":2,"635":10,"636":2,"637":12,"638":6,"639":12,"640":4,"641":4,"647":10,"648":14,"649":14,"654":4,"660":4,"661":4,"667":6,"669":20,"670":2,"671":2,"676":4,"680":12,"681":4,"688":6,"689":14,"690":4,"692":6,"694":4,"695":2,"696":4,"700":18,"714":2,"723":6,"725":6,"728":7,"729":7,"775":16,"779":4,"780":2,"782":4,"783":2,"788":2,"790":6,"814":12,"815":4,"816":8,"817":6,"818":12,"819":4,"820":8,"821":6,"822":12,"823":4,"824":8,"825":6,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":16,"835":8,"836":12,"837":10,"838":16,"839":8,"840":12,"841":10,"842":16,"843":8,"844":12,"845":10,"846":16,"847":8,"848":12,"849":10,"868":2,"869":2}}],["bytestostring",{"0":{"783":1},"2":{"756":1,"783":4}}],["bytes",{"2":{"474":2,"483":2,"606":1,"783":6,"886":2}}],["bytesdata",{"2":{"68":4}}],["bytefunc",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"131":1,"132":1,"611":1}}],["bytedata",{"2":{"79":4,"80":4}}],["byte",{"2":{"68":2,"76":1,"79":2,"80":4,"84":6,"85":6,"91":9,"92":9,"93":9,"94":9,"95":9,"96":9,"97":9,"98":9,"99":9,"102":9,"103":9,"104":9,"105":9,"106":9,"107":9,"108":9,"109":9,"110":9,"121":4,"122":4,"131":5,"132":5,"474":4,"477":1,"581":2,"586":2,"587":2,"588":2,"589":2,"590":2,"611":1,"782":4,"783":4,"886":4}}],["by",{"2":{"7":2,"689":2}}],["ioutil",{"2":{"586":4,"587":4,"588":4,"589":4,"590":4,"591":2}}],["io",{"2":{"483":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["ival",{"2":{"83":6}}],["ip3",{"2":{"579":4,"580":4}}],["ip2",{"2":{"579":4,"580":4}}],["ip1",{"2":{"579":4,"580":4}}],["ipstr",{"2":{"879":2,"880":2,"881":2}}],["ips",{"2":{"575":4}}],["ip",{"2":{"82":12,"567":1,"574":4,"577":2,"578":4,"579":4,"580":4}}],["id是否匹配",{"2":{"900":1}}],["idxfrom",{"2":{"787":2}}],["id",{"0":{"899":1},"2":{"82":12,"583":6,"584":6,"585":8,"588":4,"590":4,"591":4,"865":2,"887":2,"891":1,"893":2,"899":10,"900":6,"903":4}}],["isurl",{"0":{"883":1},"2":{"853":1,"883":8}}],["isipv6",{"0":{"881":1},"2":{"853":1,"881":6}}],["isipv4",{"0":{"880":1},"2":{"853":1,"880":6}}],["isip",{"0":{"879":1},"2":{"853":1,"879":10}}],["isintstr",{"0":{"874":1},"2":{"853":1,"874":10}}],["isint",{"0":{"871":1},"2":{"853":1,"871":10}}],["isinternalip",{"0":{"580":1},"2":{"570":1,"580":8}}],["isregexmatch",{"0":{"878":1},"2":{"853":1,"878":6}}],["isjson",{"0":{"877":1},"2":{"853":1,"877":10}}],["isnumberstr",{"0":{"876":1},"2":{"853":1,"876":10}}],["isnumber",{"0":{"873":1},"2":{"853":1,"873":10}}],["iscreditcard",{"0":{"867":1},"2":{"853":1,"867":6}}],["iscreatedsucceed",{"2":{"452":4}}],["ischinesephone",{"0":{"866":1},"2":{"853":1,"866":6}}],["ischineseidnum",{"0":{"865":1},"2":{"853":1,"865":6}}],["ischinesemobile",{"0":{"864":1},"2":{"853":1,"864":6}}],["isbase64",{"0":{"863":1},"2":{"853":1,"863":6}}],["isblank",{"0":{"784":1},"2":{"756":1,"784":8}}],["isascii",{"0":{"862":1},"2":{"853":1,"862":12}}],["isascending",{"0":{"684":1},"2":{"633":1,"684":8}}],["isalllower",{"0":{"861":1},"2":{"853":1,"861":8}}],["isallupper",{"0":{"860":1},"2":{"853":1,"860":8}}],["isalpha",{"0":{"859":1},"2":{"853":1,"859":8}}],["isosmac",{"2":{"802":4}}],["isoslinux",{"2":{"801":4}}],["isoswindows",{"2":{"800":4}}],["iso8601",{"2":{"432":2}}],["ismac",{"0":{"802":1},"2":{"798":1,"802":4}}],["isweakpassword",{"0":{"884":1},"2":{"853":1,"884":6}}],["isweekend",{"0":{"440":1},"2":{"440":8}}],["isweekenddeprecated",{"2":{"401":1}}],["iswindows",{"0":{"800":1},"2":{"798":1,"800":4}}],["iszerovalue",{"0":{"885":1},"2":{"853":1,"885":10}}],["iszero",{"0":{"749":1},"2":{"738":1,"749":6}}],["iszip",{"2":{"468":4}}],["iszipfile",{"0":{"468":1},"2":{"449":1,"468":4}}],["isstrongpassword",{"0":{"882":1},"2":{"853":1,"882":6}}],["isstring",{"0":{"766":1},"2":{"756":1,"766":12}}],["isstruct",{"0":{"744":1},"2":{"738":1,"744":4}}],["isslice",{"0":{"752":1},"2":{"738":1,"752":4}}],["issortedbykey",{"0":{"687":1},"2":{"633":1,"687":8}}],["issorted",{"0":{"686":1},"2":{"633":1,"686":8}}],["isdns",{"0":{"868":1},"2":{"853":1,"868":8}}],["isdouble",{"2":{"646":4,"654":4}}],["isdescending",{"0":{"685":1},"2":{"633":1,"685":8}}],["isdisjoint",{"0":{"527":1},"2":{"505":1,"527":6}}],["isdir",{"0":{"460":1},"2":{"449":1,"460":14}}],["istelnetconnected",{"0":{"595":1},"2":{"570":1,"595":6}}],["istrue",{"2":{"59":2}}],["isprintable",{"0":{"887":1},"2":{"853":1,"887":12}}],["isprime",{"0":{"559":1},"2":{"540":1,"559":10}}],["isp",{"2":{"577":4}}],["ispingconnected",{"0":{"594":1},"2":{"570":1,"594":6}}],["ispublicip",{"0":{"579":1},"2":{"570":1,"579":8}}],["ispointerequal",{"2":{"81":4}}],["is",{"0":{"900":1},"2":{"529":4,"891":1,"899":4,"900":6}}],["isfloatstr",{"0":{"875":1},"2":{"853":1,"875":10}}],["isfloat",{"0":{"872":1},"2":{"853":1,"872":10}}],["isfileexist",{"2":{"458":4}}],["isfull",{"0":{"296":1,"319":1,"328":1},"2":{"282":1,"284":1,"285":1,"296":6,"319":6,"328":6,"329":2}}],["islinux",{"0":{"801":1},"2":{"798":1,"801":4}}],["islinkfile",{"2":{"459":4}}],["islink",{"0":{"459":1},"2":{"449":1,"459":4}}],["isleapyear",{"0":{"437":1},"2":{"401":1,"437":6}}],["isexported",{"0":{"748":1},"2":{"738":1,"748":6}}],["isexist",{"0":{"458":1},"2":{"449":1,"458":4}}],["isemail",{"0":{"869":1},"2":{"853":1,"869":6}}],["isembedded",{"0":{"747":1},"2":{"738":1,"747":6}}],["isemptystring",{"0":{"870":1},"2":{"853":1,"870":8}}],["isempty",{"0":{"151":1,"220":1,"235":1,"258":1,"295":1,"307":1,"318":1,"327":1,"349":1,"369":1,"378":1},"1":{"152":1},"2":{"136":1,"151":2,"152":2,"204":1,"205":1,"220":6,"235":6,"241":1,"258":6,"282":1,"283":1,"284":1,"285":1,"295":6,"297":2,"307":6,"308":2,"318":6,"320":2,"327":6,"333":1,"349":6,"359":1,"360":1,"369":6,"378":6}}],["isequal",{"2":{"695":4}}],["iseven",{"2":{"509":4,"512":4,"643":4,"652":4,"655":4,"656":4,"657":4,"658":4,"659":4,"664":4,"691":4,"716":4}}],["isgbk",{"0":{"886":1},"2":{"84":2,"853":1,"886":4}}],["item2",{"2":{"677":2}}],["item1",{"2":{"677":2}}],["items",{"2":{"335":2,"336":2,"338":2,"341":2,"694":2,"695":2,"701":2}}],["item",{"2":{"81":6,"274":4,"290":2,"325":2,"339":2,"340":2,"342":2,"347":6,"348":2,"520":2,"521":2,"585":4,"635":2,"637":2,"642":2,"643":2,"645":2,"650":2,"651":2,"652":2,"655":2,"656":2,"657":2,"658":2,"659":2,"662":2,"663":2,"664":2,"670":2,"671":2,"672":2,"673":2,"674":2,"678":10,"679":6,"682":2,"687":2,"691":2,"697":2,"699":2,"702":2,"713":2,"716":2,"717":2,"718":2,"724":6,"730":10,"731":10,"732":10}}],["iterate",{"0":{"184":1,"347":1},"2":{"176":1,"184":4,"333":1,"347":4}}],["iteratee回调函数应该返回两个值",{"2":{"673":1}}],["iteratee调用1个参数",{"2":{"665":1}}],["iteratee",{"2":{"74":2,"78":2,"184":2,"275":2,"348":2,"508":2,"522":2,"523":2,"526":2,"645":2,"662":2,"663":2,"665":2,"672":2,"673":2,"674":2,"677":2,"687":2,"697":2,"702":2}}],["iterator",{"0":{"274":1},"2":{"0":1,"241":1,"274":14,"536":2}}],["itoa",{"2":{"78":2,"522":2,"523":2,"526":2}}],["i++",{"2":{"38":2,"39":2,"67":2,"325":2,"326":2,"327":2,"328":2,"329":2,"501":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"711":2}}],["i",{"2":{"38":6,"39":8,"67":6,"166":4,"264":2,"273":4,"325":6,"326":6,"327":6,"328":6,"329":6,"501":6,"524":4,"530":6,"531":6,"532":6,"533":8,"534":6,"535":6,"536":6,"643":2,"645":2,"652":2,"655":2,"656":2,"657":2,"658":2,"659":2,"664":2,"673":2,"674":2,"691":2,"711":6,"779":4,"780":2,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["implements",{"2":{"7":2}}],["import",{"2":{"3":1,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"20":1,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"32":1,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"49":1,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"62":1,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":2,"85":2,"88":1,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"135":1,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"175":1,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"189":1,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"202":1,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"240":1,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"280":1,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"332":1,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"357":1,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"383":1,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"400":1,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"448":1,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"478":1,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"490":1,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"504":1,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"539":1,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"569":1,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"598":1,"601":2,"602":2,"603":2,"604":2,"605":2,"608":1,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"622":1,"625":1,"626":2,"627":2,"628":2,"629":2,"632":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"706":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"737":1,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"755":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"797":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"811":1,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"852":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"890":1,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"907":1,"908":2}}],["ifvalue",{"2":{"59":2}}],["if",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"68":2,"73":2,"80":2,"82":2,"130":2,"131":2,"132":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"348":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"451":2,"454":2,"456":2,"462":2,"465":2,"466":2,"467":2,"473":4,"474":6,"475":6,"528":2,"573":2,"577":2,"583":4,"584":4,"586":2,"587":2,"588":2,"589":2,"590":2,"591":4,"618":2,"625":2,"626":4,"627":4,"628":4,"629":4,"663":2,"673":2,"690":2,"806":2,"807":2}}],["install",{"2":{"906":4}}],["insert",{"0":{"389":1},"2":{"385":1,"389":10,"390":8,"391":8,"392":8,"393":8,"394":8,"395":8,"396":14,"397":8}}],["insertattail",{"0":{"212":1,"228":1},"2":{"204":1,"205":1,"209":6,"212":8,"213":8,"214":8,"215":6,"216":8,"217":6,"218":6,"219":6,"220":6,"221":6,"222":6,"225":6,"228":8,"229":8,"230":8,"231":6,"232":6,"233":6,"234":6,"235":6,"236":6,"237":6}}],["insertathead",{"0":{"211":1,"227":1},"2":{"204":1,"205":1,"211":8,"227":8}}],["insertat",{"0":{"210":1,"226":1,"255":1,"669":1},"2":{"204":1,"205":1,"210":12,"226":12,"241":1,"255":10,"633":1,"669":12}}],["insertionsort",{"0":{"7":1},"2":{"4":1,"7":4}}],["info",{"0":{"903":1},"2":{"891":1,"903":4}}],["increament",{"2":{"717":4}}],["increasenumber",{"2":{"625":4,"626":4,"627":4,"628":4,"629":4}}],["increase",{"2":{"499":4}}],["initial",{"2":{"677":2,"678":2,"679":2,"725":2}}],["input",{"2":{"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4}}],["inordertraverse",{"0":{"392":1},"2":{"385":1,"392":4}}],["index",{"2":{"142":2,"144":2,"155":2,"161":2,"163":2,"210":2,"213":2,"226":2,"229":2,"246":2,"254":2,"255":2,"256":2,"643":2,"645":2,"652":3,"655":2,"656":2,"657":2,"658":2,"659":2,"662":2,"663":2,"664":2,"669":2,"672":2,"673":2,"674":2,"677":2,"678":2,"679":2,"691":2,"700":3}}],["indexoffset",{"0":{"787":1},"2":{"756":1,"787":12}}],["indexoffunc",{"0":{"249":1},"2":{"241":1,"249":6}}],["indexof",{"0":{"147":1,"247":1,"670":1},"1":{"148":1},"2":{"136":1,"147":2,"148":2,"241":1,"247":6,"633":1,"670":6}}],["indelta",{"0":{"29":1},"2":{"21":1,"29":14}}],["indicatorvo",{"2":{"82":14}}],["indicator",{"2":{"82":8}}],["invalid",{"2":{"71":2,"72":2,"896":4,"897":4,"903":4}}],["in",{"2":{"46":2}}],["intslice",{"0":{"666":1},"2":{"666":4}}],["intslicedeprecated",{"2":{"633":1}}],["ints",{"2":{"516":2,"520":2}}],["intstream",{"2":{"40":8,"41":4,"42":4,"44":4,"45":4,"46":4}}],["intersect",{"0":{"515":1},"2":{"505":1,"515":8}}],["intersection",{"0":{"268":1,"351":1,"668":1},"2":{"241":1,"268":4,"269":2,"270":2,"333":1,"351":4,"633":1,"668":4}}],["interfaceslice",{"0":{"667":1},"2":{"667":4}}],["interfaceslicedeprecated",{"2":{"633":1}}],["interface",{"2":{"81":4,"83":2,"185":2,"186":2,"507":4,"666":2,"667":2,"692":2}}],["interface转字节切片",{"2":{"68":1}}],["internalip",{"2":{"574":4}}],["internal",{"2":{"19":1}}],["integers",{"2":{"560":2,"561":2}}],["integer",{"2":{"29":2,"52":2,"481":2,"542":2,"546":2,"548":2,"554":2,"555":2,"560":2,"561":2,"565":2,"566":2,"712":2,"873":1}}],["int64func",{"2":{"425":1,"426":1,"433":1,"438":1,"442":1,"443":1,"444":1,"445":1,"543":1}}],["int64",{"2":{"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"72":2,"82":2,"404":2,"405":2,"406":2,"407":2,"425":1,"426":1,"429":2,"430":4,"431":2,"432":2,"433":1,"438":1,"442":1,"443":1,"444":1,"445":1,"469":2,"470":2,"501":8,"543":3,"673":2,"674":2,"844":2,"845":2,"848":2,"849":2}}],["intfunc",{"2":{"14":1,"15":1,"16":1,"17":1,"140":1,"147":1,"149":1,"198":1,"219":1,"234":1,"247":1,"248":1,"249":1,"250":1,"262":1,"263":1,"277":1,"294":1,"306":1,"317":1,"329":1,"344":1,"368":1,"377":1,"395":1,"439":1,"544":1,"612":1,"619":1,"642":1,"643":1,"666":1,"670":1,"671":1,"733":1,"780":1,"787":1,"808":1}}],["int",{"2":{"6":8,"7":4,"8":8,"9":8,"10":8,"11":8,"12":8,"13":8,"14":11,"15":11,"16":5,"17":7,"23":12,"24":2,"37":2,"38":8,"39":4,"40":2,"41":2,"44":2,"45":6,"46":2,"52":2,"65":2,"66":2,"70":2,"73":2,"74":4,"76":2,"77":2,"78":4,"81":8,"82":2,"130":2,"139":2,"140":1,"141":2,"142":2,"143":2,"144":2,"145":2,"147":1,"148":2,"149":1,"150":2,"152":2,"154":2,"155":2,"156":2,"158":2,"160":4,"161":2,"162":2,"163":2,"164":2,"166":4,"168":2,"169":4,"170":2,"172":4,"193":8,"194":12,"195":10,"196":10,"197":12,"198":11,"199":10,"208":4,"209":4,"210":6,"211":4,"212":4,"213":6,"214":4,"215":4,"216":4,"217":4,"218":2,"219":3,"220":2,"221":2,"222":2,"224":4,"225":4,"226":6,"227":4,"228":4,"229":6,"230":4,"231":4,"232":4,"233":2,"234":3,"235":2,"236":2,"237":2,"243":2,"244":2,"245":4,"246":4,"247":3,"248":3,"249":7,"250":7,"251":4,"252":2,"253":2,"254":4,"255":4,"256":4,"257":6,"258":4,"259":2,"260":2,"261":4,"262":3,"263":3,"264":4,"265":2,"266":2,"267":4,"268":4,"269":4,"270":4,"271":12,"272":12,"273":6,"274":4,"275":8,"276":6,"277":7,"288":12,"289":2,"290":2,"291":2,"292":2,"293":2,"294":3,"295":2,"296":2,"297":2,"298":2,"300":4,"301":2,"302":2,"303":2,"304":2,"305":2,"306":3,"307":2,"308":2,"309":2,"311":10,"312":2,"313":2,"314":2,"315":2,"316":2,"317":3,"318":2,"319":2,"320":2,"321":2,"323":6,"324":2,"325":8,"326":8,"327":8,"328":8,"329":9,"335":2,"336":2,"337":2,"338":2,"339":2,"340":6,"341":2,"342":2,"344":1,"347":4,"348":4,"354":2,"363":4,"364":4,"365":4,"366":4,"367":4,"368":3,"369":2,"370":4,"372":4,"373":4,"374":4,"375":4,"376":4,"377":3,"378":2,"379":4,"380":2,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":7,"396":6,"397":6,"437":2,"439":1,"471":2,"482":2,"484":2,"485":2,"493":2,"494":2,"495":10,"500":12,"507":4,"508":6,"509":6,"510":2,"511":4,"512":4,"513":2,"514":4,"515":6,"516":2,"517":4,"518":4,"519":2,"520":6,"521":2,"522":4,"523":4,"524":4,"525":2,"526":4,"527":6,"528":2,"529":6,"530":6,"531":6,"532":4,"533":6,"534":6,"535":6,"536":6,"544":3,"550":2,"551":2,"552":2,"553":2,"554":2,"559":2,"562":2,"563":2,"583":4,"584":4,"585":4,"588":4,"590":4,"591":4,"604":2,"605":2,"606":1,"611":2,"612":3,"613":2,"614":2,"615":2,"616":2,"617":2,"619":3,"636":2,"637":2,"639":2,"640":4,"641":4,"642":3,"643":7,"644":4,"645":12,"646":6,"647":4,"648":2,"649":2,"650":6,"651":8,"652":7,"653":6,"654":6,"655":6,"656":6,"657":6,"658":6,"659":6,"662":10,"663":8,"664":6,"666":3,"668":4,"669":2,"670":1,"671":1,"672":10,"673":6,"674":8,"675":4,"677":10,"678":18,"679":8,"680":2,"682":2,"683":2,"684":6,"685":6,"686":6,"687":6,"688":2,"689":4,"691":6,"693":4,"697":6,"698":4,"699":6,"700":2,"701":2,"702":2,"703":2,"710":2,"711":2,"713":4,"714":4,"715":2,"716":4,"717":6,"718":4,"719":4,"720":4,"721":2,"722":4,"723":4,"724":4,"725":6,"726":2,"727":2,"728":4,"729":4,"730":6,"731":6,"732":6,"733":5,"747":2,"748":2,"749":2,"750":2,"751":4,"752":4,"769":2,"770":2,"771":2,"776":2,"780":1,"787":3,"791":2,"808":1,"816":2,"817":2,"820":2,"821":2,"824":2,"825":2,"828":4,"829":4,"832":4,"833":4,"836":4,"837":4,"840":4,"841":4,"842":2,"843":2,"844":4,"845":4,"846":2,"847":2,"848":4,"849":4,"871":1,"882":2,"884":2}}],["intcomparator",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"193":6,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6,"325":6,"326":6,"327":6,"328":6,"329":6,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"396":8,"397":6}}],["version",{"2":{"906":4}}],["verbose",{"2":{"582":2}}],["v9",{"2":{"843":4,"845":4,"847":4,"849":4}}],["v8",{"2":{"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v7",{"2":{"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v6",{"2":{"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v5",{"2":{"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v4",{"2":{"823":4,"825":4,"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v4字符串",{"2":{"618":1}}],["v3",{"2":{"819":4,"821":4,"823":4,"825":4,"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4}}],["v+1",{"2":{"662":2}}],["vtype",{"2":{"525":1}}],["var",{"2":{"80":2,"348":2,"495":2,"498":2,"501":2,"507":2,"508":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"572":2,"583":2,"584":2,"626":2,"662":2,"663":2}}],["valid检查它是否是utf",{"2":{"886":1}}],["valid",{"2":{"84":2,"85":2}}],["validator",{"0":{"850":1},"1":{"851":1,"852":1,"853":1,"854":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1},"2":{"0":1,"84":4,"850":1,"851":2,"852":2,"855":8,"856":8,"857":8,"858":8,"859":8,"860":8,"861":8,"862":12,"863":6,"864":6,"865":6,"866":6,"867":6,"868":8,"869":6,"870":8,"871":10,"872":10,"873":10,"874":10,"875":10,"876":10,"877":10,"878":6,"879":10,"880":6,"881":6,"882":6,"883":8,"884":6,"885":10,"886":4,"887":12}}],["val",{"2":{"83":4,"180":4,"181":4,"182":8,"195":4,"196":4,"314":4,"326":4,"340":8,"354":4,"365":4,"366":4,"374":4,"375":4,"495":2,"530":4,"531":4,"532":4,"534":6,"550":2,"697":4,"905":2}}],["value3",{"2":{"718":2}}],["value2",{"2":{"718":2}}],["value1",{"2":{"718":2}}],["valuefunc",{"2":{"493":1,"494":1}}],["value放入hashmap中",{"2":{"181":1}}],["valueof",{"0":{"155":1,"246":1},"1":{"156":1},"2":{"83":2,"136":1,"155":2,"156":2,"241":1,"246":4}}],["values或者map",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["valuesfunc",{"2":{"585":1}}],["valuesby",{"0":{"521":1},"2":{"505":1,"521":4}}],["valuestream",{"2":{"45":2}}],["values",{"0":{"186":1,"209":1,"225":1,"337":1,"519":1,"901":1},"2":{"40":2,"41":2,"176":1,"186":8,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"204":1,"205":1,"209":4,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"221":2,"225":4,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"236":2,"333":1,"335":2,"336":2,"337":4,"338":2,"339":2,"340":2,"341":2,"350":2,"351":2,"352":2,"353":4,"495":6,"505":1,"511":2,"514":2,"519":8,"521":6,"581":6,"585":2,"587":2,"640":1,"891":1,"893":2,"895":6,"898":2,"901":4,"903":2}}],["value",{"0":{"746":1},"2":{"17":2,"52":2,"71":2,"72":2,"73":2,"75":2,"76":2,"77":2,"78":4,"83":4,"181":2,"184":6,"194":2,"210":2,"211":2,"212":2,"216":2,"218":2,"222":6,"226":2,"227":2,"228":2,"233":2,"244":2,"247":2,"248":2,"251":2,"255":2,"256":2,"298":2,"302":2,"309":2,"313":2,"321":2,"364":2,"373":2,"380":6,"481":2,"493":1,"494":1,"508":6,"509":11,"512":7,"522":2,"523":2,"524":6,"525":8,"526":2,"529":2,"530":2,"532":2,"536":6,"603":2,"646":2,"652":1,"665":1,"669":2,"700":2,"718":2,"738":1,"740":2,"743":2,"746":4,"804":2,"885":2,"898":2}}],["val2",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4}}],["val1",{"2":{"6":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4}}],["vfunc",{"2":{"74":1,"275":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"517":1,"518":1,"519":1,"522":1}}],["v",{"2":{"17":16,"38":4,"39":4,"41":4,"42":4,"43":2,"44":4,"45":4,"46":4,"73":2,"74":5,"78":6,"83":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"246":4,"252":4,"253":4,"275":5,"354":2,"482":2,"483":2,"508":6,"509":7,"510":5,"511":7,"512":7,"513":5,"514":7,"515":5,"516":4,"517":5,"518":5,"519":5,"520":4,"521":10,"522":7,"523":10,"524":10,"525":9,"526":4,"527":4,"528":4,"529":4,"530":4,"531":4,"532":6,"533":2,"534":4,"535":2,"536":4,"601":2,"645":4,"657":2,"659":2,"662":2,"672":4,"673":2,"674":2,"678":2,"679":2,"689":2,"699":4,"741":2,"762":4,"763":4,"764":4,"765":4,"766":2,"767":4,"768":4,"773":4,"774":4,"784":2,"814":4,"815":4,"817":4,"818":6,"819":6,"821":6,"822":8,"823":8,"825":8,"826":10,"827":10,"829":10,"830":12,"831":12,"833":12,"834":14,"835":14,"837":14,"838":16,"839":16,"841":16,"842":18,"843":18,"845":18,"846":20,"847":20,"849":20,"871":2,"872":2,"873":2,"905":4}}],["v10",{"2":{"847":4,"849":4}}],["v1",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"193":4,"194":4,"195":4,"196":4,"197":4,"198":4,"199":4,"325":4,"326":4,"327":4,"328":4,"329":4,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":4,"526":6,"547":12,"549":12,"646":4,"677":4,"815":4,"817":4,"819":4,"821":4,"823":4,"825":4,"827":4,"829":4,"831":4,"833":4,"835":4,"837":4,"839":4,"841":4,"843":4,"845":4,"847":4,"849":4,"906":5}}],["v2func",{"2":{"526":1}}],["v2",{"2":{"3":2,"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"17":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"189":2,"193":6,"194":6,"195":6,"196":6,"197":6,"198":6,"199":6,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":6,"326":6,"327":6,"328":6,"329":6,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"383":2,"388":6,"389":6,"390":6,"391":6,"392":6,"393":6,"394":6,"395":6,"396":6,"397":6,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":7,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":14,"548":2,"549":14,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":4,"593":2,"594":2,"595":2,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"622":2,"626":2,"627":2,"628":2,"629":2,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":6,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":6,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"811":2,"814":2,"815":6,"816":2,"817":6,"818":2,"819":6,"820":2,"821":6,"822":2,"823":6,"824":2,"825":6,"826":2,"827":6,"828":2,"829":6,"830":2,"831":6,"832":2,"833":6,"834":2,"835":6,"836":2,"837":6,"838":2,"839":6,"840":2,"841":6,"842":2,"843":6,"844":2,"845":6,"846":2,"847":6,"848":2,"849":6,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":6,"907":2,"908":2}}],["groupfn",{"2":{"664":2}}],["groupwith",{"0":{"665":1},"2":{"633":1,"665":4}}],["groupby",{"0":{"664":1},"2":{"633":1,"664":4}}],["green",{"2":{"65":2,"66":2}}],["greaterorequal",{"0":{"28":1},"2":{"21":1,"28":16}}],["greaterthan",{"0":{"26":1},"2":{"21":1,"26":16}}],["gcd",{"0":{"560":1},"2":{"540":1,"560":12}}],["gbk",{"2":{"886":2}}],["gbk编码转utf8编码",{"2":{"85":1}}],["gbkdata",{"2":{"84":4,"85":4,"886":4}}],["gbktoutf8",{"0":{"85":1},"2":{"63":1,"85":4}}],["g",{"2":{"65":4,"66":4,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["generator",{"2":{"713":6}}],["generatersakey",{"0":{"130":1},"2":{"89":1,"130":4,"131":2,"132":2}}],["generate",{"0":{"40":1,"713":1},"2":{"34":1,"40":4,"707":1,"713":4}}],["genvals",{"2":{"38":4}}],["getosbits",{"0":{"808":1},"2":{"798":1,"808":4}}],["getosenv",{"0":{"803":1},"2":{"798":1,"803":4,"804":2,"805":4}}],["getorset",{"0":{"532":1},"2":{"505":1,"532":4}}],["getevennumstr",{"2":{"673":4}}],["getelapsedtime",{"2":{"501":4}}],["get请求",{"2":{"586":1}}],["getrequestpublicip",{"0":{"578":1},"2":{"570":1,"578":4}}],["getpublicipinfo",{"0":{"577":1},"2":{"570":1,"577":4}}],["getmacaddrs",{"0":{"576":1},"2":{"570":1,"576":4}}],["getmiddlenode",{"0":{"218":1,"233":1},"2":{"204":1,"205":1,"218":4,"233":4}}],["getips",{"0":{"575":1},"2":{"570":1,"575":4}}],["getinternalip",{"0":{"574":1},"2":{"570":1,"574":4}}],["getanddelete",{"0":{"534":1},"2":{"505":1,"534":4}}],["getnighttimestamp",{"0":{"426":1},"2":{"401":1,"426":4}}],["getnowtime",{"0":{"421":1},"2":{"401":1,"421":4}}],["getnowdatetime",{"0":{"422":1},"2":{"401":1,"422":4}}],["getnowdate",{"0":{"420":1},"2":{"401":1,"420":4}}],["getzerohourtimestamp",{"0":{"425":1},"2":{"401":1,"425":4}}],["gettodayendtime",{"0":{"424":1},"2":{"401":1,"424":4}}],["gettodaystarttime",{"0":{"423":1},"2":{"401":1,"423":4}}],["getlist",{"2":{"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2}}],["get",{"0":{"142":1,"180":1,"531":1},"1":{"143":1},"2":{"17":8,"136":1,"142":2,"143":2,"176":1,"180":4,"181":2,"182":4,"505":1,"530":2,"531":4,"534":2,"578":2,"583":2,"584":2,"585":8,"906":4}}],["gt",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"59":4,"81":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"222":8,"275":2,"325":2,"326":2,"327":2,"328":2,"329":2,"348":2,"380":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"469":2,"470":2,"471":2,"472":2,"483":2,"507":2,"547":6,"625":2,"663":2,"728":2,"730":4,"731":4,"732":4,"803":2,"804":2,"805":4,"882":1}}],["gogo",{"2":{"906":2}}],["golang",{"2":{"886":2}}],["go1",{"0":{"666":1,"667":1,"692":1},"2":{"906":5}}],["gounwarpordefault",{"2":{"605":1}}],["gounwarpor",{"2":{"604":1}}],["gotype",{"2":{"37":1,"138":1,"193":1,"208":1,"224":1,"243":1,"335":1,"363":1,"372":1,"429":1,"430":1,"431":1,"432":1,"495":1,"501":1,"524":1,"525":1,"581":1,"582":1,"626":1,"807":1,"814":1,"818":1,"822":1,"826":1,"830":1,"834":1,"838":1,"842":1,"846":1,"893":1}}],["goroutine",{"2":{"30":1}}],["gopackage",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"139":1,"141":1,"143":1,"145":1,"148":1,"150":1,"152":1,"154":1,"156":1,"158":1,"160":1,"162":1,"164":1,"166":1,"168":1,"170":1,"172":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"604":1,"605":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"626":1,"627":1,"628":1,"629":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"814":1,"815":1,"816":1,"817":1,"818":1,"819":1,"820":1,"821":1,"822":1,"823":1,"824":1,"825":1,"826":1,"827":1,"828":1,"829":1,"830":1,"831":1,"832":1,"833":1,"834":1,"835":1,"836":1,"837":1,"838":1,"839":1,"840":1,"841":1,"842":1,"843":1,"844":1,"845":1,"846":1,"847":1,"848":1,"849":1,"893":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1,"908":1}}],["gofunc",{"2":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"140":1,"142":1,"144":1,"147":1,"149":1,"151":1,"153":1,"155":1,"157":1,"159":1,"161":1,"163":1,"165":1,"167":1,"169":1,"171":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1,"493":1,"494":1,"496":1,"497":1,"498":1,"499":1,"500":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"526":1,"527":1,"528":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"542":1,"543":1,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"583":1,"584":1,"585":1,"591":1,"592":1,"593":1,"594":1,"595":1,"601":1,"602":1,"603":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1,"625":1,"627":1,"628":1,"629":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"740":1,"741":2,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"808":1,"815":1,"816":1,"817":1,"819":1,"820":1,"821":1,"823":1,"824":1,"825":1,"827":1,"828":1,"829":1,"831":1,"832":1,"833":1,"835":1,"836":1,"837":1,"839":1,"840":1,"841":1,"843":1,"844":1,"845":1,"847":1,"848":1,"849":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"894":1,"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"901":1,"902":1,"903":1,"904":1,"905":1}}],["goimport",{"2":{"3":1,"20":1,"32":1,"49":1,"62":1,"88":1,"135":1,"175":1,"189":1,"202":1,"240":1,"280":1,"332":1,"357":1,"383":1,"400":1,"448":1,"478":1,"490":1,"504":1,"539":1,"569":1,"598":1,"608":1,"622":1,"625":1,"632":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1,"706":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1,"737":1,"755":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1,"797":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1,"811":1,"852":1,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1,"890":1,"907":1}}],["go",{"2":{"2":3,"7":2,"19":2,"31":1,"38":2,"43":2,"48":1,"61":1,"87":2,"123":2,"133":1,"134":1,"174":1,"188":1,"201":2,"239":1,"279":4,"331":1,"356":2,"382":1,"399":1,"447":1,"457":2,"477":2,"489":2,"503":1,"528":1,"529":1,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"538":1,"568":2,"586":1,"587":1,"588":1,"589":1,"590":1,"597":1,"607":1,"621":1,"631":1,"705":1,"711":2,"736":2,"754":1,"796":1,"810":1,"851":1,"889":1,"902":2,"911":1}}],["git",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":1,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":1,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["github",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":1,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":1,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":4,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["dns",{"2":{"868":2}}],["dn8sycadrxse9lvw2mog3ahlsvfja9t+ogqa0wm2fywpvwkigs",{"2":{"118":2}}],["dropwhile",{"0":{"650":1},"2":{"633":1,"650":8}}],["droprightwhile",{"0":{"651":1},"2":{"633":1,"651":8}}],["dropright",{"0":{"649":1},"2":{"633":1,"649":10}}],["drop",{"0":{"648":1},"2":{"633":1,"648":10}}],["d1",{"2":{"576":2}}],["d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870",{"2":{"471":2}}],["dda3cf10c5a6ff6c6659a497bf7261b287af2bc7",{"2":{"471":2}}],["dd",{"2":{"403":12,"420":1,"422":1,"423":1,"424":1,"427":6,"428":6,"431":1,"434":1,"441":4}}],["dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc",{"2":{"117":2}}],["day",{"2":{"404":2}}],["dayofyear",{"0":{"439":1},"2":{"401":1,"439":8}}],["date3",{"2":{"439":4,"440":4}}],["date2",{"2":{"439":4,"440":4}}],["date1",{"2":{"439":4,"440":4}}],["date",{"2":{"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"439":6,"440":6}}],["datetime",{"0":{"398":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"406":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"419":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1},"2":{"0":1,"398":1,"399":2,"400":2,"404":6,"405":6,"406":6,"407":6,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":4,"421":4,"422":4,"423":4,"424":4,"425":4,"426":4,"427":8,"428":8,"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4,"437":6,"438":10,"439":8,"440":8,"441":6,"442":4,"443":4,"444":4,"445":4}}],["data2",{"2":{"715":4}}],["data1",{"2":{"715":4}}],["data",{"0":{"197":1,"245":1,"289":1,"301":1,"312":1,"324":1,"367":1,"376":1},"2":{"68":2,"79":2,"80":2,"91":6,"92":4,"93":6,"94":4,"95":6,"96":6,"97":4,"98":6,"99":4,"102":6,"103":4,"104":6,"105":4,"106":6,"107":6,"108":4,"109":6,"110":4,"121":2,"122":2,"131":6,"132":6,"138":2,"190":1,"194":2,"197":4,"241":1,"243":4,"245":8,"251":2,"252":2,"253":2,"254":8,"255":8,"256":6,"259":2,"260":2,"261":2,"263":4,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":6,"272":6,"273":2,"274":2,"277":2,"282":1,"283":1,"284":1,"285":1,"288":2,"289":4,"290":2,"291":2,"292":2,"293":2,"300":2,"301":4,"302":2,"303":2,"304":2,"305":2,"311":2,"312":4,"313":2,"314":2,"315":2,"316":2,"323":2,"324":4,"325":2,"326":2,"359":1,"360":1,"364":2,"365":2,"366":2,"367":4,"370":2,"373":2,"374":2,"375":2,"376":4,"379":2,"389":2,"390":2,"473":4,"581":2,"709":4,"710":4,"711":4,"712":4,"713":4,"714":4,"718":8,"734":4,"886":2}}],["datastructure",{"2":{"0":1,"134":1,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":4,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":4,"219":2,"220":2,"221":2,"222":2,"224":4,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":4,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":6,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":4,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":4,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["dir",{"2":{"807":3}}],["distinct",{"0":{"715":1},"2":{"707":1,"715":8}}],["diskvo",{"2":{"82":4}}],["disk",{"2":{"82":24}}],["dividetwo",{"2":{"699":4}}],["diff2",{"2":{"404":4,"405":4,"406":4,"407":4}}],["diff1",{"2":{"404":4,"405":4,"406":4,"407":4}}],["differencewith",{"0":{"646":1},"2":{"633":1,"646":4}}],["differenceby",{"0":{"645":1},"2":{"633":1,"645":4}}],["difference",{"0":{"269":1,"644":1},"2":{"241":1,"269":2,"633":1,"644":4}}],["downloadfile",{"0":{"592":1},"2":{"570":1,"592":4}}],["double",{"2":{"500":4}}],["doublylink是双向链表",{"2":{"223":1}}],["doublylink双向链表",{"0":{"205":1}}],["doublylink",{"0":{"223":1},"2":{"201":1,"224":4,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2}}],["do",{"2":{"210":2,"226":2,"740":2}}],["done",{"2":{"43":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["dstpath",{"2":{"454":2}}],["dst",{"2":{"82":2,"507":2}}],["durationtype",{"2":{"501":1}}],["duration",{"2":{"43":2,"497":4,"498":2,"499":2,"501":1,"582":4,"625":4,"626":4,"628":6,"629":4}}],["duke",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":1,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":1,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":4,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":2,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":2,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["de",{"2":{"776":4}}],["demo",{"2":{"625":2}}],["def",{"2":{"604":4}}],["default",{"2":{"521":2}}],["defer",{"2":{"38":4,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":4,"46":2,"464":2,"473":2,"474":2,"475":2,"905":2}}],["debouncedadd",{"2":{"497":12}}],["debounced",{"0":{"497":1},"2":{"491":1,"497":4}}],["depth",{"0":{"395":1},"2":{"385":1,"395":4}}],["dequeue",{"0":{"291":1,"303":1,"314":1,"326":1},"2":{"282":1,"283":1,"284":1,"285":1,"291":4,"303":4,"314":4,"326":4}}],["deepequal",{"2":{"257":1,"695":2,"782":2,"905":2}}],["deepclone",{"0":{"81":1},"2":{"63":1,"81":4}}],["decoderesponse",{"0":{"584":1},"2":{"570":1,"583":2,"584":4}}],["decodebyte",{"0":{"80":1},"2":{"63":1,"80":4}}],["decimalbytes",{"0":{"484":1},"2":{"479":1,"484":10}}],["decrypted",{"2":{"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"131":4,"132":4}}],["destpath",{"2":{"465":2,"466":2,"467":2}}],["desofbdecrypt",{"0":{"110":1},"2":{"89":1,"109":2,"110":4}}],["desofbencrypt",{"0":{"109":1},"2":{"89":1,"109":4,"110":2}}],["desc",{"2":{"688":4,"690":3}}],["descfbdecrypt",{"0":{"108":1},"2":{"89":1,"107":2,"108":4}}],["descfbencrypt",{"0":{"107":1},"2":{"89":1,"107":4,"108":2}}],["desctrcrypt",{"0":{"106":1},"2":{"89":1,"106":6}}],["descbcdecrypt",{"0":{"105":1},"2":{"89":1,"104":2,"105":4}}],["descbcencrypt",{"0":{"104":1},"2":{"89":1,"104":4,"105":2}}],["desecbdecrypt",{"0":{"103":1},"2":{"89":1,"102":2,"103":4}}],["desecbencrypt",{"0":{"102":1},"2":{"89":1,"102":4,"103":2}}],["des",{"2":{"86":1}}],["delimiter",{"2":{"790":2}}],["delay",{"0":{"498":1},"2":{"491":1,"498":6}}],["del2",{"2":{"272":4}}],["del1",{"2":{"272":4}}],["del",{"2":{"272":4}}],["delta",{"2":{"29":2}}],["delete请求",{"2":{"589":1}}],["deleteall",{"0":{"272":1},"2":{"241":1,"272":8}}],["deleteattail",{"0":{"215":1,"231":1},"2":{"204":1,"205":1,"215":4,"231":4}}],["deleteathead",{"0":{"214":1,"230":1},"2":{"204":1,"205":1,"214":4,"230":4}}],["deleteat",{"0":{"163":1,"213":1,"229":1,"254":1,"647":1},"1":{"164":1},"2":{"136":1,"163":2,"164":2,"204":1,"205":1,"213":4,"229":4,"241":1,"254":10,"633":1,"647":8}}],["deletevalue",{"0":{"216":1},"2":{"204":1,"216":4}}],["deleterange",{"0":{"169":1},"1":{"170":1},"2":{"136":1,"169":2,"170":2}}],["deleteby",{"0":{"167":1},"1":{"168":1},"2":{"136":1,"167":2,"168":2}}],["deleteif",{"0":{"165":1,"277":1},"1":{"166":1},"2":{"136":1,"165":2,"166":2,"241":1,"277":4}}],["delete",{"0":{"182":1,"341":1,"390":1,"533":1},"2":{"17":4,"176":1,"182":4,"333":1,"341":4,"385":1,"390":4,"505":1,"533":4}}],["d",{"2":{"7":4,"499":2,"508":2,"509":4,"510":2,"511":4,"512":2,"513":4,"514":2,"515":2,"516":2,"517":2,"518":2,"519":4,"527":2,"530":4,"531":4,"532":2,"533":4,"534":6,"535":4,"536":2,"603":4,"604":4,"605":4,"628":2,"637":2,"638":2,"639":12,"641":4,"660":4,"661":4,"670":2,"671":2,"676":4,"688":6,"779":4,"780":2,"787":4,"790":6,"822":12,"823":4,"824":8,"825":6,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["源码",{"0":{"2":1,"19":1,"31":1,"48":1,"61":1,"87":1,"134":1,"174":1,"188":1,"201":1,"239":1,"279":1,"331":1,"356":1,"382":1,"399":1,"447":1,"477":1,"489":1,"503":1,"538":1,"568":1,"597":1,"607":1,"621":1,"631":1,"705":1,"736":1,"754":1,"796":1,"810":1,"851":1,"889":1}}],["ls",{"2":{"807":2}}],["lcm",{"0":{"561":1},"2":{"540":1,"561":8}}],["lucy",{"2":{"472":2}}],["lk",{"2":{"208":4,"209":10,"210":14,"211":10,"212":10,"213":14,"214":14,"215":12,"216":14,"217":12,"218":10,"219":10,"220":12,"221":12,"222":10,"224":4,"225":10,"226":14,"227":10,"228":10,"229":14,"230":14,"231":12,"232":12,"233":10,"234":10,"235":12,"236":12,"237":10}}],["latest",{"2":{"906":4}}],["lat",{"2":{"577":4}}],["lastindexoffunc",{"0":{"250":1},"2":{"241":1,"250":6}}],["lastindexof",{"0":{"149":1,"248":1,"671":1},"1":{"150":1},"2":{"136":1,"149":2,"150":2,"241":1,"248":6,"633":1,"671":6}}],["lancet受到了java",{"2":{"910":1}}],["lancet是什么",{"0":{"910":1},"1":{"911":1}}],["lancetconstraints",{"2":{"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"193":4,"323":4,"388":4}}],["lancet功能模块",{"2":{"0":1}}],["lancet",{"2":{"0":1,"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":1,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":1,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":6,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":2,"582":2,"583":2,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"592":4,"593":2,"594":2,"595":2,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"625":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":3,"908":2,"910":1,"911":2}}],["limit",{"0":{"720":1},"2":{"707":1,"720":10}}],["lili",{"2":{"473":4}}],["li3",{"2":{"257":4,"261":4,"267":4,"268":4}}],["li2",{"2":{"257":4,"258":4,"261":4,"267":4,"268":4}}],["li1",{"2":{"257":6,"258":4,"261":4,"267":4,"268":4}}],["li",{"2":{"243":4,"244":6,"245":4,"246":4,"247":6,"248":6,"249":6,"250":6,"251":6,"252":6,"253":6,"254":18,"255":18,"256":14,"259":6,"260":4,"262":4,"263":4,"264":6,"265":6,"266":6}}],["line",{"2":{"902":2}}],["linearsearch",{"0":{"16":1},"2":{"4":1,"16":6}}],["linux",{"2":{"807":3}}],["linkedstack",{"0":{"360":1,"371":1},"2":{"356":1,"372":4,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2}}],["linkedqueue",{"0":{"283":1,"299":1},"2":{"278":1,"279":1,"300":4,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2}}],["linknode",{"2":{"208":6,"218":2,"224":8,"233":2}}],["link",{"2":{"201":2,"202":4,"208":6,"209":8,"210":8,"211":8,"212":8,"213":8,"214":8,"215":8,"216":8,"217":8,"218":8,"219":8,"220":8,"221":8,"222":8,"224":6,"225":8,"226":8,"227":8,"228":8,"229":8,"230":8,"231":8,"232":8,"233":8,"234":8,"235":8,"236":8,"237":8}}],["linklist是链表数据结构",{"2":{"200":1}}],["linklist",{"0":{"200":1},"1":{"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1}}],["listfilenames",{"0":{"461":1},"2":{"449":1,"461":4}}],["list3",{"2":{"269":4,"270":4}}],["list2",{"2":{"269":4,"270":4,"271":6,"272":6}}],["list1",{"2":{"269":4,"270":4,"271":6,"272":6}}],["listtomap",{"0":{"275":1},"2":{"241":1,"275":4}}],["list是线性表数据结构",{"2":{"238":1}}],["list",{"0":{"238":1},"1":{"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1},"2":{"133":1,"134":1,"135":2,"139":4,"141":4,"143":4,"145":4,"148":4,"150":4,"152":4,"154":4,"156":4,"158":4,"160":4,"162":4,"164":4,"166":6,"168":6,"170":6,"172":4,"239":2,"243":10,"244":8,"245":8,"246":8,"247":8,"248":8,"249":8,"250":8,"251":8,"252":8,"253":8,"254":8,"255":8,"256":8,"257":14,"258":10,"259":8,"260":10,"261":14,"262":8,"263":8,"264":8,"265":8,"266":8,"267":14,"268":14,"269":10,"270":10,"271":16,"272":16,"273":10,"274":10,"275":12,"276":10,"277":8}}],["lpjnul+wow4m6dsqxbninhswhlwfp0jecwqzypolmcq=",{"2":{"127":2}}],["lower+upper",{"2":{"882":1}}],["lowerfirst",{"0":{"767":1},"2":{"756":1,"767":4}}],["lowindex",{"2":{"14":2,"15":2}}],["lon",{"2":{"577":4}}],["longrunningtask",{"2":{"501":4}}],["logo",{"2":{"592":2}}],["log",{"0":{"564":1},"2":{"540":1,"564":8,"586":4,"587":4,"588":4,"589":4,"590":4,"591":6,"626":2,"627":2,"628":2,"629":2}}],["local",{"2":{"439":6,"440":6}}],["locker",{"2":{"138":2}}],["lock",{"2":{"138":2}}],["loadavg",{"2":{"82":8}}],["level",{"2":{"895":4,"896":2,"897":2,"898":4,"901":4,"903":4}}],["levelordertraverse",{"0":{"394":1},"2":{"385":1,"394":4}}],["letter",{"2":{"884":2}}],["leftnode",{"2":{"387":1}}],["left",{"2":{"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2}}],["less函数",{"2":{"729":1}}],["less",{"2":{"689":2,"723":2,"728":3,"729":2}}],["lessorequal",{"0":{"27":1},"2":{"21":1,"27":14}}],["lessthan",{"0":{"25":1},"2":{"21":1,"25":14}}],["length",{"2":{"611":2,"613":2,"614":2,"615":2,"616":2,"617":2,"776":2,"882":2,"884":2}}],["len",{"2":{"14":4,"15":4,"17":4,"67":2,"82":2,"547":12,"549":12,"687":6,"700":1,"702":2,"742":2,"787":4}}],["l",{"2":{"17":8,"139":2,"140":2,"141":4,"143":2,"145":4,"148":4,"150":2,"152":2,"154":4,"156":4,"158":2,"160":6,"162":2,"164":2,"166":4,"168":2,"170":4,"172":4,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"276":6,"277":8}}],["lt=",{"2":{"700":1}}],["lt",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"38":18,"39":8,"40":8,"41":2,"42":2,"43":8,"44":4,"45":14,"46":8,"67":2,"70":8,"81":2,"178":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"222":8,"325":4,"326":4,"327":4,"328":4,"329":4,"380":2,"387":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"469":2,"470":2,"471":2,"472":2,"483":2,"501":2,"507":2,"524":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"549":6,"689":4,"700":1,"711":6,"713":2,"723":2,"729":3,"803":2,"804":2,"805":4,"882":1}}],["lru算法实现缓存",{"2":{"17":1}}],["lru",{"2":{"2":1}}],["lrucache",{"0":{"17":1},"2":{"1":1,"4":1,"17":10}}],["算法包实现一些基本算法",{"2":{"1":1}}],["snakecase",{"0":{"773":1},"2":{"756":1,"773":4}}],["s4",{"2":{"719":4,"720":4,"722":4}}],["s3",{"2":{"653":4,"719":4,"720":4,"722":4}}],["s2",{"2":{"644":4,"645":4,"646":4,"653":4,"654":4,"714":4,"719":4,"720":4,"722":4,"733":4}}],["s1",{"2":{"644":4,"645":4,"646":4,"653":6,"654":4,"714":4,"719":4,"720":4,"722":4,"733":4,"741":4}}],["source",{"2":{"710":2,"711":2,"769":2,"770":2,"771":2}}],["source=172ae18b",{"2":{"592":2}}],["something",{"2":{"740":2}}],["some",{"0":{"691":1},"2":{"633":1,"691":4}}],["sorttype",{"2":{"690":3}}],["sortorder",{"2":{"688":2}}],["sortbyfield",{"0":{"690":1},"2":{"690":4}}],["sortbyfielddeprecated",{"2":{"633":1}}],["sortby",{"0":{"689":1,"690":1},"2":{"633":1,"689":6}}],["sorted",{"0":{"723":1},"2":{"707":1,"723":8}}],["sortedslice",{"2":{"14":2,"15":2}}],["sortednums",{"2":{"13":4}}],["sort",{"0":{"688":1,"690":1},"2":{"1":1,"2":1,"7":2,"516":2,"519":2,"520":4,"521":4,"524":4,"633":1,"688":10,"689":2}}],["special",{"2":{"882":1}}],["specific",{"2":{"529":2}}],["splitandtrim",{"0":{"790":1},"2":{"756":1,"790":6}}],["splitwords",{"0":{"779":1},"2":{"756":1,"779":14}}],["splitex",{"0":{"775":1},"2":{"756":1,"775":12}}],["sprint",{"2":{"718":2}}],["sprintf",{"2":{"530":4,"531":4,"532":2,"533":4,"534":6,"535":4,"536":2,"678":2,"679":2}}],["switch",{"2":{"521":2}}],["swap",{"0":{"264":1},"2":{"241":1,"264":4}}],["square",{"2":{"500":4}}],["schedule",{"0":{"499":1},"2":{"491":1,"499":4}}],["sslenabled",{"2":{"582":4}}],["ss格式时间字符串的unix时间戳",{"2":{"431":1}}],["ss",{"2":{"403":6,"421":1,"422":1,"427":4,"428":4,"434":1,"441":4}}],["skip",{"0":{"719":1},"2":{"707":1,"719":10}}],["sk",{"2":{"363":4,"364":10,"365":12,"366":12,"367":10,"368":10,"369":12,"370":12,"372":4,"373":10,"374":12,"375":12,"376":10,"377":10,"378":12,"379":12,"380":10}}],["suffixes",{"2":{"786":2}}],["suis",{"2":{"779":4,"780":2}}],["supertree",{"2":{"396":6}}],["substrs",{"2":{"792":2,"793":2}}],["substr",{"2":{"787":4}}],["substring",{"0":{"776":1},"2":{"756":1,"776":14}}],["subslice",{"2":{"638":2}}],["sub",{"2":{"404":4,"405":4,"406":4,"407":4}}],["subtree",{"2":{"396":8}}],["sublist",{"0":{"276":1},"2":{"241":1,"276":4}}],["sum",{"0":{"565":1},"2":{"348":6,"508":6,"509":2,"540":1,"565":6,"663":6,"677":4}}],["shell",{"2":{"795":1}}],["shellsort",{"0":{"9":1},"2":{"4":1,"9":4}}],["shuffle",{"0":{"683":1},"2":{"633":1,"683":4}}],["shardcount",{"2":{"529":2}}],["shard",{"2":{"529":2}}],["shatype",{"2":{"471":2}}],["sha",{"0":{"471":1},"2":{"449":1,"471":8}}],["sha512withbase64",{"0":{"129":1},"2":{"89":1,"129":4}}],["sha512",{"0":{"128":1},"2":{"89":1,"128":4,"471":4}}],["sha256withbase64",{"0":{"127":1},"2":{"89":1,"127":4}}],["sha256",{"0":{"126":1},"2":{"89":1,"126":4,"471":4}}],["sha1withbase64",{"0":{"125":1},"2":{"89":1,"125":4}}],["sha1",{"0":{"124":1},"2":{"89":1,"124":4,"471":4}}],["srcpath",{"2":{"454":2}}],["src",{"2":{"81":2,"82":2,"507":2}}],["symbol",{"2":{"481":2}}],["symmetricdifference",{"0":{"270":1,"352":1,"693":1},"2":{"241":1,"270":2,"333":1,"352":4,"633":1,"693":4}}],["sync",{"2":{"138":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2}}],["syntax",{"2":{"71":2,"72":2}}],["system",{"0":{"795":1},"1":{"796":1,"797":1,"798":1,"799":1,"800":1,"801":1,"802":1,"803":1,"804":1,"805":1,"806":1,"807":1,"808":1},"2":{"0":1,"795":1,"796":1,"797":2,"800":4,"801":4,"802":4,"803":6,"804":6,"805":6,"806":6,"807":8,"808":4}}],["s",{"2":{"67":2,"69":2,"100":2,"101":2,"120":2,"123":4,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":6,"349":2,"350":2,"351":2,"352":2,"353":2,"354":12,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"498":4,"674":4,"687":12,"703":2,"709":4,"710":4,"711":4,"712":4,"713":4,"714":4,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":6,"740":2,"741":2,"742":6,"743":6,"744":6,"745":4,"746":4,"747":6,"748":6,"749":6,"750":6,"751":6,"752":4,"758":2,"759":2,"760":2,"761":2,"762":6,"763":6,"764":6,"765":6,"767":6,"768":6,"772":8,"773":6,"774":6,"775":2,"776":2,"779":2,"780":2,"855":2,"859":2,"870":2,"874":2,"875":2,"876":2,"878":2,"908":4}}],["simplifiedchinese",{"2":{"886":4}}],["siqbew",{"2":{"615":2}}],["sin",{"0":{"563":1},"2":{"540":1,"563":12}}],["singlelink是单向链表",{"2":{"207":1}}],["singlylink单链表",{"0":{"204":1}}],["singlylink",{"0":{"207":1},"2":{"201":1,"208":4,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2}}],["since",{"2":{"43":2}}],["size",{"0":{"140":1,"198":1,"219":1,"234":1,"262":1,"294":1,"306":1,"317":1,"329":1,"344":1,"368":1,"377":1},"1":{"141":1},"2":{"136":1,"140":2,"141":2,"179":2,"190":1,"196":2,"198":4,"204":1,"205":1,"219":4,"234":4,"241":1,"262":4,"282":1,"283":1,"284":1,"285":1,"294":4,"306":4,"317":4,"329":4,"333":1,"344":4,"345":4,"359":1,"360":1,"368":4,"377":4,"469":4,"484":2,"485":2,"486":2,"487":2,"639":2,"769":2,"770":2,"771":2}}],["sig",{"2":{"43":8}}],["std",{"2":{"807":12}}],["stderr",{"2":{"807":16}}],["stdout",{"2":{"807":14}}],["step",{"2":{"555":2,"712":2}}],["statuscode",{"2":{"583":2,"584":2}}],["status",{"2":{"577":4,"585":6}}],["stacks",{"2":{"902":10}}],["stacktracefunc",{"2":{"902":1}}],["stacktrace",{"0":{"902":1},"2":{"891":1,"902":3}}],["stacknode",{"2":{"372":6}}],["stack",{"0":{"355":1},"1":{"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"370":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1},"2":{"356":2,"357":4,"363":6,"364":6,"365":6,"366":6,"367":6,"368":6,"369":6,"370":6,"372":6,"373":6,"374":6,"375":6,"376":6,"377":6,"378":6,"379":6,"380":6,"893":4}}],["starttime",{"2":{"423":4,"501":2}}],["start",{"2":{"43":4,"169":2,"501":4,"554":2,"555":2,"647":2,"712":2,"722":2,"791":3}}],["st",{"2":{"335":4,"336":4,"337":4,"338":6,"339":10,"340":10,"341":6,"342":8}}],["stoptime",{"2":{"501":2}}],["stop",{"2":{"82":2,"499":4,"501":4}}],["str2",{"2":{"695":6}}],["str1",{"2":{"695":6}}],["street",{"2":{"507":6}}],["stream",{"0":{"704":1},"1":{"705":1,"706":1,"707":1,"708":1,"709":1,"710":1,"711":1,"712":1,"713":1,"714":1,"715":1,"716":1,"717":1,"718":1,"719":1,"720":1,"721":1,"722":1,"723":1,"724":1,"725":1,"726":1,"727":1,"728":1,"729":1,"730":1,"731":1,"732":1,"733":1,"734":1},"2":{"0":1,"38":8,"704":2,"705":2,"706":2,"709":6,"710":6,"711":6,"712":6,"713":6,"714":10,"715":8,"716":8,"717":8,"718":8,"719":8,"720":8,"721":8,"722":8,"723":8,"724":6,"725":6,"726":6,"727":6,"728":6,"729":6,"730":6,"731":6,"732":6,"733":8,"734":6}}],["strs",{"2":{"496":8,"667":4,"670":6,"671":6,"676":6,"680":12,"692":4}}],["str",{"2":{"81":4,"101":4,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":6,"119":6,"124":6,"125":2,"126":6,"127":2,"128":6,"129":2,"428":2,"702":4,"777":2,"778":2,"781":2,"782":2,"784":2,"785":2,"786":2,"787":18,"788":6,"789":8,"790":8,"791":10,"792":8,"793":10,"794":8,"856":2,"857":2,"858":2,"860":2,"861":2,"862":2,"877":2,"883":2,"886":4,"887":2}}],["strconv",{"2":{"71":2,"72":2,"78":2,"522":4,"523":4,"526":4,"673":2,"674":2,"905":8}}],["stringtobytes",{"0":{"782":1},"2":{"756":1,"782":4}}],["string或bool",{"2":{"690":1}}],["string的值",{"2":{"573":1}}],["stringslice",{"0":{"692":1},"2":{"692":4}}],["stringslicedeprecated",{"2":{"633":1}}],["strings",{"2":{"496":4,"519":2,"521":2,"688":10,"762":4,"763":4,"764":4,"765":4,"767":4,"768":4,"773":4,"774":4,"902":2}}],["stringfunc",{"2":{"66":1,"69":1,"76":1,"100":1,"101":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"420":1,"421":1,"422":1,"423":1,"424":1,"427":1,"434":1,"435":1,"436":1,"441":1,"455":1,"457":1,"481":1,"484":1,"485":1,"552":1,"572":1,"574":1,"575":1,"578":1,"613":1,"614":1,"615":1,"616":1,"617":1,"692":1,"703":1,"750":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"781":1,"783":1,"788":1,"789":1,"790":1,"791":1,"794":1,"803":1,"904":1}}],["string",{"2":{"7":2,"23":4,"42":4,"52":2,"65":2,"66":1,"67":4,"69":3,"73":4,"74":4,"76":1,"77":4,"78":8,"80":2,"81":6,"82":28,"83":2,"85":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":3,"101":3,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"119":3,"120":3,"121":1,"122":1,"123":4,"124":3,"125":3,"126":3,"127":3,"128":3,"129":3,"130":2,"131":4,"132":4,"420":1,"421":1,"422":1,"423":1,"424":1,"427":5,"428":4,"431":2,"432":2,"434":1,"435":3,"436":1,"441":5,"442":2,"443":2,"444":2,"445":2,"451":2,"452":2,"453":2,"454":4,"455":1,"456":2,"457":1,"458":2,"459":2,"460":2,"461":4,"462":2,"463":4,"464":6,"465":4,"466":4,"467":4,"468":2,"469":2,"470":2,"471":4,"472":4,"473":6,"474":2,"475":4,"481":5,"482":6,"483":2,"484":1,"485":1,"486":2,"487":2,"496":8,"498":2,"507":10,"508":4,"509":6,"510":4,"511":2,"512":4,"513":4,"514":2,"515":6,"516":2,"517":4,"518":4,"519":2,"520":2,"521":6,"522":6,"523":6,"524":2,"525":2,"526":8,"527":6,"528":2,"529":4,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":4,"547":12,"549":12,"552":1,"572":5,"573":4,"574":1,"575":1,"576":2,"577":20,"578":1,"581":4,"583":2,"584":2,"585":4,"586":14,"587":14,"588":16,"589":10,"590":16,"591":6,"592":4,"593":4,"594":2,"595":4,"604":2,"605":2,"606":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":2,"635":4,"636":2,"637":8,"638":8,"639":2,"640":2,"641":6,"647":6,"648":8,"649":8,"660":2,"661":2,"667":2,"669":12,"670":2,"671":2,"673":4,"674":6,"676":2,"678":4,"679":4,"680":2,"681":2,"687":12,"688":4,"689":2,"690":6,"692":3,"695":2,"696":2,"700":10,"702":4,"703":3,"718":2,"740":4,"741":7,"742":2,"743":4,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":3,"751":4,"752":2,"754":1,"758":3,"759":3,"760":3,"761":3,"762":5,"763":5,"764":5,"765":5,"766":2,"767":5,"768":5,"769":5,"770":5,"771":5,"772":3,"773":5,"774":5,"775":3,"776":3,"777":5,"778":5,"779":3,"780":2,"781":3,"782":2,"783":1,"784":2,"785":8,"786":8,"787":4,"788":11,"789":5,"790":5,"791":5,"792":8,"793":10,"794":3,"803":3,"804":2,"805":2,"806":2,"807":4,"820":2,"821":2,"824":2,"825":2,"828":2,"829":2,"832":2,"833":2,"836":4,"837":4,"840":6,"841":6,"842":2,"843":2,"844":6,"845":6,"846":4,"847":4,"848":6,"849":6,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"887":2,"893":8,"898":2,"899":2,"901":2,"904":1}}],["structfunc",{"2":{"740":1}}],["structtourlvalues",{"0":{"585":1},"2":{"570":1,"585":4}}],["structtomap",{"0":{"77":1},"2":{"63":1,"77":4}}],["struct字段的json",{"2":{"82":1}}],["struct中导出字段需要设置json",{"2":{"77":1}}],["struct",{"2":{"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"37":2,"52":4,"74":2,"77":2,"81":6,"82":8,"138":2,"193":4,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"208":4,"224":4,"243":2,"288":2,"300":4,"311":2,"323":2,"325":2,"326":2,"327":2,"328":2,"329":2,"363":2,"372":4,"388":6,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"429":2,"430":2,"431":2,"432":2,"483":2,"501":2,"507":4,"524":2,"525":2,"577":2,"581":2,"582":4,"583":2,"584":2,"585":2,"588":2,"590":2,"591":2,"637":2,"689":2,"690":2,"736":1,"740":3,"741":4,"742":4,"743":4,"744":4,"745":2,"746":2,"747":4,"748":2,"749":2,"750":2,"751":2,"752":2,"814":2,"818":2,"822":2,"826":2,"830":2,"834":2,"838":2,"842":2,"846":4,"847":2,"893":2}}],["structs",{"0":{"735":1},"1":{"736":1,"737":1,"738":1,"739":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1},"2":{"0":1,"735":1,"736":2,"737":2,"740":4,"741":6,"742":4,"743":4,"744":4,"745":4,"746":4,"747":4,"748":4,"749":4,"750":4,"751":4,"752":4}}],["strutil",{"0":{"753":1},"1":{"754":1,"755":1,"756":1,"757":1,"758":1,"759":1,"760":1,"761":1,"762":1,"763":1,"764":1,"765":1,"766":1,"767":1,"768":1,"769":1,"770":1,"771":1,"772":1,"773":1,"774":1,"775":1,"776":1,"777":1,"778":1,"779":1,"780":1,"781":1,"782":1,"783":1,"784":1,"785":1,"786":1,"787":1,"788":1,"789":1,"790":1,"791":1,"792":1,"793":1,"794":1},"2":{"0":1,"753":1,"754":1,"755":2,"758":12,"759":12,"760":10,"761":10,"762":4,"763":4,"764":4,"765":4,"766":12,"767":4,"768":4,"769":16,"770":16,"771":16,"772":4,"773":4,"774":4,"775":12,"776":14,"777":10,"778":12,"779":14,"780":14,"781":6,"782":4,"783":4,"784":8,"785":6,"786":6,"787":12,"788":4,"789":8,"790":6,"791":10,"792":6,"793":8,"794":6,"907":3,"908":5}}],["sleep",{"2":{"43":2,"497":4,"499":2}}],["slice元素应为struct",{"2":{"690":1}}],["slice2",{"2":{"653":2,"654":2}}],["slice1",{"2":{"653":2,"654":2}}],["slices",{"2":{"641":2,"668":2,"675":2,"693":2,"698":2,"699":2}}],["slices和map的length大于0时",{"2":{"52":1}}],["slice的md5",{"2":{"122":1}}],["slice的md5值",{"2":{"121":1}}],["slice",{"0":{"630":1},"1":{"631":1,"632":1,"633":1,"634":1,"635":1,"636":1,"637":1,"638":1,"639":1,"640":1,"641":1,"642":1,"643":1,"644":1,"645":1,"646":1,"647":1,"648":1,"649":1,"650":1,"651":1,"652":1,"653":1,"654":1,"655":1,"656":1,"657":1,"658":1,"659":1,"660":1,"661":1,"662":1,"663":1,"664":1,"665":1,"666":1,"667":1,"668":1,"669":1,"670":1,"671":1,"672":1,"673":1,"674":1,"675":1,"676":1,"677":1,"678":1,"679":1,"680":1,"681":1,"682":1,"683":1,"684":1,"685":1,"686":1,"687":1,"688":1,"689":1,"690":1,"691":1,"692":1,"693":1,"694":1,"695":1,"696":1,"697":1,"698":1,"699":1,"700":1,"701":1,"702":1,"703":1},"2":{"0":1,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"16":2,"52":2,"501":6,"524":2,"547":2,"549":2,"630":1,"631":2,"632":2,"635":8,"636":8,"637":12,"638":8,"639":14,"640":12,"641":8,"642":8,"643":6,"644":6,"645":6,"646":6,"647":10,"648":12,"649":12,"650":10,"651":10,"652":6,"653":6,"654":4,"655":6,"656":6,"657":6,"658":6,"659":6,"660":6,"661":7,"662":6,"663":6,"664":6,"665":6,"666":6,"667":6,"668":4,"669":14,"670":8,"671":8,"672":6,"673":6,"674":6,"675":4,"676":6,"677":6,"678":8,"679":6,"680":14,"681":6,"682":4,"683":6,"684":10,"685":10,"686":10,"687":10,"688":12,"689":8,"690":6,"691":6,"692":6,"693":4,"694":4,"695":4,"696":6,"697":6,"698":4,"699":4,"700":15,"701":6,"702":6,"703":6}}],["sep",{"2":{"775":2}}],["separator",{"2":{"703":2}}],["server",{"2":{"593":2}}],["sendrequest",{"0":{"583":1},"2":{"570":1,"583":4,"584":2}}],["setosenv",{"0":{"804":1},"2":{"798":1,"803":2,"804":4,"805":2,"806":2}}],["set3",{"2":{"343":4,"346":4,"350":4,"351":4,"352":4,"353":4}}],["set2",{"2":{"343":4,"345":6,"346":4,"349":4,"350":4,"351":4,"352":4,"353":6}}],["set1",{"2":{"343":6,"344":4,"345":8,"346":6,"347":2,"349":4,"350":4,"351":4,"352":4,"353":4}}],["set",{"0":{"144":1,"330":1,"530":1},"1":{"145":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1},"2":{"136":1,"144":2,"145":2,"330":2,"331":2,"332":4,"335":10,"336":8,"337":8,"338":8,"339":8,"340":8,"341":10,"342":8,"343":14,"344":8,"345":10,"346":14,"347":10,"348":8,"349":10,"350":14,"351":14,"352":14,"353":16,"354":8,"505":1,"530":4,"531":2,"533":2,"534":2,"535":2,"536":2}}],["second",{"2":{"25":2,"26":2,"27":2,"28":2,"43":6,"498":2,"499":4,"544":2,"582":2}}],["selectionsort",{"0":{"8":1},"2":{"4":1,"8":4}}],["search",{"2":{"1":1,"2":1}}],["rs",{"2":{"772":4,"908":4}}],["rsadecrypt",{"0":{"132":1},"2":{"89":1,"131":2,"132":4}}],["rsaencrypt",{"0":{"131":1},"2":{"89":1,"131":4,"132":2}}],["rsa",{"2":{"86":1,"130":4,"131":8,"132":8}}],["runtime",{"2":{"795":1}}],["run",{"2":{"627":2,"855":1,"856":1,"857":1,"858":1,"859":1,"860":1,"861":1,"862":1,"863":1,"864":1,"865":1,"866":1,"867":1,"868":1,"869":1,"870":1,"871":1,"872":1,"873":1,"874":1,"875":1,"876":1,"877":1,"878":1,"879":1,"880":1,"881":1,"882":1,"883":1,"884":1,"885":1,"886":1,"887":1}}],["rint",{"2":{"612":4}}],["rightnode",{"2":{"387":1}}],["right",{"2":{"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2}}],["rawurl",{"2":{"581":4,"583":2,"584":2}}],["radian",{"2":{"557":2,"562":2,"563":2}}],["radiantoangle",{"0":{"557":1},"2":{"540":1,"557":8}}],["randstr",{"2":{"613":4,"614":4,"615":4,"616":4,"617":4}}],["randstring",{"0":{"613":1},"2":{"609":1,"613":4,"614":2}}],["randuniqueintslice",{"0":{"619":1},"2":{"609":1,"619":4}}],["randupper",{"0":{"614":1},"2":{"609":1,"614":2}}],["randnumeralorletter",{"0":{"617":1},"2":{"609":1,"617":4}}],["randnumeral",{"0":{"616":1},"2":{"609":1,"616":4}}],["randlower",{"0":{"615":1},"2":{"609":1,"615":4}}],["randint",{"0":{"612":1},"2":{"609":1,"612":4}}],["randbytes",{"0":{"611":1},"2":{"609":1,"611":8}}],["random",{"0":{"606":1},"1":{"607":1,"608":1,"609":1,"610":1,"611":1,"612":1,"613":1,"614":1,"615":1,"616":1,"617":1,"618":1,"619":1},"2":{"0":1,"606":1,"607":2,"608":2,"611":4,"612":4,"613":4,"614":4,"615":4,"616":4,"617":4,"618":4,"619":6,"683":2}}],["rangewithstep",{"0":{"555":1},"2":{"540":1,"555":10}}],["range",{"0":{"536":1,"554":1,"722":1},"2":{"38":2,"39":2,"41":2,"42":2,"44":2,"45":2,"46":2,"81":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"505":1,"536":4,"540":1,"554":10,"707":1,"722":10,"762":2,"763":2,"764":2,"765":2,"767":2,"768":2,"773":2,"774":2}}],["roundtostring",{"0":{"552":1},"2":{"540":1,"552":8}}],["roundtofloat",{"0":{"551":1},"2":{"540":1,"542":2,"551":8}}],["rootdata",{"2":{"388":2}}],["rootnode",{"2":{"387":1}}],["r2",{"2":{"339":4}}],["r1",{"2":{"339":4}}],["r",{"2":{"65":4,"66":4,"794":2}}],["regex",{"2":{"878":2}}],["regionname",{"2":{"577":4}}],["region",{"2":{"577":4}}],["recover",{"2":{"905":2}}],["records",{"2":{"473":2}}],["recursive",{"2":{"661":1}}],["repalceall",{"2":{"794":2}}],["replacechar",{"2":{"791":2}}],["replaces",{"2":{"788":6}}],["replacewithmap",{"0":{"788":1},"2":{"756":1,"788":4}}],["replaceall",{"0":{"681":1},"2":{"633":1,"681":4}}],["replace",{"0":{"680":1},"2":{"633":1,"680":12}}],["repeatfn",{"0":{"42":1},"2":{"34":1,"42":4}}],["repeat",{"0":{"41":1,"682":1},"2":{"34":1,"39":2,"41":4,"44":2,"46":2,"633":1,"682":4}}],["request",{"2":{"578":8,"581":2,"582":4,"583":6,"584":4}}],["req",{"2":{"578":2}}],["readall",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2}}],["readcsvfile",{"0":{"472":1},"2":{"449":1,"472":4,"473":2}}],["readfilebyline",{"0":{"464":1},"2":{"449":1,"464":4}}],["readfiletostring",{"0":{"463":1},"2":{"449":1,"463":4,"474":2,"475":2}}],["res",{"2":{"683":2}}],["resp",{"2":{"583":6,"584":8,"586":4,"587":4,"588":4,"589":4,"590":4,"591":6}}],["response",{"2":{"583":2,"584":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2}}],["responsetimeout",{"2":{"582":2}}],["reset",{"2":{"501":4}}],["res2",{"2":{"353":4}}],["res1",{"2":{"353":4}}],["result",{"2":{"67":4,"73":4,"74":4,"75":4,"78":4,"80":6,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"273":8,"274":8,"275":4,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"495":4,"496":4,"500":4,"509":4,"510":4,"511":4,"512":4,"513":4,"514":4,"517":4,"518":4,"522":4,"523":4,"524":10,"525":4,"526":4,"603":4,"619":4,"643":4,"644":4,"645":4,"646":4,"652":4,"654":4,"655":4,"656":4,"657":4,"658":4,"659":4,"660":4,"661":4,"662":8,"665":4,"666":4,"667":4,"668":4,"672":4,"673":4,"674":4,"675":4,"677":4,"679":4,"681":4,"682":4,"683":2,"691":4,"692":4,"693":4,"694":4,"695":4,"696":4,"697":4,"698":4,"699":4,"701":4,"702":4,"724":6,"725":4,"726":4,"727":4,"783":4,"788":4,"803":4,"804":4,"806":4,"816":4,"820":4,"824":4,"828":4,"832":4,"836":4,"840":4,"844":4,"848":4,"886":4}}],["result9",{"2":{"52":2}}],["result8",{"2":{"52":6}}],["result7",{"2":{"23":4,"26":4,"28":4,"52":4,"76":4,"769":4,"770":4,"771":4}}],["result6",{"2":{"23":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"71":4,"76":4,"769":4,"770":4,"771":4,"776":4,"779":4,"780":4}}],["result5",{"2":{"23":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"71":4,"72":4,"76":4,"560":4,"562":4,"563":4,"639":4,"669":4,"680":4,"700":4,"758":4,"759":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"778":4,"779":4,"780":4,"787":4,"862":4,"887":4}}],["result4",{"2":{"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"71":4,"72":4,"76":4,"484":4,"485":4,"486":4,"487":4,"554":4,"555":4,"559":4,"560":4,"562":4,"563":4,"604":2,"605":2,"637":4,"639":4,"640":4,"648":4,"649":4,"669":4,"680":4,"700":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"787":4,"791":4,"862":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"879":4,"885":4,"887":4}}],["result3",{"2":{"17":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"69":4,"70":4,"71":4,"72":4,"76":4,"427":4,"428":4,"439":4,"440":4,"481":4,"484":4,"485":4,"486":4,"487":4,"515":4,"543":4,"544":4,"545":4,"547":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"566":2,"604":2,"605":2,"637":4,"639":4,"640":4,"647":4,"648":4,"649":4,"650":4,"651":4,"669":4,"680":4,"684":4,"685":4,"686":4,"687":4,"700":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"784":4,"787":4,"789":4,"791":4,"793":4,"855":4,"856":4,"857":4,"858":4,"859":4,"860":4,"861":4,"862":4,"868":4,"870":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"879":4,"883":4,"885":4,"887":4}}],["result2",{"2":{"14":4,"15":4,"16":4,"17":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"59":4,"69":4,"70":4,"71":4,"72":4,"76":4,"427":4,"428":4,"437":4,"438":4,"439":4,"440":4,"441":2,"481":4,"482":4,"484":4,"485":4,"486":4,"487":4,"515":4,"527":4,"528":4,"542":4,"543":4,"544":4,"545":4,"546":4,"547":4,"548":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"565":4,"566":2,"594":4,"595":4,"601":4,"602":4,"604":2,"605":2,"635":4,"636":4,"637":4,"638":4,"639":4,"640":4,"641":4,"642":4,"647":4,"648":4,"649":4,"650":4,"651":4,"653":4,"669":4,"670":4,"671":4,"678":4,"680":4,"684":4,"685":4,"686":4,"687":4,"700":4,"703":4,"730":4,"731":4,"732":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"781":4,"782":4,"784":4,"785":4,"786":4,"787":4,"789":4,"790":4,"791":4,"792":4,"793":4,"794":4,"805":4,"855":4,"856":4,"857":4,"858":4,"859":4,"860":4,"861":4,"862":4,"863":4,"864":4,"865":4,"866":4,"867":4,"868":4,"869":4,"870":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"878":4,"879":4,"880":4,"881":4,"882":4,"883":4,"884":4,"885":4,"887":4,"905":4}}],["result1",{"2":{"14":4,"15":4,"16":4,"17":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"52":4,"59":4,"69":4,"70":4,"71":4,"72":4,"76":4,"427":4,"428":4,"437":4,"438":4,"439":4,"440":4,"441":4,"481":4,"482":4,"484":4,"485":4,"486":4,"487":4,"515":4,"527":4,"528":4,"542":4,"543":4,"544":4,"545":4,"546":4,"547":4,"548":4,"549":4,"550":4,"551":4,"552":4,"553":4,"554":4,"555":4,"556":4,"557":4,"558":4,"559":4,"560":4,"561":4,"562":4,"563":4,"564":4,"565":4,"566":4,"594":4,"595":4,"601":4,"602":4,"604":2,"605":2,"635":4,"636":4,"637":4,"638":4,"639":4,"640":4,"641":4,"642":4,"647":4,"648":4,"649":4,"650":4,"651":4,"653":4,"669":4,"670":4,"671":4,"678":4,"680":4,"684":4,"685":4,"686":4,"687":4,"700":4,"703":4,"730":4,"731":4,"732":4,"758":4,"759":4,"760":4,"761":4,"766":4,"769":4,"770":4,"771":4,"775":4,"776":4,"777":4,"778":4,"779":4,"780":4,"781":4,"782":6,"784":4,"785":4,"786":4,"787":4,"789":4,"790":4,"791":4,"792":4,"793":4,"794":4,"805":4,"855":4,"856":4,"857":4,"858":4,"859":4,"860":4,"861":4,"862":4,"863":4,"864":4,"865":4,"866":4,"867":4,"868":4,"869":4,"870":4,"871":4,"872":4,"873":4,"874":4,"875":4,"876":4,"877":4,"878":4,"879":4,"880":4,"881":4,"882":4,"883":4,"884":4,"885":4,"887":4,"905":4}}],["reverse",{"0":{"217":1,"232":1,"265":1,"676":1,"721":1,"772":1},"2":{"204":1,"205":1,"217":4,"232":4,"241":1,"265":4,"633":1,"676":4,"707":1,"721":8,"756":1,"772":4,"908":3}}],["removeosenv",{"0":{"805":1},"2":{"798":1,"805":4}}],["removeemptystring",{"2":{"775":2}}],["removeemptystring参数指定是否去除空字符串",{"2":{"775":1}}],["removewhitespace",{"0":{"794":1},"2":{"756":1,"794":6}}],["removenonprintable",{"0":{"781":1},"2":{"756":1,"781":6}}],["removefile",{"0":{"462":1},"2":{"449":1,"462":4}}],["remove",{"0":{"146":1},"2":{"136":1,"474":2,"475":2}}],["reflect",{"2":{"83":4,"257":1,"493":2,"494":2,"695":2,"751":2,"782":2,"905":2}}],["reducer",{"2":{"678":2,"679":2}}],["reduceright",{"0":{"679":1},"2":{"633":1,"679":4}}],["reduce",{"0":{"677":1,"725":1},"2":{"677":4,"707":1,"725":4}}],["reduceby",{"0":{"678":1},"2":{"633":1,"678":6}}],["reducedeprecated",{"2":{"633":1}}],["red",{"2":{"65":2,"66":2}}],["retain2",{"2":{"271":4}}],["retain1",{"2":{"271":4}}],["retain",{"2":{"271":4}}],["retainall",{"0":{"271":1},"2":{"241":1,"271":8}}],["return",{"2":{"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"38":2,"42":2,"43":2,"74":2,"78":2,"80":2,"82":2,"131":2,"132":2,"166":2,"249":4,"250":4,"275":2,"277":2,"340":4,"348":4,"473":4,"474":6,"475":6,"495":4,"496":4,"500":6,"509":2,"512":2,"520":2,"521":8,"522":2,"523":2,"524":2,"526":2,"536":2,"547":6,"549":6,"583":4,"584":4,"618":2,"625":2,"626":6,"627":4,"628":6,"629":6,"637":8,"643":2,"645":2,"646":2,"650":6,"651":6,"652":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"663":4,"664":2,"665":2,"672":2,"673":4,"674":2,"677":2,"678":4,"679":2,"687":6,"689":4,"690":2,"691":2,"697":2,"699":2,"702":2,"713":4,"716":2,"717":2,"723":2,"725":2,"728":2,"729":2,"730":4,"731":4,"732":4,"806":2}}],["retrytimes",{"0":{"627":1},"2":{"623":1,"627":4}}],["retryduration",{"0":{"628":1},"2":{"623":1,"625":2,"626":2,"628":4,"629":2}}],["retryfunc",{"0":{"626":1},"2":{"623":1,"626":4,"629":4}}],["retry",{"0":{"620":1,"629":1},"1":{"621":1,"622":1,"623":1,"624":1,"625":1,"626":1,"627":1,"628":1,"629":1},"2":{"0":1,"620":1,"621":2,"622":2,"623":1,"625":10,"626":10,"627":10,"628":8,"629":10}}],["floor",{"2":{"665":6}}],["float34",{"2":{"872":1}}],["float32",{"2":{"566":2,"832":2,"833":2,"836":2,"837":2,"840":2,"841":2,"844":2,"845":2,"848":2,"849":2,"872":1}}],["float64func",{"2":{"550":1,"551":1,"553":1,"556":1,"557":1,"558":1,"562":1,"563":1,"564":1}}],["float64",{"2":{"29":10,"71":2,"72":2,"81":2,"82":4,"484":2,"485":2,"550":3,"551":3,"552":2,"553":3,"556":3,"557":3,"558":3,"562":3,"563":3,"564":3,"565":2,"577":4,"665":10,"816":2,"817":2,"820":2,"821":2,"824":2,"825":2,"828":2,"829":2,"832":2,"833":2,"836":2,"837":2,"840":2,"841":2,"844":2,"845":2,"848":2,"849":2}}],["float",{"2":{"29":2,"81":4,"481":2,"542":2,"546":2,"548":2,"554":2,"555":2,"565":2,"566":2,"712":2,"873":1}}],["flatmap",{"0":{"674":1},"2":{"633":1,"674":4}}],["flattens",{"2":{"661":1}}],["flattendeep",{"0":{"661":1},"2":{"633":1,"661":4}}],["flatten",{"0":{"660":1},"2":{"633":1,"660":4}}],["fc82a4199749de9cfb71e32e54f489d3",{"2":{"592":2}}],["female",{"2":{"472":2,"473":4}}],["fpath",{"2":{"465":2,"466":2,"473":10}}],["fpath参数可以是文件或目录",{"2":{"465":1}}],["fs",{"2":{"456":2}}],["fo",{"2":{"785":2}}],["fooba",{"2":{"770":2}}],["foobarb",{"2":{"770":2}}],["foobarbaz",{"2":{"762":2}}],["foobar",{"2":{"762":4,"763":4,"764":2,"765":4,"770":2,"773":4,"774":2}}],["foob",{"2":{"769":2,"770":2}}],["foo11bar",{"2":{"762":2}}],["foo",{"2":{"637":8,"758":16,"759":18,"760":16,"761":16,"762":6,"763":12,"764":14,"765":12,"769":20,"770":20,"771":20,"772":4,"773":12,"774":14,"777":12,"778":20,"785":4,"786":4,"787":2,"803":4,"804":4,"805":8,"806":4,"846":4,"847":4}}],["folder",{"2":{"453":2}}],["form",{"2":{"581":2,"587":2}}],["formdata",{"2":{"581":4}}],["formatint",{"2":{"673":2,"674":2}}],["format",{"2":{"427":2,"428":2,"441":2,"893":2}}],["formatstrtotime",{"0":{"428":1},"2":{"401":1,"428":8}}],["formattimetostr",{"0":{"427":1},"2":{"401":1,"427":8}}],["formatter",{"0":{"476":1},"1":{"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1},"2":{"0":1,"476":1,"477":3,"478":2,"481":8,"482":6,"483":4,"484":10,"485":10,"486":10,"487":10}}],["forwarded",{"2":{"578":2}}],["foreachwithbreak",{"0":{"663":1},"2":{"633":1,"663":4}}],["foreach",{"0":{"273":1,"508":1,"662":1,"724":1},"2":{"241":1,"273":4,"505":1,"508":4,"633":1,"662":4,"707":1,"724":4}}],["for",{"2":{"38":4,"39":4,"41":2,"42":2,"44":2,"45":2,"46":2,"67":2,"81":2,"274":2,"325":2,"326":2,"327":2,"328":2,"329":2,"501":2,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"578":2,"711":2,"762":2,"763":2,"764":2,"765":2,"767":2,"768":2,"773":2,"774":2}}],["fromrange",{"0":{"712":1},"2":{"707":1,"712":4}}],["fromchannel",{"0":{"711":1},"2":{"707":1,"711":4}}],["fromslice",{"0":{"710":1},"2":{"707":1,"710":4,"714":4,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":4}}],["fromentries",{"0":{"525":1},"2":{"505":1,"525":4}}],["fromindex",{"2":{"169":1,"276":2}}],["front",{"0":{"292":1,"304":1,"315":1},"2":{"282":1,"283":1,"284":1,"292":4,"304":4,"315":4}}],["f",{"2":{"165":2,"249":2,"250":2,"277":2,"457":4,"463":4,"464":6,"473":4,"637":12,"743":4,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"784":2,"787":2,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":12,"839":4,"840":8,"841":6,"842":12,"843":4,"844":8,"845":6,"846":12,"847":4,"848":8,"849":6}}],["fnlist",{"2":{"496":2}}],["fn",{"2":{"42":6,"347":2,"493":8,"494":12,"497":2,"498":2,"499":2,"500":4}}],["failed",{"2":{"627":2}}],["fallback",{"2":{"604":2}}],["false",{"2":{"17":2,"23":6,"24":2,"25":4,"26":6,"27":4,"28":6,"29":6,"52":22,"53":6,"54":2,"55":4,"56":6,"57":4,"58":2,"67":16,"76":4,"81":10,"183":2,"220":2,"235":2,"244":2,"257":2,"258":2,"275":2,"295":2,"296":2,"298":2,"307":2,"309":2,"318":2,"319":2,"321":2,"327":2,"328":2,"329":2,"339":2,"340":2,"342":2,"343":2,"346":2,"348":2,"349":2,"369":2,"378":2,"396":2,"437":2,"440":2,"459":2,"460":2,"473":2,"527":2,"528":2,"532":10,"534":2,"559":6,"579":4,"580":2,"594":2,"595":2,"636":2,"637":4,"638":2,"640":4,"652":2,"653":2,"663":2,"673":2,"684":4,"685":4,"686":2,"687":2,"730":2,"731":2,"732":2,"747":2,"748":2,"749":2,"766":6,"775":4,"784":2,"785":2,"786":2,"792":2,"793":2,"794":2,"848":4,"849":4,"855":2,"856":4,"857":2,"858":2,"859":4,"860":4,"861":4,"862":4,"863":2,"864":2,"865":2,"866":2,"867":2,"868":4,"869":2,"870":4,"871":6,"872":6,"873":4,"874":4,"875":2,"876":2,"877":4,"878":2,"879":4,"880":2,"881":2,"882":2,"883":2,"884":2,"885":4,"887":2,"899":2,"900":2}}],["fatal",{"2":{"586":2,"587":2,"588":2,"589":2,"590":2,"591":4}}],["factorial",{"0":{"545":1},"2":{"540":1,"545":8}}],["fanin",{"0":{"39":1},"2":{"34":1,"39":4}}],["findfirst",{"0":{"726":1},"2":{"707":1,"726":4}}],["find",{"0":{"656":1},"2":{"656":4}}],["findlast",{"0":{"658":1,"727":1},"2":{"658":4,"707":1,"727":4}}],["findlastby",{"0":{"658":1,"659":1},"2":{"633":1,"659":4}}],["findlastdeprecated",{"2":{"633":1}}],["findby",{"0":{"656":1,"657":1},"2":{"633":1,"657":4}}],["finddeprecated",{"2":{"633":1}}],["first",{"2":{"544":2}}],["fibonacci",{"0":{"544":1},"2":{"540":1,"544":8}}],["filtermap",{"0":{"673":1},"2":{"633":1,"673":4}}],["filter的反向操作",{"2":{"512":1}}],["filterbyvalues的反向操作",{"2":{"514":1}}],["filterbyvalues",{"0":{"511":1},"2":{"505":1,"511":4}}],["filterbykeys的反向操作",{"2":{"513":1}}],["filterbykeys",{"0":{"510":1},"2":{"505":1,"510":4}}],["filter",{"0":{"509":1,"655":1,"716":1},"2":{"505":1,"509":6,"633":1,"655":4,"707":1,"716":4}}],["filenames",{"2":{"461":4}}],["filesize",{"0":{"469":1},"2":{"449":1,"469":4}}],["filemode",{"0":{"456":1},"2":{"449":1,"456":6}}],["file",{"2":{"447":1,"457":6,"474":4,"475":4,"902":2}}],["filepath",{"2":{"123":2,"468":2,"470":2,"471":2,"472":2,"473":2,"474":12,"475":12,"592":2,"593":2}}],["fileutil",{"0":{"446":1},"1":{"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1,"457":1,"458":1,"459":1,"460":1,"461":1,"462":1,"463":1,"464":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1,"471":1,"472":1,"473":1,"474":1,"475":1},"2":{"0":1,"446":1,"447":1,"448":2,"451":4,"452":4,"453":4,"454":4,"455":2,"456":4,"457":6,"458":6,"459":4,"460":6,"461":4,"462":4,"463":6,"464":6,"465":4,"466":4,"467":4,"468":4,"469":4,"470":4,"471":8,"472":4,"473":8,"474":6,"475":6}}],["fieldj",{"2":{"846":4,"849":2}}],["fieldi",{"2":{"842":4,"845":2,"846":4,"849":2}}],["fieldh",{"2":{"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldg",{"2":{"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldf",{"2":{"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldfunc",{"2":{"742":1,"743":1}}],["fielde",{"2":{"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldd",{"2":{"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldc",{"2":{"818":4,"821":2,"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fieldb",{"2":{"814":4,"817":2,"818":4,"821":2,"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fielda",{"2":{"814":4,"817":2,"818":4,"821":2,"822":4,"825":2,"826":4,"829":2,"830":4,"833":2,"834":4,"837":2,"838":4,"841":2,"842":4,"845":2,"846":4,"849":2}}],["fields",{"0":{"742":1},"2":{"738":1,"742":8}}],["field",{"0":{"743":1},"2":{"7":2,"690":2,"736":1,"738":1,"742":1,"743":5,"745":4,"746":4,"747":6,"748":6,"749":6,"750":6,"751":6,"752":4}}],["fmt",{"2":{"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":6,"15":6,"16":6,"17":12,"23":16,"24":10,"25":14,"26":16,"27":14,"28":16,"29":14,"37":2,"38":4,"39":4,"40":8,"41":4,"42":4,"43":4,"44":4,"45":4,"46":6,"52":20,"53":10,"54":10,"55":10,"56":10,"57":10,"58":10,"59":6,"65":4,"66":4,"67":4,"68":6,"69":8,"70":8,"71":14,"72":12,"73":6,"74":4,"75":4,"76":16,"77":4,"78":4,"79":4,"80":4,"81":4,"82":8,"83":8,"84":6,"85":6,"91":4,"92":4,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"101":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":4,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":2,"119":4,"120":2,"121":2,"122":2,"123":4,"124":4,"125":2,"126":4,"127":2,"128":4,"129":2,"130":4,"131":4,"132":4,"139":4,"141":4,"143":2,"145":4,"148":4,"150":2,"152":2,"154":4,"156":4,"158":2,"160":4,"162":2,"164":2,"166":4,"168":4,"170":4,"172":4,"178":4,"179":4,"180":4,"181":4,"182":6,"183":6,"184":6,"185":4,"186":4,"193":4,"194":4,"195":6,"196":6,"197":4,"198":4,"199":4,"208":4,"209":4,"210":4,"211":4,"212":4,"213":4,"214":4,"215":4,"216":4,"217":4,"218":4,"219":4,"220":6,"221":4,"222":2,"224":4,"225":4,"226":4,"227":4,"228":4,"229":4,"230":4,"231":4,"232":4,"233":4,"234":4,"235":6,"236":4,"237":2,"243":4,"244":6,"245":4,"246":6,"247":6,"248":6,"249":6,"250":6,"251":4,"252":8,"253":8,"254":10,"255":10,"256":8,"257":6,"258":6,"259":4,"260":4,"261":4,"262":4,"263":4,"264":4,"265":4,"266":4,"267":4,"268":4,"269":4,"270":4,"271":8,"272":8,"273":4,"274":4,"275":4,"276":4,"277":6,"288":4,"289":4,"290":4,"291":6,"292":6,"293":6,"294":4,"295":6,"296":6,"297":4,"298":6,"300":4,"301":4,"302":4,"303":6,"304":6,"305":6,"306":4,"307":6,"308":4,"309":6,"311":4,"312":4,"313":4,"314":6,"315":6,"316":6,"317":4,"318":6,"319":6,"320":4,"321":6,"323":4,"324":4,"325":4,"326":6,"327":6,"328":6,"329":6,"335":4,"336":4,"337":4,"338":4,"339":8,"340":8,"341":4,"342":6,"343":6,"344":4,"345":6,"346":6,"347":4,"348":4,"349":6,"350":4,"351":4,"352":4,"353":6,"354":6,"363":4,"364":4,"365":8,"366":8,"367":4,"368":4,"369":6,"370":4,"372":4,"373":4,"374":8,"375":8,"376":4,"377":4,"378":6,"379":4,"380":2,"388":4,"389":4,"390":4,"391":4,"392":4,"393":4,"394":4,"395":4,"396":6,"397":4,"404":6,"405":6,"406":6,"407":6,"408":4,"409":4,"410":4,"411":4,"412":4,"413":4,"414":4,"415":4,"416":4,"417":4,"418":4,"419":4,"420":4,"421":4,"422":4,"423":4,"424":4,"425":4,"426":4,"427":8,"428":8,"429":4,"430":4,"431":4,"432":4,"433":4,"434":4,"435":4,"436":4,"437":6,"438":6,"439":8,"440":8,"441":6,"442":4,"443":4,"444":4,"445":4,"451":4,"452":4,"453":4,"454":4,"455":4,"456":6,"457":6,"458":4,"459":4,"460":6,"461":4,"462":4,"463":4,"464":4,"465":4,"466":4,"467":4,"468":4,"469":6,"470":6,"471":10,"472":6,"473":4,"474":4,"475":4,"481":8,"482":6,"483":6,"484":10,"485":10,"486":10,"487":10,"493":4,"494":4,"495":4,"496":4,"497":6,"498":4,"499":4,"500":4,"501":6,"507":6,"508":4,"509":4,"510":4,"511":4,"512":4,"513":4,"514":4,"515":8,"516":4,"517":4,"518":4,"519":2,"520":4,"521":4,"522":4,"523":4,"524":4,"525":4,"526":4,"527":6,"528":8,"529":2,"530":8,"531":8,"532":6,"533":6,"534":12,"535":8,"536":6,"542":6,"543":8,"544":8,"545":8,"546":6,"547":8,"548":6,"549":8,"550":8,"551":8,"552":8,"553":8,"554":10,"555":10,"556":8,"557":8,"558":4,"559":10,"560":12,"561":8,"562":12,"563":12,"564":8,"565":6,"566":2,"572":4,"573":6,"574":4,"575":4,"576":4,"577":6,"578":4,"579":8,"580":8,"581":2,"582":2,"583":4,"584":4,"585":10,"586":4,"587":4,"588":4,"589":4,"590":4,"591":4,"592":4,"593":6,"594":6,"595":6,"601":6,"602":6,"603":4,"604":2,"605":2,"611":4,"612":4,"613":4,"614":4,"615":4,"616":4,"617":4,"618":4,"619":4,"625":4,"626":4,"627":4,"628":4,"629":4,"635":6,"636":6,"637":10,"638":6,"639":12,"640":10,"641":6,"642":6,"643":4,"644":4,"645":4,"646":4,"647":8,"648":10,"649":10,"650":8,"651":8,"652":4,"653":6,"654":4,"655":4,"656":6,"657":6,"658":6,"659":6,"660":4,"661":4,"662":4,"663":4,"664":6,"665":4,"666":4,"667":4,"668":4,"669":12,"670":6,"671":6,"672":4,"673":4,"674":4,"675":4,"676":4,"677":4,"678":8,"679":6,"680":12,"681":4,"682":4,"683":4,"684":8,"685":8,"686":8,"687":8,"688":10,"689":6,"690":4,"691":4,"692":4,"693":4,"694":4,"695":4,"696":4,"697":4,"698":4,"699":4,"700":12,"701":4,"702":4,"703":6,"709":4,"710":4,"711":4,"712":4,"713":4,"714":4,"715":6,"716":4,"717":4,"718":10,"719":10,"720":10,"721":4,"722":10,"723":6,"724":4,"725":4,"726":6,"727":6,"728":6,"729":6,"730":6,"731":6,"732":6,"733":6,"734":4,"741":6,"742":4,"743":4,"744":4,"745":4,"746":4,"747":6,"748":6,"749":6,"750":6,"751":6,"752":4,"758":12,"759":12,"760":10,"761":10,"762":4,"763":4,"764":4,"765":4,"766":12,"767":4,"768":4,"769":16,"770":16,"771":16,"772":6,"773":4,"774":4,"775":12,"776":14,"777":10,"778":12,"779":14,"780":14,"781":6,"782":6,"783":4,"784":8,"785":6,"786":6,"787":12,"788":4,"789":8,"790":6,"791":10,"792":6,"793":8,"794":6,"800":4,"801":4,"802":4,"803":6,"804":6,"805":10,"806":4,"807":16,"808":4,"814":4,"815":4,"816":4,"817":4,"818":4,"819":4,"820":4,"821":4,"822":4,"823":4,"824":4,"825":4,"826":4,"827":4,"828":4,"829":4,"830":4,"831":4,"832":4,"833":4,"834":4,"835":4,"836":4,"837":4,"838":4,"839":4,"840":4,"841":4,"842":4,"843":4,"844":4,"845":4,"846":4,"847":4,"848":4,"849":4,"855":8,"856":8,"857":8,"858":8,"859":8,"860":8,"861":8,"862":12,"863":6,"864":6,"865":6,"866":6,"867":6,"868":8,"869":6,"870":8,"871":10,"872":10,"873":10,"874":10,"875":10,"876":10,"877":10,"878":6,"879":10,"880":6,"881":6,"882":6,"883":8,"884":6,"885":10,"886":4,"887":12,"893":4,"894":4,"895":4,"896":2,"897":4,"898":4,"899":6,"900":6,"901":4,"902":8,"903":10,"904":4,"905":6,"908":4}}],["func1",{"2":{"627":2}}],["funcs",{"2":{"500":2}}],["func",{"2":{"6":5,"7":5,"8":5,"9":5,"10":5,"11":5,"12":5,"13":4,"14":4,"15":4,"16":6,"17":10,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"37":4,"38":6,"39":2,"40":2,"41":2,"42":6,"43":6,"44":2,"45":2,"46":3,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"65":3,"66":2,"67":3,"68":3,"69":2,"70":2,"71":3,"72":3,"73":3,"74":6,"75":2,"76":2,"77":3,"78":6,"79":3,"80":2,"81":2,"82":3,"83":3,"84":3,"85":3,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":3,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"138":2,"139":2,"141":2,"143":2,"144":1,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"163":1,"164":2,"165":3,"166":4,"167":1,"168":2,"169":1,"170":2,"172":2,"178":2,"179":2,"180":2,"181":2,"182":3,"183":2,"184":7,"185":2,"186":2,"193":6,"194":5,"195":5,"196":5,"197":4,"198":4,"199":5,"208":4,"209":2,"210":3,"211":3,"212":3,"213":3,"214":3,"215":3,"216":3,"217":3,"218":3,"219":2,"220":2,"221":3,"222":3,"224":4,"225":2,"226":3,"227":3,"228":3,"229":3,"230":3,"231":3,"232":3,"233":3,"234":2,"235":2,"236":3,"237":3,"243":4,"244":2,"245":2,"246":3,"247":2,"248":2,"249":8,"250":8,"251":3,"252":3,"253":3,"254":3,"255":3,"256":3,"257":2,"258":2,"259":3,"260":3,"261":3,"262":2,"263":2,"264":3,"265":3,"266":3,"267":3,"268":3,"269":3,"270":3,"271":2,"272":2,"273":7,"274":3,"275":6,"276":3,"277":6,"288":3,"289":2,"290":2,"291":3,"292":2,"293":2,"294":2,"295":2,"296":2,"297":3,"298":2,"300":3,"301":2,"302":3,"303":3,"304":3,"305":3,"306":2,"307":2,"308":3,"309":2,"311":3,"312":2,"313":2,"314":3,"315":2,"316":2,"317":2,"318":2,"319":2,"320":3,"321":2,"323":3,"324":2,"325":4,"326":5,"327":4,"328":4,"329":4,"335":4,"336":3,"337":2,"338":3,"339":2,"340":8,"341":3,"342":2,"343":2,"344":2,"345":3,"346":2,"347":7,"348":7,"349":2,"350":3,"351":3,"352":3,"353":3,"354":3,"363":4,"364":3,"365":3,"366":3,"367":2,"368":2,"369":2,"370":3,"372":4,"373":3,"374":3,"375":3,"376":2,"377":2,"378":2,"379":3,"380":3,"388":5,"389":5,"390":5,"391":4,"392":4,"393":4,"394":4,"395":4,"396":4,"397":5,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":3,"429":4,"430":4,"431":4,"432":4,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":3,"457":2,"458":2,"459":2,"460":2,"461":3,"462":2,"463":3,"464":3,"465":2,"466":2,"467":2,"468":2,"469":3,"470":3,"471":3,"472":3,"473":2,"474":2,"475":2,"481":2,"482":3,"483":2,"484":2,"485":2,"486":3,"487":3,"493":6,"494":6,"495":12,"496":10,"497":9,"498":5,"499":4,"500":12,"501":14,"507":2,"508":7,"509":8,"510":2,"511":2,"512":6,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":6,"521":6,"522":6,"523":6,"524":6,"525":4,"526":6,"527":2,"528":2,"529":4,"530":7,"531":7,"532":5,"533":7,"534":7,"535":6,"536":9,"542":2,"543":2,"544":2,"545":2,"546":2,"547":10,"548":2,"549":10,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"572":2,"573":3,"574":2,"575":2,"576":3,"577":3,"578":2,"579":2,"580":2,"581":2,"582":6,"583":3,"584":2,"585":2,"586":4,"587":4,"588":4,"589":4,"590":4,"591":2,"592":2,"593":3,"594":2,"595":2,"601":2,"602":2,"603":2,"604":2,"605":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":3,"619":2,"625":5,"626":6,"627":5,"628":5,"629":4,"635":2,"636":2,"637":12,"638":2,"639":2,"640":2,"641":2,"642":2,"643":6,"644":2,"645":6,"646":6,"647":3,"648":2,"649":2,"650":10,"651":10,"652":6,"653":2,"654":6,"655":6,"656":7,"657":7,"658":7,"659":7,"660":2,"661":2,"662":7,"663":7,"664":7,"665":6,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":6,"673":6,"674":6,"675":2,"676":3,"677":6,"678":8,"679":6,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":10,"688":3,"689":9,"690":2,"691":6,"692":2,"693":2,"694":2,"695":2,"696":2,"697":6,"698":2,"699":6,"700":2,"701":2,"702":6,"703":2,"709":3,"710":3,"711":5,"712":3,"713":13,"714":3,"715":3,"716":7,"717":7,"718":7,"719":3,"720":3,"721":3,"722":3,"723":7,"724":7,"725":6,"726":3,"727":3,"728":7,"729":7,"730":8,"731":8,"732":8,"733":2,"734":2,"740":2,"741":4,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":3,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":6,"808":2,"814":4,"815":3,"816":3,"817":3,"818":4,"819":3,"820":3,"821":3,"822":4,"823":3,"824":3,"825":3,"826":4,"827":3,"828":3,"829":3,"830":4,"831":3,"832":3,"833":3,"834":4,"835":3,"836":3,"837":3,"838":4,"839":3,"840":3,"841":3,"842":4,"843":3,"844":3,"845":3,"846":4,"847":3,"848":3,"849":3,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":2,"869":2,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":2,"884":2,"885":2,"886":2,"887":2,"893":4,"894":2,"895":2,"896":2,"897":2,"898":2,"899":2,"900":2,"901":2,"902":4,"903":2,"904":2,"905":4,"908":2}}],["function",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1,"495":1,"496":1,"497":1,"498":1,"499":1,"500":1,"501":1},"2":{"0":1,"488":1,"489":3,"490":2,"493":4,"494":4,"495":4,"496":4,"497":4,"498":4,"499":4,"500":4,"501":4,"627":2}}],["c执行命令",{"2":{"807":1}}],["cd",{"2":{"789":6}}],["c1",{"2":{"747":8}}],["city",{"2":{"577":4}}],["circularqueue",{"0":{"284":1,"310":1},"2":{"278":1,"279":1,"311":4,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2}}],["c=3",{"2":{"572":2}}],["cmd",{"2":{"807":2}}],["cm",{"2":{"529":2,"530":8,"531":8,"532":6,"533":8,"534":10,"535":8,"536":8}}],["c3",{"2":{"523":2}}],["cf",{"2":{"495":2}}],["cfb算法模式解决密数据",{"2":{"108":1}}],["cfb算法模式解密数据",{"2":{"97":1}}],["cfb算法模式加密数据",{"2":{"96":1,"107":1}}],["curryfn",{"0":{"495":1},"2":{"491":1,"495":6}}],["currentpath",{"0":{"455":1},"2":{"449":1,"455":4}}],["current",{"2":{"422":4}}],["currenttime",{"2":{"421":4}}],["currentdate",{"2":{"420":4}}],["csv",{"2":{"472":2,"473":2}}],["creditcart",{"2":{"867":2}}],["create",{"2":{"453":2,"474":2,"475":2,"529":4}}],["createdir",{"0":{"453":1},"2":{"449":1,"453":4}}],["createfile",{"0":{"452":1},"2":{"449":1,"452":4,"458":2,"463":2,"464":2,"473":2}}],["crypto",{"2":{"87":1}}],["cryptor包包含数据加密和解密功能",{"2":{"86":1}}],["cryptor",{"0":{"86":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1},"2":{"0":1,"87":2,"88":2,"91":6,"92":6,"93":6,"94":6,"95":6,"96":6,"97":6,"98":6,"99":6,"100":4,"101":4,"102":6,"103":6,"104":6,"105":6,"106":6,"107":6,"108":6,"109":6,"110":6,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":4,"119":4,"120":4,"121":4,"122":4,"123":4,"124":4,"125":4,"126":4,"127":4,"128":4,"129":4,"130":4,"131":8,"132":8}}],["client",{"2":{"582":2,"583":2,"584":2,"586":4,"587":4,"588":4,"589":4,"590":4}}],["clearfile",{"0":{"451":1},"2":{"449":1,"451":4}}],["clear",{"0":{"221":1,"236":1,"259":1,"297":1,"308":1,"320":1,"370":1,"379":1},"2":{"204":1,"205":1,"221":4,"222":2,"236":4,"237":2,"241":1,"259":4,"282":1,"283":1,"284":1,"297":4,"308":4,"320":4,"359":1,"360":1,"370":4,"379":4}}],["clonelist",{"2":{"260":4}}],["clone",{"0":{"260":1,"345":1},"2":{"241":1,"260":4,"333":1,"345":4}}],["cloned",{"2":{"81":8}}],["close",{"2":{"38":4,"43":2,"45":2,"464":2,"473":2,"474":2,"475":2,"499":2,"711":2}}],["ctr算法模式加密",{"2":{"95":1,"106":1}}],["ctx",{"2":{"38":6,"39":10,"40":6,"41":8,"42":8,"44":10,"45":6,"46":10,"625":6}}],["cbc算法模式解密数据",{"2":{"94":1,"105":1}}],["cbc算法模式加密数据",{"2":{"93":1,"104":1}}],["cpu",{"2":{"82":10}}],["child",{"2":{"747":4}}],["chunk",{"0":{"639":1},"2":{"633":1,"639":12}}],["chars",{"2":{"882":1}}],["charset=utf",{"2":{"457":4}}],["charactermask",{"2":{"789":3,"790":2}}],["char",{"2":{"758":2,"759":2,"760":2,"761":2}}],["change",{"2":{"530":2,"531":2,"532":2}}],["chan",{"2":{"38":16,"39":6,"40":2,"41":2,"42":2,"43":8,"44":4,"45":6,"46":6,"70":2,"82":2,"499":3,"711":4}}],["chanstream",{"2":{"38":2}}],["channels",{"2":{"39":8,"43":2}}],["channel",{"0":{"34":1,"36":1},"2":{"30":1,"31":1,"37":4,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":4,"45":2,"46":2}}],["checker",{"2":{"340":2}}],["ch",{"2":{"70":8,"711":8}}],["ch2",{"2":{"46":4}}],["ch1",{"2":{"46":4}}],["chs",{"2":{"39":4}}],["cause",{"2":{"893":2,"894":2,"896":2,"903":6}}],["camelcase",{"0":{"762":1},"2":{"756":1,"762":4}}],["case形式",{"2":{"773":1,"774":1}}],["case",{"2":{"521":6,"763":1,"764":1}}],["cases",{"2":{"67":6,"81":4}}],["capitalize",{"0":{"765":1},"2":{"756":1,"765":4}}],["cap",{"0":{"263":1},"2":{"241":1,"263":4}}],["capacity",{"2":{"17":2,"179":2,"288":2,"311":2,"323":2}}],["can",{"2":{"81":2}}],["cancel",{"2":{"38":4,"39":4,"40":4,"41":4,"42":4,"44":4,"45":4,"46":4,"620":1,"625":4}}],["cache",{"2":{"2":1,"17":16}}],["c",{"2":{"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"26":2,"28":2,"37":2,"38":6,"39":10,"40":6,"41":8,"42":8,"43":12,"44":10,"45":6,"46":10,"69":2,"73":4,"78":4,"142":2,"144":2,"147":2,"149":2,"151":2,"153":2,"155":2,"157":2,"159":2,"161":2,"163":2,"165":2,"167":2,"169":2,"171":2,"184":2,"185":4,"186":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"482":4,"508":2,"509":2,"510":2,"511":4,"512":4,"513":4,"514":4,"515":6,"516":2,"517":2,"518":4,"519":4,"521":8,"522":4,"523":2,"524":4,"525":4,"526":4,"527":2,"528":2,"572":2,"603":4,"604":4,"605":4,"635":4,"636":2,"637":2,"638":4,"639":12,"641":4,"647":12,"648":14,"649":12,"660":4,"661":4,"667":6,"669":20,"670":2,"671":2,"676":4,"680":12,"681":4,"688":6,"689":4,"690":4,"692":6,"694":4,"700":18,"775":16,"779":4,"780":2,"782":2,"783":2,"790":6,"818":12,"819":4,"820":8,"821":6,"822":12,"823":4,"824":8,"825":6,"826":12,"827":4,"828":8,"829":6,"830":12,"831":4,"832":8,"833":6,"834":12,"835":4,"836":8,"837":6,"838":16,"839":8,"840":12,"841":10,"842":16,"843":8,"844":12,"845":10,"846":16,"847":8,"848":12,"849":10}}],["cos",{"0":{"562":1},"2":{"540":1,"562":12}}],["countby",{"0":{"643":1},"2":{"633":1,"643":4}}],["countrycode",{"2":{"577":4}}],["country",{"2":{"577":4}}],["count++",{"2":{"497":2,"499":2}}],["count",{"0":{"642":1,"733":1},"2":{"497":6,"499":4,"529":2,"554":2,"633":1,"642":6,"707":1,"733":6}}],["countsort",{"0":{"13":1},"2":{"4":1,"13":4}}],["copy",{"2":{"454":2}}],["copyfile",{"0":{"454":1},"2":{"449":1,"454":4}}],["copyonwritelisttype",{"2":{"138":1}}],["copyonwritelist",{"0":{"133":1},"1":{"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1},"2":{"133":1,"134":1,"138":4,"140":3,"142":2,"144":2,"147":2,"149":2,"151":2,"153":3,"155":2,"157":2,"159":2,"161":2,"163":2,"165":2,"167":2,"169":2,"171":2}}],["copyproperties",{"0":{"82":1},"2":{"63":1,"82":4}}],["code",{"2":{"74":8}}],["colorhex",{"2":{"65":6,"66":4}}],["colorhextorgb",{"0":{"65":1},"2":{"63":1,"65":4}}],["colorrgbtohex",{"0":{"66":1},"2":{"63":1,"66":4}}],["common包和lodash",{"2":{"910":1}}],["command",{"2":{"795":1,"807":4}}],["comma",{"0":{"481":1},"2":{"479":1,"481":8}}],["compact",{"0":{"640":1},"2":{"633":1,"640":10}}],["comparable",{"2":{"17":2,"74":2,"78":2,"275":2,"335":4,"336":2,"508":2,"509":2,"510":2,"511":4,"512":2,"513":2,"514":4,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":4,"523":2,"524":4,"525":4,"526":4,"527":2,"528":2,"529":2,"635":2,"636":2,"638":2,"640":2,"642":2,"644":2,"645":2,"653":2,"665":2,"668":2,"670":2,"671":2,"680":2,"681":2,"693":2,"696":2,"697":2,"698":2,"699":2,"701":2,"702":2}}],["comparator",{"2":{"6":9,"7":11,"8":9,"9":9,"10":9,"11":9,"12":9,"13":9,"14":11,"15":11,"193":6,"323":6,"325":4,"326":4,"327":4,"328":4,"329":4,"387":1,"388":6,"547":2,"549":2,"646":2,"654":2}}],["comparedenv",{"2":{"806":2}}],["comparedslice",{"2":{"644":2,"645":2,"646":2}}],["comparedset",{"2":{"353":2}}],["compareosenv",{"0":{"806":1},"2":{"798":1,"806":4}}],["compare包提供几个轻量级的类型比较函数",{"2":{"18":1}}],["compare",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1},"2":{"0":1,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"19":4,"23":16,"24":10,"25":14,"26":16,"27":14,"28":16,"29":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"325":2,"326":2,"327":2,"328":2,"329":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2}}],["completed",{"2":{"583":4,"584":4,"585":2,"591":4}}],["compressed",{"2":{"582":2}}],["compose",{"0":{"496":1},"2":{"491":1,"496":4}}],["com",{"2":{"2":3,"3":2,"6":2,"7":4,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"16":2,"17":2,"19":2,"20":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"29":2,"31":1,"32":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"48":1,"49":2,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"61":1,"62":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":2,"71":2,"72":2,"73":2,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":4,"85":2,"87":2,"88":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":2,"121":2,"122":2,"123":2,"124":2,"125":2,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"134":1,"135":2,"139":2,"141":2,"143":2,"145":2,"148":2,"150":2,"152":2,"154":2,"156":2,"158":2,"160":2,"162":2,"164":2,"166":2,"168":2,"170":2,"172":2,"174":1,"175":2,"178":2,"179":2,"180":2,"181":2,"182":2,"183":2,"184":2,"185":2,"186":2,"188":1,"189":2,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"201":2,"202":2,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":2,"224":2,"225":2,"226":2,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":2,"235":2,"236":2,"237":2,"239":1,"240":2,"243":2,"244":2,"245":2,"246":2,"247":2,"248":2,"249":2,"250":2,"251":2,"252":2,"253":2,"254":2,"255":2,"256":2,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2,"275":2,"276":2,"277":2,"279":4,"280":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2,"300":2,"301":2,"302":2,"303":2,"304":2,"305":2,"306":2,"307":2,"308":2,"309":2,"311":2,"312":2,"313":2,"314":2,"315":2,"316":2,"317":2,"318":2,"319":2,"320":2,"321":2,"323":2,"324":2,"325":2,"326":2,"327":2,"328":2,"329":2,"331":1,"332":2,"335":2,"336":2,"337":2,"338":2,"339":2,"340":2,"341":2,"342":2,"343":2,"344":2,"345":2,"346":2,"347":2,"348":2,"349":2,"350":2,"351":2,"352":2,"353":2,"354":2,"356":2,"357":2,"363":2,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2,"372":2,"373":2,"374":2,"375":2,"376":2,"377":2,"378":2,"379":2,"380":2,"382":1,"383":2,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"399":1,"400":2,"404":2,"405":2,"406":2,"407":2,"408":2,"409":2,"410":2,"411":2,"412":2,"413":2,"414":2,"415":2,"416":2,"417":2,"418":2,"419":2,"420":2,"421":2,"422":2,"423":2,"424":2,"425":2,"426":2,"427":2,"428":2,"429":2,"430":2,"431":2,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":2,"439":2,"440":2,"441":2,"442":2,"443":2,"444":2,"445":2,"447":1,"448":2,"451":2,"452":2,"453":2,"454":2,"455":2,"456":2,"457":2,"458":2,"459":2,"460":2,"461":2,"462":2,"463":2,"464":2,"465":2,"466":2,"467":2,"468":2,"469":2,"470":2,"471":2,"472":2,"473":2,"474":2,"475":2,"477":2,"478":2,"481":2,"482":2,"483":2,"484":2,"485":2,"486":2,"487":2,"489":2,"490":2,"493":2,"494":2,"495":2,"496":2,"497":2,"498":2,"499":2,"500":2,"501":2,"503":1,"504":2,"507":2,"508":2,"509":2,"510":2,"511":2,"512":2,"513":2,"514":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":2,"521":2,"522":2,"523":2,"524":2,"525":2,"526":2,"527":2,"528":2,"529":2,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2,"538":1,"539":2,"542":2,"543":2,"544":2,"545":2,"546":2,"547":2,"548":2,"549":2,"550":2,"551":2,"552":2,"553":2,"554":2,"555":2,"556":2,"557":2,"558":2,"559":2,"560":2,"561":2,"562":2,"563":2,"564":2,"565":2,"566":2,"568":2,"569":2,"572":2,"573":6,"574":2,"575":2,"576":2,"577":2,"578":2,"579":2,"580":2,"581":4,"582":2,"583":4,"584":4,"585":2,"586":4,"587":4,"588":4,"589":4,"590":4,"591":4,"592":4,"593":4,"594":6,"595":6,"597":1,"598":2,"601":2,"602":2,"603":2,"604":2,"605":2,"607":1,"608":2,"611":2,"612":2,"613":2,"614":2,"615":2,"616":2,"617":2,"618":2,"619":2,"621":1,"622":2,"626":2,"627":2,"628":2,"629":2,"631":1,"632":2,"635":2,"636":2,"637":2,"638":2,"639":2,"640":2,"641":2,"642":2,"643":2,"644":2,"645":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":2,"653":2,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":2,"661":2,"662":2,"663":2,"664":2,"665":2,"666":2,"667":2,"668":2,"669":2,"670":2,"671":2,"672":2,"673":2,"674":2,"675":2,"676":2,"677":2,"678":2,"679":2,"680":2,"681":2,"682":2,"683":2,"684":2,"685":2,"686":2,"687":2,"688":2,"689":2,"690":2,"691":2,"692":2,"693":2,"694":2,"695":2,"696":2,"697":2,"698":2,"699":2,"700":2,"701":2,"702":2,"703":2,"705":1,"706":2,"709":2,"710":2,"711":2,"712":2,"713":2,"714":2,"715":2,"716":2,"717":2,"718":2,"719":2,"720":2,"721":2,"722":2,"723":2,"724":2,"725":2,"726":2,"727":2,"728":2,"729":2,"730":2,"731":2,"732":2,"733":2,"734":2,"736":2,"737":2,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"754":1,"755":2,"758":2,"759":2,"760":2,"761":2,"762":2,"763":2,"764":2,"765":2,"766":2,"767":2,"768":2,"769":2,"770":2,"771":2,"772":2,"773":2,"774":2,"775":2,"776":2,"777":2,"778":2,"779":2,"780":2,"781":2,"782":2,"783":2,"784":2,"785":2,"786":2,"787":2,"788":2,"789":2,"790":2,"791":2,"792":2,"793":2,"794":2,"796":1,"797":2,"800":2,"801":2,"802":2,"803":2,"804":2,"805":2,"806":2,"807":2,"808":2,"810":1,"811":2,"814":2,"815":2,"816":2,"817":2,"818":2,"819":2,"820":2,"821":2,"822":2,"823":2,"824":2,"825":2,"826":2,"827":2,"828":2,"829":2,"830":2,"831":2,"832":2,"833":2,"834":2,"835":2,"836":2,"837":2,"838":2,"839":2,"840":2,"841":2,"842":2,"843":2,"844":2,"845":2,"846":2,"847":2,"848":2,"849":2,"851":1,"852":2,"855":2,"856":2,"857":2,"858":2,"859":2,"860":2,"861":2,"862":2,"863":2,"864":2,"865":2,"866":2,"867":2,"868":8,"869":6,"870":2,"871":2,"872":2,"873":2,"874":2,"875":2,"876":2,"877":2,"878":2,"879":2,"880":2,"881":2,"882":2,"883":6,"884":2,"885":2,"886":2,"887":2,"889":1,"890":2,"893":2,"894":2,"895":4,"896":2,"897":3,"898":2,"899":2,"900":2,"901":2,"902":2,"903":2,"904":2,"905":2,"906":4,"907":2,"908":2}}],["concat",{"0":{"641":1,"714":1},"2":{"633":1,"641":6,"707":1,"714":4}}],["concurrentmap协程安全的map结构",{"2":{"529":1}}],["concurrentmap",{"0":{"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1},"2":{"505":7,"529":6,"530":2,"531":2,"532":2,"533":2,"534":2,"535":2,"536":2}}],["concurrency",{"0":{"30":1},"1":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1},"2":{"0":1,"31":1,"32":2,"37":4,"38":4,"39":4,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":4}}],["config",{"2":{"582":8}}],["convertmaptoquerystring",{"0":{"572":1},"2":{"570":1,"572":4}}],["convertor",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1},"2":{"0":1,"60":1,"61":2,"62":2,"65":4,"66":2,"67":4,"68":4,"69":8,"70":4,"71":14,"72":12,"73":2,"74":4,"75":4,"76":16,"77":4,"78":2,"79":4,"80":4,"81":4,"82":4,"83":4,"84":4,"85":6}}],["consumer",{"2":{"273":2,"718":2}}],["constraints",{"2":{"7":2,"29":4,"481":4,"542":4,"546":4,"548":4,"554":4,"555":4,"560":2,"561":2,"565":4,"566":4,"684":2,"685":2,"686":2,"687":2,"688":2,"712":4}}],["contents",{"2":{"464":4}}],["content",{"2":{"463":4,"472":4,"473":4,"474":6,"475":6,"581":2,"586":2,"587":2,"588":2,"590":2,"591":2}}],["context",{"0":{"625":1},"2":{"38":10,"39":10,"40":10,"41":10,"42":10,"43":2,"44":10,"45":10,"46":10,"620":1,"623":1,"625":14}}],["containfile",{"2":{"902":4}}],["containupper",{"0":{"858":1},"2":{"853":1,"858":8}}],["containlower",{"0":{"857":1},"2":{"853":1,"857":8}}],["containletter",{"0":{"856":1},"2":{"853":1,"856":8}}],["containchinese",{"0":{"855":1},"2":{"853":1,"855":8}}],["containby",{"0":{"637":1},"2":{"633":1,"637":10}}],["containall",{"0":{"343":1},"2":{"333":1,"343":6,"345":2}}],["containsany",{"0":{"793":1},"2":{"756":1,"793":8}}],["containsall",{"0":{"792":1},"2":{"756":1,"792":6}}],["containsubslice",{"0":{"638":1},"2":{"633":1,"638":6}}],["contains",{"0":{"183":1},"2":{"176":1,"183":6,"902":2}}],["contain",{"0":{"153":1,"244":1,"298":1,"309":1,"321":1,"342":1,"636":1},"1":{"154":1},"2":{"136":1,"153":2,"154":2,"241":1,"244":6,"282":1,"283":1,"284":1,"298":6,"309":6,"321":6,"333":1,"342":6,"633":1,"636":6}}],["conditionfalse",{"2":{"59":4}}],["conditiontrue",{"2":{"59":4}}],["condition包含一些用于条件判断的函数",{"2":{"47":1}}],["condition",{"0":{"47":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1},"2":{"0":1,"20":2,"48":2,"49":2,"52":20,"53":10,"54":10,"55":10,"56":10,"57":10,"58":10,"59":6}}],["atoi",{"2":{"905":6}}],["alpha",{"2":{"882":1}}],["allmatch",{"0":{"730":1},"2":{"707":1,"730":6}}],["algorithm",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1},"2":{"0":1,"1":1,"2":3,"3":2,"6":4,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":6,"15":6,"16":6,"17":4}}],["assert",{"2":{"807":2}}],["asc",{"2":{"688":1,"690":1}}],["ascending",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2}}],["as",{"2":{"577":4}}],["a=1",{"2":{"572":2,"573":4}}],["a==",{"2":{"118":2}}],["accumulator",{"2":{"725":2}}],["action",{"2":{"724":2}}],["actual",{"2":{"532":2,"534":2}}],["ac",{"2":{"549":2,"788":4}}],["avg",{"2":{"542":4}}],["average",{"0":{"542":1},"2":{"540":1,"542":6}}],["a1",{"2":{"523":2}}],["are",{"2":{"640":1}}],["args",{"2":{"493":2,"494":2,"498":2,"499":2,"893":2}}],["arrs",{"2":{"660":4,"661":4}}],["arr",{"2":{"347":8,"639":12,"752":6}}],["array2",{"2":{"637":6}}],["array1",{"2":{"637":6}}],["arraystack",{"0":{"359":1,"362":1},"2":{"356":1,"363":4,"364":2,"365":2,"366":2,"367":2,"368":2,"369":2,"370":2}}],["arrayqueue",{"0":{"282":1,"287":1},"2":{"279":1,"288":4,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":2,"297":2,"298":2}}],["array",{"2":{"70":2,"74":2}}],["aage",{"2":{"483":4}}],["aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35",{"2":{"471":2}}],["aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d",{"2":{"124":2}}],["ab1",{"2":{"856":2,"859":2,"860":2,"861":2,"878":2}}],["abd",{"2":{"547":4}}],["ab",{"2":{"547":4,"549":6,"687":6,"702":4,"788":4,"789":6}}],["abs",{"0":{"566":1},"2":{"540":1,"566":8}}],["abspath",{"2":{"453":2,"455":4}}],["abc123",{"2":{"884":2}}],["abcabc123",{"2":{"882":2}}],["abcabc",{"2":{"882":2,"884":2}}],["abcd",{"2":{"789":2}}],["abcde",{"2":{"496":4,"776":10}}],["abcdefgh",{"2":{"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2}}],["abcdefghijklmnop",{"2":{"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2}}],["abc",{"2":{"67":2,"68":2,"69":2,"71":2,"72":2,"79":2,"80":2,"83":4,"547":6,"549":4,"601":4,"602":4,"604":6,"605":4,"687":6,"702":4,"782":2,"783":2,"792":2,"793":4,"803":4,"804":4,"805":4,"806":4,"807":2,"857":6,"858":6,"859":2,"860":4,"861":4,"862":2,"868":4,"869":2,"874":2,"875":2,"876":2,"877":2,"878":2,"883":6,"885":2,"887":2}}],["agg",{"2":{"678":10,"679":6}}],["agvsbg8=",{"2":{"100":2,"101":2,"863":2}}],["age",{"2":{"7":22,"77":2,"483":4,"507":6,"689":14,"690":10,"747":6,"748":6,"749":6,"750":8,"751":6}}],["aesofbdecrypt",{"0":{"99":1},"2":{"89":1,"99":2}}],["aesofbencrypt",{"0":{"98":1},"2":{"89":1,"98":4,"99":2}}],["aescfbdecrypt",{"0":{"97":1},"2":{"89":1,"96":2,"97":4,"98":2,"99":2}}],["aescfbencrypt",{"0":{"96":1},"2":{"89":1,"96":4,"97":2}}],["aesctrcrypt",{"0":{"95":1},"2":{"89":1,"95":6}}],["aescbcdecrypt",{"0":{"94":1},"2":{"89":1,"93":2,"94":4}}],["aescbcencrypt",{"0":{"93":1},"2":{"89":1,"93":4,"94":2}}],["aesecbdecrypt",{"0":{"92":1},"2":{"89":1,"91":2,"92":4}}],["aesecbencrypt",{"0":{"91":1},"2":{"89":1,"91":4,"92":2}}],["aes",{"2":{"86":1}}],["am",{"2":{"779":4,"780":2}}],["amap",{"2":{"73":4,"78":6,"528":2}}],["amp",{"2":{"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":2,"14":2,"15":2,"80":2,"81":8,"82":4,"193":2,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"222":6,"325":2,"326":2,"327":2,"328":2,"329":2,"380":6,"388":2,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":4,"397":2,"429":2,"430":2,"431":2,"432":2,"483":2,"507":2,"572":4,"573":4,"578":2,"581":2,"582":2,"583":4,"584":4,"591":2,"594":6,"602":4,"603":6,"604":4,"605":4,"637":8,"695":4,"740":2,"741":2,"742":2,"743":2,"744":2,"745":2,"746":2,"747":2,"748":2,"749":2,"750":2,"751":2,"752":2,"762":4,"763":2,"764":2,"773":2,"774":2,"856":4}}],["a和b不相同返回true",{"2":{"55":1}}],["a和b相同返回false",{"2":{"55":1}}],["apache",{"2":{"910":1}}],["application",{"2":{"586":2,"587":2,"588":2,"590":2,"591":2}}],["appendifabsent",{"0":{"635":1},"2":{"633":1,"635":6}}],["append",{"2":{"52":2,"273":2,"274":2,"347":2,"473":2,"475":2,"501":2,"662":2,"718":2}}],["apiurl",{"2":{"587":2}}],["api文档",{"0":{"191":1},"1":{"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1}}],["api",{"0":{"177":1,"506":1,"739":1},"1":{"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"507":1,"508":1,"509":1,"510":1,"511":1,"512":1,"513":1,"514":1,"515":1,"516":1,"517":1,"518":1,"519":1,"520":1,"521":1,"522":1,"523":1,"524":1,"525":1,"526":1,"527":1,"528":1,"529":1,"530":1,"531":1,"532":1,"533":1,"534":1,"535":1,"536":1,"740":1,"741":1,"742":1,"743":1,"744":1,"745":1,"746":1,"747":1,"748":1,"749":1,"750":1,"751":1,"752":1}}],["api概述",{"0":{"0":1}}],["angle",{"2":{"556":2}}],["angletoradian",{"0":{"556":1},"2":{"540":1,"556":8}}],["and",{"0":{"53":1},"2":{"50":1,"53":10,"278":1}}],["anymatch",{"0":{"731":1},"2":{"707":1,"731":6}}],["anyfunc",{"2":{"180":1,"181":1,"185":1,"186":1,"603":1,"660":1,"661":1,"667":1,"746":1,"901":1}}],["any",{"2":{"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":2,"17":2,"23":2,"24":2,"25":2,"26":2,"27":2,"28":2,"37":4,"43":6,"52":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"59":2,"68":2,"70":2,"71":2,"72":2,"73":2,"74":4,"75":2,"76":2,"77":4,"78":4,"79":2,"80":2,"81":2,"82":2,"138":2,"180":3,"181":5,"182":2,"183":2,"184":4,"185":1,"186":1,"193":6,"194":2,"195":2,"196":2,"197":2,"198":2,"199":2,"208":6,"224":6,"243":4,"275":4,"288":4,"300":6,"311":4,"323":4,"325":2,"326":2,"327":2,"328":2,"329":2,"363":4,"372":6,"388":8,"389":2,"390":2,"391":2,"392":2,"393":2,"394":2,"395":2,"396":2,"397":2,"457":2,"482":2,"483":2,"493":4,"494":4,"495":2,"496":2,"498":4,"499":4,"500":2,"507":4,"508":2,"509":2,"510":2,"512":2,"513":2,"515":2,"516":2,"517":2,"518":2,"519":2,"520":4,"521":4,"522":2,"523":4,"524":4,"525":4,"526":4,"527":2,"528":2,"529":2,"547":2,"549":2,"572":4,"584":2,"585":2,"586":2,"587":2,"588":2,"589":2,"590":2,"591":2,"601":2,"602":2,"603":3,"604":2,"605":2,"637":2,"639":2,"641":2,"643":2,"646":2,"647":2,"648":2,"649":2,"650":2,"651":2,"652":3,"654":2,"655":2,"656":2,"657":2,"658":2,"659":2,"660":3,"661":3,"662":2,"663":2,"664":2,"665":2,"666":2,"667":3,"669":4,"672":4,"673":4,"674":4,"675":2,"676":2,"677":2,"678":4,"679":4,"682":2,"683":2,"687":2,"689":2,"690":2,"691":2,"692":2,"694":2,"695":2,"699":2,"700":2,"702":2,"703":2,"709":2,"710":2,"711":2,"713":2,"714":2,"740":2,"741":7,"746":1,"766":2,"814":8,"816":4,"817":4,"818":12,"820":6,"821":6,"822":16,"824":8,"825":8,"826":20,"828":10,"829":10,"830":24,"832":12,"833":12,"834":28,"836":14,"837":14,"838":32,"840":16,"841":16,"842":36,"844":18,"845":18,"846":40,"848":20,"849":20,"871":2,"872":2,"873":2,"885":2,"893":4,"894":2,"898":2,"901":1,"905":2}}],["afterlast",{"0":{"759":1},"2":{"756":1,"759":12}}],["after1year",{"2":{"407":4}}],["after2minutes",{"2":{"406":4}}],["after2hours",{"2":{"405":4}}],["after",{"0":{"493":1,"758":1},"2":{"43":6,"491":1,"493":4,"627":2,"756":1,"758":12}}],["address",{"2":{"507":8}}],["addr",{"2":{"507":2}}],["addone",{"2":{"500":4,"645":4,"662":4,"672":4,"717":4}}],["add1",{"2":{"495":4}}],["addcurry",{"2":{"495":4}}],["addyear",{"0":{"407":1},"2":{"401":1,"407":6}}],["addminute",{"0":{"406":1},"2":{"401":1,"406":6}}],["addhour",{"0":{"405":1},"2":{"401":1,"405":6}}],["addday",{"0":{"404":1},"2":{"401":1,"404":6,"438":4}}],["addifnotexistby",{"0":{"340":1},"2":{"333":1,"340":6}}],["addifnotexist",{"0":{"339":1},"2":{"333":1,"339":6}}],["addbyindex",{"0":{"161":1},"1":{"162":1},"2":{"136":1,"161":2,"162":2}}],["addall",{"0":{"159":1},"1":{"160":1},"2":{"136":1,"159":2,"160":2}}],["add",{"0":{"157":1,"338":1},"1":{"158":1},"2":{"25":2,"26":2,"27":2,"28":2,"136":1,"157":2,"158":2,"333":1,"338":4,"339":2,"340":2,"341":2,"342":2,"354":6,"495":4,"497":4,"530":4,"531":4,"532":2,"533":4,"534":4,"535":4,"536":2,"581":6,"587":4}}],["a",{"2":{"7":4,"16":6,"23":4,"25":2,"26":2,"27":2,"53":2,"54":2,"55":2,"56":2,"57":2,"58":2,"69":2,"73":4,"78":4,"81":4,"121":2,"180":2,"181":4,"182":8,"183":4,"184":2,"185":4,"186":2,"249":8,"250":8,"277":4,"453":6,"482":8,"495":4,"508":2,"509":2,"510":6,"511":2,"512":4,"513":4,"514":4,"515":12,"516":4,"517":2,"518":4,"519":8,"520":4,"521":8,"522":4,"523":2,"524":4,"525":4,"526":4,"527":4,"528":4,"529":4,"547":2,"549":4,"572":2,"593":2,"602":4,"603":4,"604":2,"605":2,"613":1,"635":8,"636":4,"637":14,"638":8,"639":12,"640":4,"641":4,"647":8,"648":12,"649":14,"654":4,"660":4,"661":4,"667":6,"669":20,"670":6,"671":6,"676":4,"680":20,"681":6,"682":8,"687":6,"688":6,"689":14,"690":4,"692":6,"694":4,"695":2,"696":6,"700":18,"702":4,"714":2,"723":6,"725":6,"728":7,"729":7,"747":4,"748":4,"749":4,"750":4,"751":4,"752":4,"766":4,"775":16,"779":12,"780":6,"782":2,"783":2,"788":2,"790":6,"807":1,"814":12,"815":4,"816":8,"817":6,"818":16,"819":8,"820":12,"821":10,"822":16,"823":8,"824":12,"825":10,"826":16,"827":8,"828":12,"829":10,"830":16,"831":8,"832":12,"833":10,"834":16,"835":8,"836":12,"837":10,"838":16,"839":8,"840":12,"841":10,"842":20,"843":12,"844":12,"845":10,"846":28,"847":20,"848":12,"849":10,"868":2,"869":2,"878":4}}],["日期时间处理包",{"2":{"398":1}}],["日期",{"2":{"0":1}}],["时间",{"2":{"0":1}}],["网络包支持获取",{"2":{"567":1}}],["网络",{"2":{"0":1,"911":1}}],["超过600个工具函数",{"2":{"0":1}}],["高效",{"2":{"0":1,"910":1}}],["全面",{"2":{"0":1,"910":1}}],["柳叶刀",{"2":{"0":1,"910":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.2bf1f725.js b/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.2bf1f725.js new file mode 100644 index 0000000..51c7396 --- /dev/null +++ b/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.2bf1f725.js @@ -0,0 +1,7 @@ +import{$ as Ve,h as ie,z as $e,d as Dt,D as de,g as _e,A as Ot,j as De,E as he,aj as Rt,ak as Mt,o as X,b as Pt,k as A,a3 as Lt,l as W,al as zt,am as Bt,C as Vt,c as te,n as rt,e as we,M as at,L as nt,a as ve,t as pe,an as $t,p as jt,m as Wt,ao as it,ap as Kt,a8 as Jt,ae as Ut,_ as Ht}from"./framework.6e839c56.js";import{u as Gt,a as qt,b as Qt,c as ot,d as Yt,e as Zt,w as Xt,o as xe,f as er,g as tr,h as rr}from"./theme.4451c782.js";const ar={root:()=>Ve(()=>import("./@localSearchIndexroot.84da4c78.js"),[]),en:()=>Ve(()=>import("./@localSearchIndexen.3dcccaf9.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var gt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Se=gt.join(","),bt=typeof Element>"u",se=bt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ae=!bt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ce=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},nr=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},wt=function(e,t,r){if(Ce(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Se));return t&&se.call(e,Se)&&n.unshift(e),n=n.filter(r),n},xt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ce(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),l=s.length?s:i.children,u=o(l,!0,r);r.flatten?n.push.apply(n,u):n.push({scopeParent:i,candidates:u})}else{var d=se.call(i,Se);d&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ce(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var p=o(h===!0?i.children:h.children,!0,r);r.flatten?n.push.apply(n,p):n.push({scopeParent:i,candidates:p})}else a.unshift.apply(a,i.children)}}return n},Ft=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},oe=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||nr(e))&&!Ft(e)?0:e.tabIndex},ir=function(e,t){var r=oe(e);return r<0&&t&&!Ft(e)?0:r},or=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},Et=function(e){return e.tagName==="INPUT"},sr=function(e){return Et(e)&&e.type==="hidden"},lr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},ur=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(se.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var l=e.parentElement,u=Ae(e);if(l&&!l.shadowRoot&&n(l)===!0)return st(e);e.assignedSlot?e=e.assignedSlot:!l&&u!==e.ownerDocument?e=u.host:e=l}e=s}if(hr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return st(e);return!1},pr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},mr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,l=ir(s,i),u=i?o(n.candidates):s;l===0?i?t.push.apply(t,u):t.push(s):r.push({documentOrder:a,tabIndex:l,item:n,isScope:i,content:u})}),r.sort(or).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},gr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=xt([e],t.includeContainer,{filter:je.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:yr}):r=wt(e,t.includeContainer,je.bind(null,t)),mr(r)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=xt([e],t.includeContainer,{filter:Ne.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=wt(e,t.includeContainer,Ne.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,Se)===!1?!1:je(t,e)},wr=gt.concat("iframe").join(","),Oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,wr)===!1?!1:Ne(t,e)};/*! +* focus-trap 7.5.2 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function lt(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function ut(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},Sr=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Ar=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ge=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Cr=function(e){return ge(e)&&!e.shiftKey},Nr=function(e){return ge(e)&&e.shiftKey},ft=function(e){return setTimeout(e,0)},dt=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},ye=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?y-1:0),I=1;I=0)f=r.activeElement;else{var c=i.tabbableGroups[0],y=c&&c.firstTabbableNode;f=y||d("fallbackFocus")}if(!f)throw new Error("Your focus-trap needs to have at least one focusable element");return f},v=function(){if(i.containerGroups=i.containers.map(function(f){var c=gr(f,a.tabbableOptions),y=br(f,a.tabbableOptions),x=c.length>0?c[0]:void 0,I=c.length>0?c[c.length-1]:void 0,O=y.find(function(m){return le(m)}),P=y.slice().reverse().find(function(m){return le(m)}),z=!!c.find(function(m){return oe(m)>0});return{container:f,tabbableNodes:c,focusableNodes:y,posTabIndexesFound:z,firstTabbableNode:x,lastTabbableNode:I,firstDomTabbableNode:O,lastDomTabbableNode:P,nextTabbableNode:function(N){var $=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,J=c.indexOf(N);return J<0?$?y.slice(y.indexOf(N)+1).find(function(H){return le(H)}):y.slice(0,y.indexOf(N)).reverse().find(function(H){return le(H)}):c[J+($?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(f){return f.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!d("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(f){return f.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},p=function F(f){if(f!==!1&&f!==r.activeElement){if(!f||!f.focus){F(h());return}f.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=f,Sr(f)&&f.select()}},b=function(f){var c=d("setReturnFocus",f);return c||(c===!1?!1:f)},g=function(f){var c=f.target,y=f.event,x=f.isBackward,I=x===void 0?!1:x;c=c||Fe(y),v();var O=null;if(i.tabbableGroups.length>0){var P=u(c,y),z=P>=0?i.containerGroups[P]:void 0;if(P<0)I?O=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:O=i.tabbableGroups[0].firstTabbableNode;else if(I){var m=dt(i.tabbableGroups,function(B){var U=B.firstTabbableNode;return c===U});if(m<0&&(z.container===c||Oe(c,a.tabbableOptions)&&!le(c,a.tabbableOptions)&&!z.nextTabbableNode(c,!1))&&(m=P),m>=0){var N=m===0?i.tabbableGroups.length-1:m-1,$=i.tabbableGroups[N];O=oe(c)>=0?$.lastTabbableNode:$.lastDomTabbableNode}else ge(y)||(O=z.nextTabbableNode(c,!1))}else{var J=dt(i.tabbableGroups,function(B){var U=B.lastTabbableNode;return c===U});if(J<0&&(z.container===c||Oe(c,a.tabbableOptions)&&!le(c,a.tabbableOptions)&&!z.nextTabbableNode(c))&&(J=P),J>=0){var H=J===i.tabbableGroups.length-1?0:J+1,G=i.tabbableGroups[H];O=oe(c)>=0?G.firstTabbableNode:G.firstDomTabbableNode}else ge(y)||(O=z.nextTabbableNode(c))}}else O=d("fallbackFocus");return O},w=function(f){var c=Fe(f);if(!(u(c,f)>=0)){if(ye(a.clickOutsideDeactivates,f)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}ye(a.allowOutsideClick,f)||f.preventDefault()}},C=function(f){var c=Fe(f),y=u(c,f)>=0;if(y||c instanceof Document)y&&(i.mostRecentlyFocusedNode=c);else{f.stopImmediatePropagation();var x,I=!0;if(i.mostRecentlyFocusedNode)if(oe(i.mostRecentlyFocusedNode)>0){var O=u(i.mostRecentlyFocusedNode),P=i.containerGroups[O].tabbableNodes;if(P.length>0){var z=P.findIndex(function(m){return m===i.mostRecentlyFocusedNode});z>=0&&(a.isKeyForward(i.recentNavEvent)?z+1=0&&(x=P[z-1],I=!1))}}else i.containerGroups.some(function(m){return m.tabbableNodes.some(function(N){return oe(N)>0})})||(I=!1);else I=!1;I&&(x=g({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),p(x||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},T=function(f){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=f;var y=g({event:f,isBackward:c});y&&(ge(f)&&f.preventDefault(),p(y))},E=function(f){if(Ar(f)&&ye(a.escapeDeactivates,f)!==!1){f.preventDefault(),s.deactivate();return}(a.isKeyForward(f)||a.isKeyBackward(f))&&T(f,a.isKeyBackward(f))},M=function(f){var c=Fe(f);u(c,f)>=0||ye(a.clickOutsideDeactivates,f)||ye(a.allowOutsideClick,f)||(f.preventDefault(),f.stopImmediatePropagation())},R=function(){if(i.active)return ct.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?ft(function(){p(h())}):p(h()),r.addEventListener("focusin",C,!0),r.addEventListener("mousedown",w,{capture:!0,passive:!1}),r.addEventListener("touchstart",w,{capture:!0,passive:!1}),r.addEventListener("click",M,{capture:!0,passive:!1}),r.addEventListener("keydown",E,{capture:!0,passive:!1}),s},L=function(){if(i.active)return r.removeEventListener("focusin",C,!0),r.removeEventListener("mousedown",w,!0),r.removeEventListener("touchstart",w,!0),r.removeEventListener("click",M,!0),r.removeEventListener("keydown",E,!0),s},S=function(f){var c=f.some(function(y){var x=Array.from(y.removedNodes);return x.some(function(I){return I===i.mostRecentlyFocusedNode})});c&&p(h())},k=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(S):void 0,D=function(){k&&(k.disconnect(),i.active&&!i.paused&&i.containers.map(function(f){k.observe(f,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(f){if(i.active)return this;var c=l(f,"onActivate"),y=l(f,"onPostActivate"),x=l(f,"checkCanFocusTrap");x||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,c==null||c();var I=function(){x&&v(),R(),D(),y==null||y()};return x?(x(i.containers.concat()).then(I,I),this):(I(),this)},deactivate:function(f){if(!i.active)return this;var c=ut({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},f);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,L(),i.active=!1,i.paused=!1,D(),ct.deactivateTrap(n,s);var y=l(c,"onDeactivate"),x=l(c,"onPostDeactivate"),I=l(c,"checkCanReturnFocus"),O=l(c,"returnFocus","returnFocusOnDeactivate");y==null||y();var P=function(){ft(function(){O&&p(b(i.nodeFocusedBeforeActivation)),x==null||x()})};return O&&I?(I(b(i.nodeFocusedBeforeActivation)).then(P,P),this):(P(),this)},pause:function(f){if(i.paused||!i.active)return this;var c=l(f,"onPause"),y=l(f,"onPostPause");return i.paused=!0,c==null||c(),L(),D(),y==null||y(),this},unpause:function(f){if(!i.paused||!i.active)return this;var c=l(f,"onUnpause"),y=l(f,"onPostUnpause");return i.paused=!1,c==null||c(),v(),R(),D(),y==null||y(),this},updateContainerElements:function(f){var c=[].concat(f).filter(Boolean);return i.containers=c.map(function(y){return typeof y=="string"?r.querySelector(y):y}),i.active&&v(),D(),this}},s.updateContainerElements(e),s},Ir=Object.defineProperty,_r=Object.defineProperties,Dr=Object.getOwnPropertyDescriptors,Te=Object.getOwnPropertySymbols,St=Object.prototype.hasOwnProperty,At=Object.prototype.propertyIsEnumerable,ht=(o,e,t)=>e in o?Ir(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,Or=(o,e)=>{for(var t in e||(e={}))St.call(e,t)&&ht(o,t,e[t]);if(Te)for(var t of Te(e))At.call(e,t)&&ht(o,t,e[t]);return o},Rr=(o,e)=>_r(o,Dr(e)),Mr=(o,e)=>{var t={};for(var r in o)St.call(o,r)&&e.indexOf(r)<0&&(t[r]=o[r]);if(o!=null&&Te)for(var r of Te(o))e.indexOf(r)<0&&At.call(o,r)&&(t[r]=o[r]);return t};function Pr(o,e={}){let t;const r=e,{immediate:n}=r,a=Mr(r,["immediate"]),i=ie(!1),s=ie(!1),l=v=>t&&t.activate(v),u=v=>t&&t.deactivate(v),d=()=>{t&&(t.pause(),s.value=!0)},h=()=>{t&&(t.unpause(),s.value=!1)};return $e(()=>Gt(o),v=>{v&&(t=kr(v,Rr(Or({},a),{onActivate(){i.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){i.value=!1,e.onDeactivate&&e.onDeactivate()}})),n&&l())},{flush:"post"}),qt(()=>u()),{hasFocus:i,isPaused:s,activate:l,deactivate:u,pause:d,unpause:h}}class ce{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const l=()=>{--i<=0&&n(s)};i||l(),a.forEach(u=>{ce.matches(u,this.exclude)?l():this.onIframeReady(u,d=>{t(u)&&(s++,r(d)),l()},l)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,l)=>{s.val===r&&(a=l,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],l=[],u,d,h=()=>({prevNode:d,node:u}=this.getIteratorNode(i),u);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(u,d,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,p=>l.push(p),n)}),l.push(u);l.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const l=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,l):l()})}}let Lr=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(l)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(l)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,l=parseInt(e.start,10)-s;return l=l>i?i:l,n=l+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||n-l<0||l>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(l,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const l=e.nodes[s+1];if(typeof l>"u"||l.start>t){if(!n(i.node))return!1;const u=t-i.start,d=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(d+i.start);if(i.node=this.wrapRangeInTextNode(i.node,u,d),e.value=h+v,e.nodes.forEach((p,b)=>{b>=s&&(e.nodes[b].start>0&&b!==s&&(e.nodes[b].start-=d),e.nodes[b].end-=d)}),r-=d,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(l=>{l=l.node;let u;for(;(u=e.exec(l.textContent))!==null&&u[i]!=="";){if(!r(u[i],l))continue;let d=u.index;if(i!==0)for(let h=1;h{let l;for(;(l=e.exec(s.value))!==null&&l[i]!=="";){let u=l.index;if(i!==0)for(let h=1;hr(l[i],h),(h,v)=>{e.lastIndex=v,n(h)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,l)=>{let{start:u,end:d,valid:h}=this.checkWhitespaceRanges(s,i,a.value);h&&this.wrapRangeInMappedTextNode(a,u,d,v=>t(v,s,a.value.substring(u,d),l),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",l=u=>{let d=new RegExp(this.createRegExp(u),`gm${s}`),h=0;this.log(`Searching with expression "${d}"`),this[n](d,1,(v,p)=>this.opt.filter(p,u,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(u),a[i-1]===u?this.opt.done(r):l(a[a.indexOf(u)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):l(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,l)=>this.opt.filter(a,i,s,l),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=ce.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function zr(o){const e=new Lr(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var V=function(){return V=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(u[0]===6||u[0]===2)){t=0;continue}if(u[0]===3&&(!a||u[1]>a[0]&&u[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function j(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var $r="ENTRIES",Ct="KEYS",Nt="VALUES",K="",Re=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=ue(this._path),t=e.node,r=e.keys;if(ue(r)===K)return{done:!1,value:this.result()};var n=t.get(ue(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=ue(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return ue(t)}).filter(function(e){return e!==K}).join("")},o.prototype.value=function(){return ue(this._path).node.get(K)},o.prototype.result=function(){switch(this._type){case Nt:return this.value();case Ct:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),ue=function(o){return o[o.length-1]},jr=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}Tt(o.get(p),e,t,r,n,g,i,s+p)}}}catch(y){l={error:y}}finally{try{v&&!v.done&&(u=h.return)&&u.call(h)}finally{if(l)throw l.error}}},Me=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=j(ke(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=j(Ue(i),2),l=s[0],u=s[1];try{for(var d=_(l.keys()),h=d.next();!h.done;h=d.next()){var v=h.value;if(v!==K&&v.startsWith(u)){var p=new Map;return p.set(v.slice(u.length),l.get(v)),new o(p,e)}}}catch(b){t={error:b}}finally{try{h&&!h.done&&(r=d.return)&&r.call(d)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Wr(this._tree,e)},o.prototype.entries=function(){return new Re(this,$r)},o.prototype.forEach=function(e){var t,r;try{for(var n=_(this),a=n.next();!a.done;a=n.next()){var i=j(a.value,2),s=i[0],l=i[1];e(s,l,this)}}catch(u){t={error:u}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return jr(this._tree,e,t)},o.prototype.get=function(e){var t=We(this._tree,e);return t!==void 0?t.get(K):void 0},o.prototype.has=function(e){var t=We(this._tree,e);return t!==void 0&&t.has(K)},o.prototype.keys=function(){return new Re(this,Ct)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Pe(this._tree,e);return r.set(K,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Pe(this._tree,e);return r.set(K,t(r.get(K))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Pe(this._tree,e),n=r.get(K);return n===void 0&&r.set(K,n=t()),n},o.prototype.values=function(){return new Re(this,Nt)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=_(e),i=a.next();!i.done;i=a.next()){var s=j(i.value,2),l=s[0],u=s[1];n.set(l,u)}}catch(d){t={error:d}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),ke=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=_(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==K&&e.startsWith(s))return t.push([o,s]),ke(o.get(s),e.slice(s.length),t)}}catch(l){r={error:l}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),ke(void 0,"",t)},We=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=_(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==K&&e.startsWith(i))return We(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Pe=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Me,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=_(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(l){t={error:l}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Je,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Br(this,void 0,void 0,function(){var r,n,a,i,s,l,u,d,h,v,p,b,g,w,C,T,E,M,R,L,S,k,D,F,f;return Vr(this,function(c){switch(c.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||Ke.batchSize,a=e.batchWait||Ke.batchWait,i=1,c.label=1;case 1:c.trys.push([1,7,8,9]),s=_(this._index),l=s.next(),c.label=2;case 2:if(l.done)return[3,6];u=j(l.value,2),d=u[0],h=u[1];try{for(v=(k=void 0,_(h)),p=v.next();!p.done;p=v.next()){b=j(p.value,2),g=b[0],w=b[1];try{for(C=(F=void 0,_(w)),T=C.next();!T.done;T=C.next())E=j(T.value,1),M=E[0],!this._documentIds.has(M)&&(w.size<=1?h.delete(g):w.delete(M))}catch(y){F={error:y}}finally{try{T&&!T.done&&(f=C.return)&&f.call(C)}finally{if(F)throw F.error}}}}catch(y){k={error:y}}finally{try{p&&!p.done&&(D=v.return)&&D.call(v)}finally{if(k)throw k.error}}return this._index.get(d).size===0&&this._index.delete(d),i%n!==0?[3,4]:[4,new Promise(function(y){return setTimeout(y,a)})];case 3:c.sent(),c.label=4;case 4:i+=1,c.label=5;case 5:return l=s.next(),[3,2];case 6:return[3,9];case 7:return R=c.sent(),L={error:R},[3,9];case 8:try{l&&!l.done&&(S=s.return)&&S.call(s)}finally{if(L)throw L.error}return[7];case 9:this._dirtCount-=r,c.label=10;case 10:return[4,null];case 11:return c.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||Be.minDirtCount,r=r||Be.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=_(a),l=s.next();!l.done;l=s.next()){var u=j(l.value,2),d=u[0],h=u[1],v=h.score,p=h.terms,b=h.match,g=p.length,w={id:this._documentIds.get(d),score:v*g,terms:Object.keys(b),match:b};Object.assign(w,this._storedFields.get(d)),(t.filter==null||t.filter(w))&&i.push(w)}}catch(C){r={error:C}}finally{try{l&&!l.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return i.sort(yt),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=V(V({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var l=_(this.search(e,t)),u=l.next();!u.done;u=l.next()){var d=u.value,h=d.score,v=d.terms,p=v.join(" "),b=s.get(p);b!=null?(b.score+=h,b.count+=1):s.set(p,{score:h,terms:v,count:1})}}catch(R){r={error:R}}finally{try{u&&!u.done&&(n=l.return)&&n.call(l)}finally{if(r)throw r.error}}var g=[];try{for(var w=_(s),C=w.next();!C.done;C=w.next()){var T=j(C.value,2),b=T[0],E=T[1],h=E.score,v=E.terms,M=E.count;g.push({suggestion:b,terms:v,score:h/M})}}catch(R){a={error:R}}finally{try{C&&!C.done&&(i=w.return)&&i.call(w)}finally{if(a)throw a.error}}return g.sort(yt),g},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(ze.hasOwnProperty(e))return Le(ze,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,l,u=e.index,d=e.documentCount,h=e.nextId,v=e.documentIds,p=e.fieldIds,b=e.fieldLength,g=e.averageFieldLength,w=e.storedFields,C=e.dirtCount,T=e.serializationVersion;if(T!==1&&T!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var E=new o(t);E._documentCount=d,E._nextId=h,E._documentIds=Ee(v),E._idToShortId=new Map,E._fieldIds=p,E._fieldLength=Ee(b),E._avgFieldLength=g,E._storedFields=Ee(w),E._dirtCount=C||0,E._index=new Me;try{for(var M=_(E._documentIds),R=M.next();!R.done;R=M.next()){var L=j(R.value,2),S=L[0],k=L[1];E._idToShortId.set(k,S)}}catch(m){r={error:m}}finally{try{R&&!R.done&&(n=M.return)&&n.call(M)}finally{if(r)throw r.error}}try{for(var D=_(u),F=D.next();!F.done;F=D.next()){var f=j(F.value,2),c=f[0],y=f[1],x=new Map;try{for(var I=(s=void 0,_(Object.keys(y))),O=I.next();!O.done;O=I.next()){var P=O.value,z=y[P];T===1&&(z=z.ds),x.set(parseInt(P,10),Ee(z))}}catch(m){s={error:m}}finally{try{O&&!O.done&&(l=I.return)&&l.call(I)}finally{if(s)throw s.error}}E._index.set(c,x)}}catch(m){a={error:m}}finally{try{F&&!F.done&&(i=D.return)&&i.call(D)}finally{if(a)throw a.error}}return E},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),typeof e!="string"){var n=V(V(V({},t),e),{queries:void 0}),a=e.queries.map(function(w){return r.executeQuery(w,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,l=i.processTerm,u=i.searchOptions,d=V(V({tokenize:s,processTerm:l},u),t),h=d.tokenize,v=d.processTerm,p=h(e).flatMap(function(w){return v(w)}).filter(function(w){return!!w}),b=p.map(qr(d)),g=b.map(function(w){return r.executeQuerySpec(w,d)});return this.combineResults(g,d.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=V(V({},this._options.searchOptions),t),l=(s.fields||this._options.fields).reduce(function(P,z){var m;return V(V({},P),(m={},m[z]=Le(s.boost,z)||1,m))},{}),u=s.boostDocument,d=s.weights,h=s.maxFuzzy,v=s.bm25,p=V(V({},vt.weights),d),b=p.fuzzy,g=p.prefix,w=this._index.get(e.term),C=this.termResults(e.term,e.term,1,w,l,u,v),T,E;if(e.prefix&&(T=this._index.atPrefix(e.term)),e.fuzzy){var M=e.fuzzy===!0?.2:e.fuzzy,R=M<1?Math.min(h,Math.round(e.term.length*M)):M;R&&(E=this._index.fuzzyGet(e.term,R))}if(T)try{for(var L=_(T),S=L.next();!S.done;S=L.next()){var k=j(S.value,2),D=k[0],F=k[1],f=D.length-e.term.length;if(f){E==null||E.delete(D);var c=g*D.length/(D.length+.3*f);this.termResults(e.term,D,c,F,l,u,v,C)}}}catch(P){r={error:P}}finally{try{S&&!S.done&&(n=L.return)&&n.call(L)}finally{if(r)throw r.error}}if(E)try{for(var y=_(E.keys()),x=y.next();!x.done;x=y.next()){var D=x.value,I=j(E.get(D),2),O=I[0],f=I[1];if(f){var c=b*D.length/(D.length+f);this.termResults(e.term,D,c,O,l,u,v,C)}}}catch(P){a={error:P}}finally{try{x&&!x.done&&(i=y.return)&&i.call(y)}finally{if(a)throw a.error}}return C},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=He),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Ur[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=_(this._index),s=i.next();!s.done;s=i.next()){var l=j(s.value,2),u=l[0],d=l[1],h={};try{for(var v=(r=void 0,_(d)),p=v.next();!p.done;p=v.next()){var b=j(p.value,2),g=b[0],w=b[1];h[g]=Object.fromEntries(w)}}catch(C){r={error:C}}finally{try{p&&!p.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([u,h])}}catch(C){e={error:C}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,l){var u,d,h,v,p;if(l===void 0&&(l=new Map),n==null)return l;try{for(var b=_(Object.keys(a)),g=b.next();!g.done;g=b.next()){var w=g.value,C=a[w],T=this._fieldIds[w],E=n.get(T);if(E!=null){var M=E.size,R=this._avgFieldLength[T];try{for(var L=(h=void 0,_(E.keys())),S=L.next();!S.done;S=L.next()){var k=S.value;if(!this._documentIds.has(k)){this.removeTerm(T,k,t),M-=1;continue}var D=i?i(this._documentIds.get(k),t,this._storedFields.get(k)):1;if(D){var F=E.get(k),f=this._fieldLength.get(k)[T],c=Gr(F,M,this._documentCount,f,R,s),y=r*C*D*c,x=l.get(k);if(x){x.score+=y,Yr(x.terms,e);var I=Le(x.match,t);I?I.push(w):x.match[t]=[w]}else l.set(k,{score:y,terms:[e],match:(p={},p[t]=[w],p)})}}}catch(O){h={error:O}}finally{try{S&&!S.done&&(v=L.return)&&v.call(L)}finally{if(h)throw h.error}}}}}catch(O){u={error:O}}finally{try{g&&!g.done&&(d=b.return)&&d.call(b)}finally{if(u)throw u.error}}return l},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,mt),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,mt),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=_(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var l=s.value;if(this._fieldIds[l]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(l,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(u){n={error:u}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(jt("data-v-58c4b8ff"),o=o(),Wt(),o),Xr=["aria-owns"],ea={class:"shell"},ta=["title"],ra=Q(()=>A("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[A("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[A("circle",{cx:"11",cy:"11",r:"8"}),A("path",{d:"m21 21l-4.35-4.35"})])],-1)),aa=[ra],na={class:"search-actions before"},ia=["title"],oa=Q(()=>A("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[A("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),sa=[oa],la=["placeholder"],ua={class:"search-actions"},ca=["title"],fa=Q(()=>A("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[A("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),da=[fa],ha=["disabled","title"],va=Q(()=>A("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[A("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),pa=[va],ya=["id","role","aria-labelledby"],ma=["aria-selected"],ga=["href","aria-label","onMouseenter","onFocusin"],ba={class:"titles"},wa=Q(()=>A("span",{class:"title-icon"},"#",-1)),xa=["innerHTML"],Fa=Q(()=>A("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[A("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),Ea={class:"title main"},Sa=["innerHTML"],Aa={key:0,class:"excerpt-wrapper"},Ca={key:0,class:"excerpt",inert:""},Na=["innerHTML"],Ta=Q(()=>A("div",{class:"excerpt-gradient-bottom"},null,-1)),ka=Q(()=>A("div",{class:"excerpt-gradient-top"},null,-1)),Ia={key:0,class:"no-results"},_a={class:"search-keyboard-shortcuts"},Da=["aria-label"],Oa=Q(()=>A("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[A("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),Ra=[Oa],Ma=["aria-label"],Pa=Q(()=>A("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[A("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),La=[Pa],za=["aria-label"],Ba=Q(()=>A("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[A("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[A("path",{d:"m9 10l-5 5l5 5"}),A("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),Va=[Ba],$a=["aria-label"],ja=Dt({__name:"VPLocalSearchBox",props:{placeholder:{}},emits:["close"],setup(o,{emit:e}){var O,P,z;const t=de(),r=de(),n=de(),a=de(ar),i=Qt(),{activate:s}=Pr(t,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:u}=i,d=ot(async()=>{var m,N,$,J,H,G,B,U,Y;return it(Jr.loadJSON(($=await((N=(m=a.value)[l.value])==null?void 0:N.call(m)))==null?void 0:$.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((J=u.value.search)==null?void 0:J.provider)==="local"&&((G=(H=u.value.search.options)==null?void 0:H.miniSearch)==null?void 0:G.searchOptions)},...((B=u.value.search)==null?void 0:B.provider)==="local"&&((Y=(U=u.value.search.options)==null?void 0:U.miniSearch)==null?void 0:Y.options)}))}),v=_e(()=>{var m,N;return((m=u.value.search)==null?void 0:m.provider)==="local"&&((N=u.value.search.options)==null?void 0:N.disableQueryPersistence)===!0}).value?ie(""):Yt("vitepress:local-search-filter",""),p=Zt("vitepress:local-search-detailed-list",((O=u.value.search)==null?void 0:O.provider)==="local"&&((P=u.value.search.options)==null?void 0:P.detailedView)===!0),b=_e(()=>{var m,N,$;return((m=u.value.search)==null?void 0:m.provider)==="local"&&(((N=u.value.search.options)==null?void 0:N.disableDetailedView)===!0||(($=u.value.search.options)==null?void 0:$.detailedView)===!1)});Ot(()=>{b.value&&(p.value=!1)});const g=de([]),w=ie(!1);$e(v,()=>{w.value=!1});const C=ot(async()=>{if(r.value)return it(new zr(r.value))},null);Xt(()=>[d.value,v.value,p.value],async([m,N,$],J,H)=>{var Ge,qe,Qe,Ye;let G=!1;if(H(()=>{G=!0}),!m)return;g.value=m.search(N).slice(0,16),w.value=!0;const B=$?await Promise.all(g.value.map(q=>T(q.id))):[];if(G)return;const U=new Map;for(const{id:q,mod:re}of B){const ae=q.slice(0,q.indexOf("#"));let ee=U.get(ae);if(ee)continue;ee=new Map,U.set(ae,ee);const Z=re.default??re;if(Z!=null&&Z.render||Z!=null&&Z.setup){const ne=Kt(Z);ne.config.warnHandler=()=>{},ne.provide(Jt,i),Object.defineProperties(ne.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ze=document.createElement("div");ne.mount(Ze),Ze.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var tt;const be=(tt=fe.querySelector("a"))==null?void 0:tt.getAttribute("href"),Xe=(be==null?void 0:be.startsWith("#"))&&be.slice(1);if(!Xe)return;let et="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)et+=fe.outerHTML;ee.set(Xe,et)}),ne.unmount()}if(G)return}const Y=new Set;if(g.value=g.value.map(q=>{const[re,ae]=q.id.split("#"),ee=U.get(re),Z=(ee==null?void 0:ee.get(ae))??"";for(const ne in q.match)Y.add(ne);return{...q,text:Z}}),await he(),G)return;await new Promise(q=>{var re;(re=C.value)==null||re.unmark({done:()=>{var ae;(ae=C.value)==null||ae.markRegExp(I(Y),{done:q})}})});const Ie=((Ge=t.value)==null?void 0:Ge.querySelectorAll(".result .excerpt"))??[];for(const q of Ie)(qe=q.querySelector('mark[data-markjs="true"]'))==null||qe.scrollIntoView({block:"center"});(Ye=(Qe=r.value)==null?void 0:Qe.firstElementChild)==null||Ye.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function T(m){const N=Ut(m.slice(0,m.indexOf("#")));try{if(!N)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await Ve(()=>import(N),[])}}catch($){return console.error($),{id:m,mod:{}}}}const E=ie(),M=_e(()=>{var m;return((m=v.value)==null?void 0:m.length)<=0});function R(m=!0){var N,$;(N=E.value)==null||N.focus(),m&&(($=E.value)==null||$.select())}De(()=>{R()});function L(m){m.pointerType==="mouse"&&R()}const S=ie(-1),k=ie(!1);$e(g,m=>{S.value=m.length?0:-1,D()});function D(){he(()=>{const m=document.querySelector(".result.selected");m&&m.scrollIntoView({block:"nearest"})})}xe("ArrowUp",m=>{m.preventDefault(),S.value--,S.value<0&&(S.value=g.value.length-1),k.value=!0,D()}),xe("ArrowDown",m=>{m.preventDefault(),S.value++,S.value>=g.value.length&&(S.value=0),k.value=!0,D()});const F=Rt();xe("Enter",()=>{const m=g.value[S.value];m&&(F.go(m.id),e("close"))}),xe("Escape",()=>{e("close")});const f={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},c=er((z=u.value.search)==null?void 0:z.options,f);De(()=>{window.history.pushState(null,"",null)}),tr("popstate",m=>{m.preventDefault(),e("close")});const y=rr(n);De(()=>{n.value=document.body,he(()=>{y.value=!0,he().then(()=>s())})}),Mt(()=>{y.value=!1});function x(){v.value="",he().then(()=>R(!1))}function I(m){return new RegExp([...m].sort((N,$)=>$.length-N.length).map(N=>`(${N.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(m,N)=>{var $,J,H,G;return X(),Pt($t,{to:"body"},[A("div",{ref_key:"el",ref:t,role:"button","aria-owns":($=g.value)!=null&&$.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[A("div",{class:"backdrop",onClick:N[0]||(N[0]=B=>m.$emit("close"))}),A("div",ea,[A("form",{class:"search-bar",onPointerup:N[4]||(N[4]=B=>L(B)),onSubmit:N[5]||(N[5]=Lt(()=>{},["prevent"]))},[A("label",{title:m.placeholder,id:"localsearch-label",for:"localsearch-input"},aa,8,ta),A("div",na,[A("button",{class:"back-button",title:W(c)("modal.backButtonTitle"),onClick:N[1]||(N[1]=B=>m.$emit("close"))},sa,8,ia)]),zt(A("input",{ref_key:"searchInput",ref:E,"onUpdate:modelValue":N[2]||(N[2]=B=>Vt(v)?v.value=B:null),placeholder:m.placeholder,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,la),[[Bt,W(v)]]),A("div",ua,[b.value?we("",!0):(X(),te("button",{key:0,class:rt(["toggle-layout-button",{"detailed-list":W(p)}]),title:W(c)("modal.displayDetails"),onClick:N[3]||(N[3]=B=>S.value>-1&&(p.value=!W(p)))},da,10,ca)),A("button",{class:"clear-button",type:"reset",disabled:M.value,title:W(c)("modal.resetButtonTitle"),onClick:x},pa,8,ha)])],32),A("ul",{ref_key:"resultsEl",ref:r,id:(J=g.value)!=null&&J.length?"localsearch-list":void 0,role:(H=g.value)!=null&&H.length?"listbox":void 0,"aria-labelledby":(G=g.value)!=null&&G.length?"localsearch-label":void 0,class:"results",onMousemove:N[7]||(N[7]=B=>k.value=!1)},[(X(!0),te(nt,null,at(g.value,(B,U)=>(X(),te("li",{key:B.id,role:"option","aria-selected":S.value===U?"true":"false"},[A("a",{href:B.id,class:rt(["result",{selected:S.value===U}]),"aria-label":[...B.titles,B.title].join(" > "),onMouseenter:Y=>!k.value&&(S.value=U),onFocusin:Y=>S.value=U,onClick:N[6]||(N[6]=Y=>m.$emit("close"))},[A("div",null,[A("div",ba,[wa,(X(!0),te(nt,null,at(B.titles,(Y,Ie)=>(X(),te("span",{key:Ie,class:"title"},[A("span",{class:"text",innerHTML:Y},null,8,xa),Fa]))),128)),A("span",Ea,[A("span",{class:"text",innerHTML:B.title},null,8,Sa)])]),W(p)?(X(),te("div",Aa,[B.text?(X(),te("div",Ca,[A("div",{class:"vp-doc",innerHTML:B.text},null,8,Na)])):we("",!0),Ta,ka])):we("",!0)])],42,ga)],8,ma))),128)),W(v)&&!g.value.length&&w.value?(X(),te("li",Ia,[ve(pe(W(c)("modal.noResultsText"))+' "',1),A("strong",null,pe(W(v)),1),ve('" ')])):we("",!0)],40,ya),A("div",_a,[A("span",null,[A("kbd",{"aria-label":W(c)("modal.footer.navigateUpKeyAriaLabel")},Ra,8,Da),A("kbd",{"aria-label":W(c)("modal.footer.navigateDownKeyAriaLabel")},La,8,Ma),ve(" "+pe(W(c)("modal.footer.navigateText")),1)]),A("span",null,[A("kbd",{"aria-label":W(c)("modal.footer.selectKeyAriaLabel")},Va,8,za),ve(" "+pe(W(c)("modal.footer.selectText")),1)]),A("span",null,[A("kbd",{"aria-label":W(c)("modal.footer.closeKeyAriaLabel")},"esc",8,$a),ve(" "+pe(W(c)("modal.footer.closeText")),1)])])])],8,Xr)])}}});const Ha=Ht(ja,[["__scopeId","data-v-58c4b8ff"]]);export{Ha as default}; diff --git a/docs/.vitepress/dist/assets/chunks/framework.6e839c56.js b/docs/.vitepress/dist/assets/chunks/framework.6e839c56.js new file mode 100644 index 0000000..817f7c3 --- /dev/null +++ b/docs/.vitepress/dist/assets/chunks/framework.6e839c56.js @@ -0,0 +1,2 @@ +function es(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const te={},at=[],Pe=()=>{},$i=()=>!1,Bi=/^on[^a-z]/,Ut=e=>Bi.test(e),ts=e=>e.startsWith("onUpdate:"),oe=Object.assign,ns=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ui=Object.prototype.hasOwnProperty,Y=(e,t)=>Ui.call(e,t),N=Array.isArray,ut=e=>gn(e)==="[object Map]",xr=e=>gn(e)==="[object Set]",D=e=>typeof e=="function",se=e=>typeof e=="string",ss=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",Tr=e=>ee(e)&&D(e.then)&&D(e.catch),Ar=Object.prototype.toString,gn=e=>Ar.call(e),ji=e=>gn(e).slice(8,-1),Rr=e=>gn(e)==="[object Object]",rs=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Rt=es(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),mn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Di=/-(\w)/g,Le=mn(e=>e.replace(Di,(t,n)=>n?n.toUpperCase():"")),ki=/\B([A-Z])/g,it=mn(e=>e.replace(ki,"-$1").toLowerCase()),_n=mn(e=>e.charAt(0).toUpperCase()+e.slice(1)),en=mn(e=>e?`on${_n(e)}`:""),St=(e,t)=>!Object.is(e,t),tn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Un=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Ki=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let Is;const jn=()=>Is||(Is=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function is(e){if(N(e)){const t={};for(let n=0;n{if(n){const s=n.split(Vi);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function os(e){let t="";if(se(e))t=e;else if(N(e))for(let n=0;nse(e)?e:e==null?"":N(e)||ee(e)&&(e.toString===Ar||!D(e.toString))?JSON.stringify(e,Ir,2):String(e),Ir=(e,t)=>t&&t.__v_isRef?Ir(e,t.value):ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:xr(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!N(t)&&!Rr(t)?String(t):t;let _e;class Xi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=_e;try{return _e=this,t()}finally{_e=n}}}on(){_e=this}off(){_e=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Fr=e=>(e.w&Ve)>0,Or=e=>(e.n&Ve)>0,Gi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||d>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":N(e)?rs(n)&&l.push(o.get("length")):(l.push(o.get(st)),ut(e)&&l.push(o.get(kn)));break;case"delete":N(e)||(l.push(o.get(st)),ut(e)&&l.push(o.get(kn)));break;case"set":ut(e)&&l.push(o.get(st));break}if(l.length===1)l[0]&&Kn(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Kn(ls(c))}}function Kn(e,t){const n=N(e)?e:[...e];for(const s of n)s.computed&&Os(s);for(const s of n)s.computed||Os(s)}function Os(e,t){(e!==Ae||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function to(e,t){var n;return(n=ln.get(e))==null?void 0:n.get(t)}const no=es("__proto__,__v_isRef,__isVue"),Sr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ss)),so=fs(),ro=fs(!1,!0),io=fs(!0),Ms=oo();function oo(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=J(this);for(let i=0,o=this.length;i{e[t]=function(...n){wt();const s=J(this)[t].apply(this,n);return Ct(),s}}),e}function lo(e){const t=J(this);return pe(t,"has",e),t.hasOwnProperty(e)}function fs(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?xo:Ur:t?Br:$r).get(s))return s;const o=N(s);if(!e){if(o&&Y(Ms,r))return Reflect.get(Ms,r,i);if(r==="hasOwnProperty")return lo}const l=Reflect.get(s,r,i);return(ss(r)?Sr.has(r):no(r))||(e||pe(s,"get",r),t)?l:ce(l)?o&&rs(r)?l:l.value:ee(l)?e?jr(l):yn(l):l}}const co=Nr(),fo=Nr(!0);function Nr(e=!1){return function(n,s,r,i){let o=n[s];if(_t(o)&&ce(o)&&!ce(r))return!1;if(!e&&(!cn(r)&&!_t(r)&&(o=J(o),r=J(r)),!N(n)&&ce(o)&&!ce(r)))return o.value=r,!0;const l=N(n)&&rs(s)?Number(s)e,bn=e=>Reflect.getPrototypeOf(e);function Wt(e,t,n=!1,s=!1){e=e.__v_raw;const r=J(e),i=J(t);n||(t!==i&&pe(r,"get",t),pe(r,"get",i));const{has:o}=bn(r),l=s?as:n?hs:Nt;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function Vt(e,t=!1){const n=this.__v_raw,s=J(n),r=J(e);return t||(e!==r&&pe(s,"has",e),pe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function qt(e,t=!1){return e=e.__v_raw,!t&&pe(J(e),"iterate",st),Reflect.get(e,"size",e)}function Ls(e){e=J(e);const t=J(this);return bn(t).has.call(t,e)||(t.add(e),He(t,"add",e,e)),this}function Ss(e,t){t=J(t);const n=J(this),{has:s,get:r}=bn(n);let i=s.call(n,e);i||(e=J(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?St(t,o)&&He(n,"set",e,t):He(n,"add",e,t),this}function Ns(e){const t=J(this),{has:n,get:s}=bn(t);let r=n.call(t,e);r||(e=J(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&He(t,"delete",e,void 0),i}function Hs(){const e=J(this),t=e.size!==0,n=e.clear();return t&&He(e,"clear",void 0,void 0),n}function zt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=J(o),c=t?as:e?hs:Nt;return!e&&pe(l,"iterate",st),o.forEach((a,d)=>s.call(r,c(a),c(d),i))}}function Yt(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=ut(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,a=r[e](...s),d=n?as:t?hs:Nt;return!t&&pe(i,"iterate",c?kn:st),{next(){const{value:h,done:g}=a.next();return g?{value:h,done:g}:{value:l?[d(h[0]),d(h[1])]:d(h),done:g}},[Symbol.iterator](){return this}}}}function Be(e){return function(...t){return e==="delete"?!1:this}}function mo(){const e={get(i){return Wt(this,i)},get size(){return qt(this)},has:Vt,add:Ls,set:Ss,delete:Ns,clear:Hs,forEach:zt(!1,!1)},t={get(i){return Wt(this,i,!1,!0)},get size(){return qt(this)},has:Vt,add:Ls,set:Ss,delete:Ns,clear:Hs,forEach:zt(!1,!0)},n={get(i){return Wt(this,i,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:zt(!0,!1)},s={get(i){return Wt(this,i,!0,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:zt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Yt(i,!1,!1),n[i]=Yt(i,!0,!1),t[i]=Yt(i,!1,!0),s[i]=Yt(i,!0,!0)}),[e,n,t,s]}const[_o,bo,yo,vo]=mo();function us(e,t){const n=t?e?vo:yo:e?bo:_o;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Y(n,r)&&r in s?n:s,r,i)}const wo={get:us(!1,!1)},Co={get:us(!1,!0)},Eo={get:us(!0,!1)},$r=new WeakMap,Br=new WeakMap,Ur=new WeakMap,xo=new WeakMap;function To(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ao(e){return e.__v_skip||!Object.isExtensible(e)?0:To(ji(e))}function yn(e){return _t(e)?e:ds(e,!1,Hr,wo,$r)}function Ro(e){return ds(e,!1,go,Co,Br)}function jr(e){return ds(e,!0,po,Eo,Ur)}function ds(e,t,n,s,r){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=Ao(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function dt(e){return _t(e)?dt(e.__v_raw):!!(e&&e.__v_isReactive)}function _t(e){return!!(e&&e.__v_isReadonly)}function cn(e){return!!(e&&e.__v_isShallow)}function Dr(e){return dt(e)||_t(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function Pt(e){return on(e,"__v_skip",!0),e}const Nt=e=>ee(e)?yn(e):e,hs=e=>ee(e)?jr(e):e;function ps(e){Ke&&Ae&&(e=J(e),Lr(e.dep||(e.dep=ls())))}function gs(e,t){e=J(e);const n=e.dep;n&&Kn(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function ht(e){return kr(e,!1)}function Po(e){return kr(e,!0)}function kr(e,t){return ce(e)?e:new Io(e,t)}class Io{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Nt(t)}get value(){return ps(this),this._value}set value(t){const n=this.__v_isShallow||cn(t)||_t(t);t=n?t:J(t),St(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Nt(t),gs(this))}}function Fo(e){return ce(e)?e.value:e}const Oo={get:(e,t,n)=>Fo(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ce(r)&&!ce(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Kr(e){return dt(e)?e:new Proxy(e,Oo)}class Mo{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>ps(this),()=>gs(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function zc(e){return new Mo(e)}class Lo{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return to(J(this._object),this._key)}}class So{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Yc(e,t,n){return ce(e)?e:D(e)?new So(e):ee(e)&&arguments.length>1?No(e,t,n):ht(e)}function No(e,t,n){const s=e[t];return ce(s)?s:new Lo(e,t,n)}class Ho{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new cs(t,()=>{this._dirty||(this._dirty=!0,gs(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=J(this);return ps(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function $o(e,t,n=!1){let s,r;const i=D(e);return i?(s=e,r=Pe):(s=e.get,r=e.set),new Ho(s,r,i||!r,n)}function We(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){jt(i,t,n)}return r}function Ce(e,t,n,s){if(D(e)){const i=We(e,t,n,s);return i&&Tr(i)&&i.catch(o=>{jt(o,t,n)}),i}const r=[];for(let i=0;i>>1;$t(ae[s])Me&&ae.splice(t,1)}function Do(e){N(e)?pt.push(...e):(!Ne||!Ne.includes(e,e.allowRecurse?Qe+1:Qe))&&pt.push(e),qr()}function $s(e,t=Ht?Me+1:0){for(;t$t(n)-$t(s)),Qe=0;Qee.id==null?1/0:e.id,ko=(e,t)=>{const n=$t(e)-$t(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function zr(e){Wn=!1,Ht=!0,ae.sort(ko);const t=Pe;try{for(Me=0;Mese(w)?w.trim():w)),h&&(r=n.map(Un))}let l,c=s[l=en(t)]||s[l=en(Le(t))];!c&&i&&(c=s[l=en(it(t))]),c&&Ce(c,e,6,r);const a=s[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ce(a,e,6,r)}}function Yr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!D(e)){const c=a=>{const d=Yr(a,t,!0);d&&(l=!0,oe(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ee(e)&&s.set(e,null),null):(N(i)?i.forEach(c=>o[c]=null):oe(o,i),ee(e)&&s.set(e,o),o)}function wn(e,t){return!e||!Ut(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,it(t))||Y(e,t))}let fe=null,Cn=null;function an(e){const t=fe;return fe=e,Cn=e&&e.type.__scopeId||null,t}function Jc(e){Cn=e}function Xc(){Cn=null}function Wo(e,t=fe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Xs(-1);const i=an(t);let o;try{o=e(...r)}finally{an(i),s._d&&Xs(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function On(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:a,render:d,renderCache:h,data:g,setupState:w,ctx:A,inheritAttrs:I}=e;let H,m;const y=an(e);try{if(n.shapeFlag&4){const P=r||s;H=Te(d.call(P,P,h,i,w,g,A)),m=c}else{const P=t;H=Te(P.length>1?P(i,{attrs:c,slots:l,emit:a}):P(i,null)),m=t.props?c:Vo(c)}}catch(P){Mt.length=0,jt(P,e,1),H=re(be)}let $=H;if(m&&I!==!1){const P=Object.keys(m),{shapeFlag:k}=$;P.length&&k&7&&(o&&P.some(ts)&&(m=qo(m,o)),$=qe($,m))}return n.dirs&&($=qe($),$.dirs=$.dirs?$.dirs.concat(n.dirs):n.dirs),n.transition&&($.transition=n.transition),H=$,an(y),H}const Vo=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ut(n))&&((t||(t={}))[n]=e[n]);return t},qo=(e,t)=>{const n={};for(const s in e)(!ts(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function zo(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,a=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Bs(s,o,a):!!o;if(c&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function Jr(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):Do(e)}function Xo(e,t){return En(e,null,t)}function Zc(e,t){return En(e,null,{flush:"post"})}const Jt={};function nn(e,t,n){return En(e,t,n)}function En(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=te){var l;const c=Qi()===((l=le)==null?void 0:l.scope)?le:null;let a,d=!1,h=!1;if(ce(e)?(a=()=>e.value,d=cn(e)):dt(e)?(a=()=>e,s=!0):N(e)?(h=!0,d=e.some(P=>dt(P)||cn(P)),a=()=>e.map(P=>{if(ce(P))return P.value;if(dt(P))return tt(P);if(D(P))return We(P,c,2)})):D(e)?t?a=()=>We(e,c,2):a=()=>{if(!(c&&c.isUnmounted))return g&&g(),Ce(e,c,3,[w])}:a=Pe,t&&s){const P=a;a=()=>tt(P())}let g,w=P=>{g=y.onStop=()=>{We(P,c,4)}},A;if(vt)if(w=Pe,t?n&&Ce(t,c,3,[a(),h?[]:void 0,w]):a(),r==="sync"){const P=ql();A=P.__watcherHandles||(P.__watcherHandles=[])}else return Pe;let I=h?new Array(e.length).fill(Jt):Jt;const H=()=>{if(y.active)if(t){const P=y.run();(s||d||(h?P.some((k,q)=>St(k,I[q])):St(P,I)))&&(g&&g(),Ce(t,c,3,[P,I===Jt?void 0:h&&I[0]===Jt?[]:I,w]),I=P)}else y.run()};H.allowRecurse=!!t;let m;r==="sync"?m=H:r==="post"?m=()=>de(H,c&&c.suspense):(H.pre=!0,c&&(H.id=c.uid),m=()=>vn(H));const y=new cs(a,m);t?n?H():I=y.run():r==="post"?de(y.run.bind(y),c&&c.suspense):y.run();const $=()=>{y.stop(),c&&c.scope&&ns(c.scope.effects,y)};return A&&A.push($),$}function Zo(e,t,n){const s=this.proxy,r=se(e)?e.includes(".")?Xr(s,e):()=>s[e]:e.bind(s,s);let i;D(t)?i=t:(i=t.handler,n=t);const o=le;yt(this);const l=En(r,i.bind(s),n);return o?yt(o):rt(),l}function Xr(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{tt(n,t)});else if(Rr(e))for(const n in e)tt(e[n],t);return e}function Qc(e,t){const n=fe;if(n===null)return e;const s=Pn(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),ti(()=>{e.isUnmounting=!0}),e}const ye=[Function,Array],Zr={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ye,onEnter:ye,onAfterEnter:ye,onEnterCancelled:ye,onBeforeLeave:ye,onLeave:ye,onAfterLeave:ye,onLeaveCancelled:ye,onBeforeAppear:ye,onAppear:ye,onAfterAppear:ye,onAppearCancelled:ye},Go={name:"BaseTransition",props:Zr,setup(e,{slots:t}){const n=vi(),s=Qo();let r;return()=>{const i=t.default&&Gr(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const I of i)if(I.type!==be){o=I;break}}const l=J(e),{mode:c}=l;if(s.isLeaving)return Mn(o);const a=Us(o);if(!a)return Mn(o);const d=Vn(a,l,s,n);qn(a,d);const h=n.subTree,g=h&&Us(h);let w=!1;const{getTransitionKey:A}=a.type;if(A){const I=A();r===void 0?r=I:I!==r&&(r=I,w=!0)}if(g&&g.type!==be&&(!Ge(a,g)||w)){const I=Vn(g,l,s,n);if(qn(g,I),c==="out-in")return s.isLeaving=!0,I.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Mn(o);c==="in-out"&&a.type!==be&&(I.delayLeave=(H,m,y)=>{const $=Qr(s,g);$[String(g.key)]=g,H._leaveCb=()=>{m(),H._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=y})}return o}}},el=Go;function Qr(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Vn(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:h,onLeave:g,onAfterLeave:w,onLeaveCancelled:A,onBeforeAppear:I,onAppear:H,onAfterAppear:m,onAppearCancelled:y}=t,$=String(e.key),P=Qr(n,e),k=(x,U)=>{x&&Ce(x,s,9,U)},q=(x,U)=>{const B=U[1];k(x,U),N(x)?x.every(W=>W.length<=1)&&B():x.length<=1&&B()},K={mode:i,persisted:o,beforeEnter(x){let U=l;if(!n.isMounted)if(r)U=I||l;else return;x._leaveCb&&x._leaveCb(!0);const B=P[$];B&&Ge(e,B)&&B.el._leaveCb&&B.el._leaveCb(),k(U,[x])},enter(x){let U=c,B=a,W=d;if(!n.isMounted)if(r)U=H||c,B=m||a,W=y||d;else return;let F=!1;const V=x._enterCb=M=>{F||(F=!0,M?k(W,[x]):k(B,[x]),K.delayedLeave&&K.delayedLeave(),x._enterCb=void 0)};U?q(U,[x,V]):V()},leave(x,U){const B=String(e.key);if(x._enterCb&&x._enterCb(!0),n.isUnmounting)return U();k(h,[x]);let W=!1;const F=x._leaveCb=V=>{W||(W=!0,U(),V?k(A,[x]):k(w,[x]),x._leaveCb=void 0,P[B]===e&&delete P[B])};P[B]=e,g?q(g,[x,F]):F()},clone(x){return Vn(x,t,n,s)}};return K}function Mn(e){if(Dt(e))return e=qe(e),e.children=null,e}function Us(e){return Dt(e)?e.children?e.children[0]:void 0:e}function qn(e,t){e.shapeFlag&6&&e.component?qn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Gr(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;ioe({name:e.name},t,{setup:e}))():e}const gt=e=>!!e.type.__asyncLoader;function Gc(e){D(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,a,d=0;const h=()=>(d++,c=null,g()),g=()=>{let w;return c||(w=c=t().catch(A=>{if(A=A instanceof Error?A:new Error(String(A)),l)return new Promise((I,H)=>{l(A,()=>I(h()),()=>H(A),d+1)});throw A}).then(A=>w!==c&&c?c:(A&&(A.__esModule||A[Symbol.toStringTag]==="Module")&&(A=A.default),a=A,A)))};return _s({name:"AsyncComponentWrapper",__asyncLoader:g,get __asyncResolved(){return a},setup(){const w=le;if(a)return()=>Ln(a,w);const A=y=>{c=null,jt(y,w,13,!s)};if(o&&w.suspense||vt)return g().then(y=>()=>Ln(y,w)).catch(y=>(A(y),()=>s?re(s,{error:y}):null));const I=ht(!1),H=ht(),m=ht(!!r);return r&&setTimeout(()=>{m.value=!1},r),i!=null&&setTimeout(()=>{if(!I.value&&!H.value){const y=new Error(`Async component timed out after ${i}ms.`);A(y),H.value=y}},i),g().then(()=>{I.value=!0,w.parent&&Dt(w.parent.vnode)&&vn(w.parent.update)}).catch(y=>{A(y),H.value=y}),()=>{if(I.value&&a)return Ln(a,w);if(H.value&&s)return re(s,{error:H.value});if(n&&!m.value)return re(n)}}})}function Ln(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=re(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const Dt=e=>e.type.__isKeepAlive;function tl(e,t){ei(e,"a",t)}function nl(e,t){ei(e,"da",t)}function ei(e,t,n=le){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(xn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Dt(r.parent.vnode)&&sl(s,t,n,r),r=r.parent}}function sl(e,t,n,s){const r=xn(t,e,s,!0);An(()=>{ns(s[t],r)},n)}function xn(e,t,n=le,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;wt(),yt(n);const l=Ce(t,n,e,o);return rt(),Ct(),l});return s?r.unshift(i):r.push(i),i}}const $e=e=>(t,n=le)=>(!vt||e==="sp")&&xn(e,(...s)=>t(...s),n),rl=$e("bm"),Tn=$e("m"),il=$e("bu"),ol=$e("u"),ti=$e("bum"),An=$e("um"),ll=$e("sp"),cl=$e("rtg"),fl=$e("rtc");function al(e,t=le){xn("ec",e,t)}const bs="components";function ef(e,t){return si(bs,e,!0,t)||e}const ni=Symbol.for("v-ndc");function tf(e){return se(e)?si(bs,e,!1)||e:e||ni}function si(e,t,n=!0,s=!1){const r=fe||le;if(r){const i=r.type;if(e===bs){const l=Kl(i,!1);if(l&&(l===t||l===Le(t)||l===_n(Le(t))))return i}const o=js(r[e]||i[e],t)||js(r.appContext[e],t);return!o&&s?i:o}}function js(e,t){return e&&(e[t]||e[Le(t)]||e[_n(Le(t))])}function nf(e,t,n,s){let r;const i=n&&n[s];if(N(e)||se(e)){r=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lpn(t)?!(t.type===be||t.type===he&&!ri(t.children)):!0)?e:null}function rf(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:en(s)]=e[s];return n}const zn=e=>e?wi(e)?Pn(e)||e.proxy:zn(e.parent):null,It=oe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>zn(e.parent),$root:e=>zn(e.root),$emit:e=>e.emit,$options:e=>ys(e),$forceUpdate:e=>e.f||(e.f=()=>vn(e.update)),$nextTick:e=>e.n||(e.n=Vr.bind(e.proxy)),$watch:e=>Zo.bind(e)}),Sn=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),ul={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const w=o[t];if(w!==void 0)switch(w){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Sn(s,t))return o[t]=1,s[t];if(r!==te&&Y(r,t))return o[t]=2,r[t];if((a=e.propsOptions[0])&&Y(a,t))return o[t]=3,i[t];if(n!==te&&Y(n,t))return o[t]=4,n[t];Yn&&(o[t]=0)}}const d=It[t];let h,g;if(d)return t==="$attrs"&&pe(e,"get",t),d(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&Y(n,t))return o[t]=4,n[t];if(g=c.config.globalProperties,Y(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Sn(r,t)?(r[t]=n,!0):s!==te&&Y(s,t)?(s[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==te&&Y(e,o)||Sn(t,o)||(l=i[0])&&Y(l,o)||Y(s,o)||Y(It,o)||Y(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function of(){return dl().slots}function dl(){const e=vi();return e.setupContext||(e.setupContext=Ei(e))}function Ds(e){return N(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Yn=!0;function hl(e){const t=ys(e),n=e.proxy,s=e.ctx;Yn=!1,t.beforeCreate&&ks(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:a,created:d,beforeMount:h,mounted:g,beforeUpdate:w,updated:A,activated:I,deactivated:H,beforeDestroy:m,beforeUnmount:y,destroyed:$,unmounted:P,render:k,renderTracked:q,renderTriggered:K,errorCaptured:x,serverPrefetch:U,expose:B,inheritAttrs:W,components:F,directives:V,filters:M}=t;if(a&&pl(a,s,null),o)for(const ne in o){const Q=o[ne];D(Q)&&(s[ne]=Q.bind(n))}if(r){const ne=r.call(n,n);ee(ne)&&(e.data=yn(ne))}if(Yn=!0,i)for(const ne in i){const Q=i[ne],ze=D(Q)?Q.bind(n,n):D(Q.get)?Q.get.bind(n,n):Pe,kt=!D(Q)&&D(Q.set)?Q.set.bind(n):Pe,Ye=xe({get:ze,set:kt});Object.defineProperty(s,ne,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:Ie=>Ye.value=Ie})}if(l)for(const ne in l)ii(l[ne],s,n,ne);if(c){const ne=D(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Q=>{vl(Q,ne[Q])})}d&&ks(d,e,"c");function X(ne,Q){N(Q)?Q.forEach(ze=>ne(ze.bind(n))):Q&&ne(Q.bind(n))}if(X(rl,h),X(Tn,g),X(il,w),X(ol,A),X(tl,I),X(nl,H),X(al,x),X(fl,q),X(cl,K),X(ti,y),X(An,P),X(ll,U),N(B))if(B.length){const ne=e.exposed||(e.exposed={});B.forEach(Q=>{Object.defineProperty(ne,Q,{get:()=>n[Q],set:ze=>n[Q]=ze})})}else e.exposed||(e.exposed={});k&&e.render===Pe&&(e.render=k),W!=null&&(e.inheritAttrs=W),F&&(e.components=F),V&&(e.directives=V)}function pl(e,t,n=Pe){N(e)&&(e=Jn(e));for(const s in e){const r=e[s];let i;ee(r)?"default"in r?i=mt(r.from||s,r.default,!0):i=mt(r.from||s):i=mt(r),ce(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function ks(e,t,n){Ce(N(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function ii(e,t,n,s){const r=s.includes(".")?Xr(n,s):()=>n[s];if(se(e)){const i=t[e];D(i)&&nn(r,i)}else if(D(e))nn(r,e.bind(n));else if(ee(e))if(N(e))e.forEach(i=>ii(i,t,n,s));else{const i=D(e.handler)?e.handler.bind(n):t[e.handler];D(i)&&nn(r,i,e)}}function ys(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(a=>un(c,a,o,!0)),un(c,t,o)),ee(t)&&i.set(t,c),c}function un(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&un(e,i,n,!0),r&&r.forEach(o=>un(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=gl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const gl={data:Ks,props:Ws,emits:Ws,methods:At,computed:At,beforeCreate:ue,created:ue,beforeMount:ue,mounted:ue,beforeUpdate:ue,updated:ue,beforeDestroy:ue,beforeUnmount:ue,destroyed:ue,unmounted:ue,activated:ue,deactivated:ue,errorCaptured:ue,serverPrefetch:ue,components:At,directives:At,watch:_l,provide:Ks,inject:ml};function Ks(e,t){return t?e?function(){return oe(D(e)?e.call(this,this):e,D(t)?t.call(this,this):t)}:t:e}function ml(e,t){return At(Jn(e),Jn(t))}function Jn(e){if(N(e)){const t={};for(let n=0;n1)return n&&D(t)?t.call(s&&s.proxy):t}}function wl(e,t,n,s=!1){const r={},i={};on(i,Rn,1),e.propsDefaults=Object.create(null),li(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Ro(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Cl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let a=!1;if((s||o>0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[g,w]=ci(h,t,!0);oe(o,g),w&&l.push(...w)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return ee(e)&&s.set(e,at),at;if(N(i))for(let d=0;d-1,w[1]=I<0||A-1||Y(w,"default"))&&l.push(h)}}}const a=[o,l];return ee(e)&&s.set(e,a),a}function Vs(e){return e[0]!=="$"}function qs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function zs(e,t){return qs(e)===qs(t)}function Ys(e,t){return N(t)?t.findIndex(n=>zs(n,e)):D(t)&&zs(t,e)?0:-1}const fi=e=>e[0]==="_"||e==="$stable",vs=e=>N(e)?e.map(Te):[Te(e)],El=(e,t,n)=>{if(t._n)return t;const s=Wo((...r)=>vs(t(...r)),n);return s._c=!1,s},ai=(e,t,n)=>{const s=e._ctx;for(const r in e){if(fi(r))continue;const i=e[r];if(D(i))t[r]=El(r,i,s);else if(i!=null){const o=vs(i);t[r]=()=>o}}},ui=(e,t)=>{const n=vs(t);e.slots.default=()=>n},xl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),on(t,"_",n)):ai(t,e.slots={})}else e.slots={},t&&ui(e,t);on(e.slots,Rn,1)},Tl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(oe(r,t),!n&&l===1&&delete r._):(i=!t.$stable,ai(t,r)),o=t}else t&&(ui(e,t),o={default:1});if(i)for(const l in r)!fi(l)&&!(l in o)&&delete r[l]};function hn(e,t,n,s,r=!1){if(N(e)){e.forEach((g,w)=>hn(g,t&&(N(t)?t[w]:t),n,s,r));return}if(gt(s)&&!r)return;const i=s.shapeFlag&4?Pn(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,a=t&&t.r,d=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(se(a)?(d[a]=null,Y(h,a)&&(h[a]=null)):ce(a)&&(a.value=null)),D(c))We(c,l,12,[o,d]);else{const g=se(c),w=ce(c);if(g||w){const A=()=>{if(e.f){const I=g?Y(h,c)?h[c]:d[c]:c.value;r?N(I)&&ns(I,i):N(I)?I.includes(i)||I.push(i):g?(d[c]=[i],Y(h,c)&&(h[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else g?(d[c]=o,Y(h,c)&&(h[c]=o)):w&&(c.value=o,e.k&&(d[e.k]=o))};o?(A.id=-1,de(A,n)):A()}}}let Ue=!1;const Xt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Zt=e=>e.nodeType===8;function Al(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:a}}=e,d=(m,y)=>{if(!y.hasChildNodes()){n(null,m,y),fn(),y._vnode=m;return}Ue=!1,h(y.firstChild,m,null,null,null),fn(),y._vnode=m,Ue&&console.error("Hydration completed but contains mismatches.")},h=(m,y,$,P,k,q=!1)=>{const K=Zt(m)&&m.data==="[",x=()=>I(m,y,$,P,k,K),{type:U,ref:B,shapeFlag:W,patchFlag:F}=y;let V=m.nodeType;y.el=m,F===-2&&(q=!1,y.dynamicChildren=null);let M=null;switch(U){case bt:V!==3?y.children===""?(c(y.el=r(""),o(m),m),M=m):M=x():(m.data!==y.children&&(Ue=!0,m.data=y.children),M=i(m));break;case be:V!==8||K?M=x():M=i(m);break;case Ot:if(K&&(m=i(m),V=m.nodeType),V===1||V===3){M=m;const ge=!y.children.length;for(let X=0;X{q=q||!!y.dynamicChildren;const{type:K,props:x,patchFlag:U,shapeFlag:B,dirs:W}=y,F=K==="input"&&W||K==="option";if(F||U!==-1){if(W&&Oe(y,null,$,"created"),x)if(F||!q||U&48)for(const M in x)(F&&M.endsWith("value")||Ut(M)&&!Rt(M))&&s(m,M,null,x[M],!1,void 0,$);else x.onClick&&s(m,"onClick",null,x.onClick,!1,void 0,$);let V;if((V=x&&x.onVnodeBeforeMount)&&ve(V,$,y),W&&Oe(y,null,$,"beforeMount"),((V=x&&x.onVnodeMounted)||W)&&Jr(()=>{V&&ve(V,$,y),W&&Oe(y,null,$,"mounted")},P),B&16&&!(x&&(x.innerHTML||x.textContent))){let M=w(m.firstChild,y,m,$,P,k,q);for(;M;){Ue=!0;const ge=M;M=M.nextSibling,l(ge)}}else B&8&&m.textContent!==y.children&&(Ue=!0,m.textContent=y.children)}return m.nextSibling},w=(m,y,$,P,k,q,K)=>{K=K||!!y.dynamicChildren;const x=y.children,U=x.length;for(let B=0;B{const{slotScopeIds:K}=y;K&&(k=k?k.concat(K):K);const x=o(m),U=w(i(m),y,x,$,P,k,q);return U&&Zt(U)&&U.data==="]"?i(y.anchor=U):(Ue=!0,c(y.anchor=a("]"),x,U),U)},I=(m,y,$,P,k,q)=>{if(Ue=!0,y.el=null,q){const U=H(m);for(;;){const B=i(m);if(B&&B!==U)l(B);else break}}const K=i(m),x=o(m);return l(m),n(null,y,x,K,$,P,Xt(x),k),K},H=m=>{let y=0;for(;m;)if(m=i(m),m&&Zt(m)&&(m.data==="["&&y++,m.data==="]")){if(y===0)return i(m);y--}return m};return[d,h]}const de=Jr;function Rl(e){return di(e)}function Pl(e){return di(e,Al)}function di(e,t){const n=jn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:a,setElementText:d,parentNode:h,nextSibling:g,setScopeId:w=Pe,insertStaticContent:A}=e,I=(f,u,p,b=null,_=null,E=null,R=!1,C=null,T=!!u.dynamicChildren)=>{if(f===u)return;f&&!Ge(f,u)&&(b=Kt(f),Ie(f,_,E,!0),f=null),u.patchFlag===-2&&(T=!1,u.dynamicChildren=null);const{type:v,ref:L,shapeFlag:O}=u;switch(v){case bt:H(f,u,p,b);break;case be:m(f,u,p,b);break;case Ot:f==null&&y(u,p,b,R);break;case he:F(f,u,p,b,_,E,R,C,T);break;default:O&1?k(f,u,p,b,_,E,R,C,T):O&6?V(f,u,p,b,_,E,R,C,T):(O&64||O&128)&&v.process(f,u,p,b,_,E,R,C,T,ot)}L!=null&&_&&hn(L,f&&f.ref,E,u||f,!u)},H=(f,u,p,b)=>{if(f==null)s(u.el=l(u.children),p,b);else{const _=u.el=f.el;u.children!==f.children&&a(_,u.children)}},m=(f,u,p,b)=>{f==null?s(u.el=c(u.children||""),p,b):u.el=f.el},y=(f,u,p,b)=>{[f.el,f.anchor]=A(f.children,u,p,b,f.el,f.anchor)},$=({el:f,anchor:u},p,b)=>{let _;for(;f&&f!==u;)_=g(f),s(f,p,b),f=_;s(u,p,b)},P=({el:f,anchor:u})=>{let p;for(;f&&f!==u;)p=g(f),r(f),f=p;r(u)},k=(f,u,p,b,_,E,R,C,T)=>{R=R||u.type==="svg",f==null?q(u,p,b,_,E,R,C,T):U(f,u,_,E,R,C,T)},q=(f,u,p,b,_,E,R,C)=>{let T,v;const{type:L,props:O,shapeFlag:S,transition:j,dirs:z}=f;if(T=f.el=o(f.type,E,O&&O.is,O),S&8?d(T,f.children):S&16&&x(f.children,T,null,b,_,E&&L!=="foreignObject",R,C),z&&Oe(f,null,b,"created"),K(T,f,f.scopeId,R,b),O){for(const Z in O)Z!=="value"&&!Rt(Z)&&i(T,Z,null,O[Z],E,f.children,b,_,Se);"value"in O&&i(T,"value",null,O.value),(v=O.onVnodeBeforeMount)&&ve(v,b,f)}z&&Oe(f,null,b,"beforeMount");const G=(!_||_&&!_.pendingBranch)&&j&&!j.persisted;G&&j.beforeEnter(T),s(T,u,p),((v=O&&O.onVnodeMounted)||G||z)&&de(()=>{v&&ve(v,b,f),G&&j.enter(T),z&&Oe(f,null,b,"mounted")},_)},K=(f,u,p,b,_)=>{if(p&&w(f,p),b)for(let E=0;E{for(let v=T;v{const C=u.el=f.el;let{patchFlag:T,dynamicChildren:v,dirs:L}=u;T|=f.patchFlag&16;const O=f.props||te,S=u.props||te;let j;p&&Je(p,!1),(j=S.onVnodeBeforeUpdate)&&ve(j,p,u,f),L&&Oe(u,f,p,"beforeUpdate"),p&&Je(p,!0);const z=_&&u.type!=="foreignObject";if(v?B(f.dynamicChildren,v,C,p,b,z,E):R||Q(f,u,C,null,p,b,z,E,!1),T>0){if(T&16)W(C,u,O,S,p,b,_);else if(T&2&&O.class!==S.class&&i(C,"class",null,S.class,_),T&4&&i(C,"style",O.style,S.style,_),T&8){const G=u.dynamicProps;for(let Z=0;Z{j&&ve(j,p,u,f),L&&Oe(u,f,p,"updated")},b)},B=(f,u,p,b,_,E,R)=>{for(let C=0;C{if(p!==b){if(p!==te)for(const C in p)!Rt(C)&&!(C in b)&&i(f,C,p[C],null,R,u.children,_,E,Se);for(const C in b){if(Rt(C))continue;const T=b[C],v=p[C];T!==v&&C!=="value"&&i(f,C,v,T,R,u.children,_,E,Se)}"value"in b&&i(f,"value",p.value,b.value)}},F=(f,u,p,b,_,E,R,C,T)=>{const v=u.el=f?f.el:l(""),L=u.anchor=f?f.anchor:l("");let{patchFlag:O,dynamicChildren:S,slotScopeIds:j}=u;j&&(C=C?C.concat(j):j),f==null?(s(v,p,b),s(L,p,b),x(u.children,p,L,_,E,R,C,T)):O>0&&O&64&&S&&f.dynamicChildren?(B(f.dynamicChildren,S,p,_,E,R,C),(u.key!=null||_&&u===_.subTree)&&ws(f,u,!0)):Q(f,u,p,L,_,E,R,C,T)},V=(f,u,p,b,_,E,R,C,T)=>{u.slotScopeIds=C,f==null?u.shapeFlag&512?_.ctx.activate(u,p,b,R,T):M(u,p,b,_,E,R,T):ge(f,u,T)},M=(f,u,p,b,_,E,R)=>{const C=f.component=Ul(f,b,_);if(Dt(f)&&(C.ctx.renderer=ot),jl(C),C.asyncDep){if(_&&_.registerDep(C,X),!f.el){const T=C.subTree=re(be);m(null,T,u,p)}return}X(C,f,u,p,_,E,R)},ge=(f,u,p)=>{const b=u.component=f.component;if(zo(f,u,p))if(b.asyncDep&&!b.asyncResolved){ne(b,u,p);return}else b.next=u,jo(b.update),b.update();else u.el=f.el,b.vnode=u},X=(f,u,p,b,_,E,R)=>{const C=()=>{if(f.isMounted){let{next:L,bu:O,u:S,parent:j,vnode:z}=f,G=L,Z;Je(f,!1),L?(L.el=z.el,ne(f,L,R)):L=z,O&&tn(O),(Z=L.props&&L.props.onVnodeBeforeUpdate)&&ve(Z,j,L,z),Je(f,!0);const ie=On(f),Ee=f.subTree;f.subTree=ie,I(Ee,ie,h(Ee.el),Kt(Ee),f,_,E),L.el=ie.el,G===null&&Yo(f,ie.el),S&&de(S,_),(Z=L.props&&L.props.onVnodeUpdated)&&de(()=>ve(Z,j,L,z),_)}else{let L;const{el:O,props:S}=u,{bm:j,m:z,parent:G}=f,Z=gt(u);if(Je(f,!1),j&&tn(j),!Z&&(L=S&&S.onVnodeBeforeMount)&&ve(L,G,u),Je(f,!0),O&&Fn){const ie=()=>{f.subTree=On(f),Fn(O,f.subTree,f,_,null)};Z?u.type.__asyncLoader().then(()=>!f.isUnmounted&&ie()):ie()}else{const ie=f.subTree=On(f);I(null,ie,p,b,f,_,E),u.el=ie.el}if(z&&de(z,_),!Z&&(L=S&&S.onVnodeMounted)){const ie=u;de(()=>ve(L,G,ie),_)}(u.shapeFlag&256||G&>(G.vnode)&&G.vnode.shapeFlag&256)&&f.a&&de(f.a,_),f.isMounted=!0,u=p=b=null}},T=f.effect=new cs(C,()=>vn(v),f.scope),v=f.update=()=>T.run();v.id=f.uid,Je(f,!0),v()},ne=(f,u,p)=>{u.component=f;const b=f.vnode.props;f.vnode=u,f.next=null,Cl(f,u.props,b,p),Tl(f,u.children,p),wt(),$s(),Ct()},Q=(f,u,p,b,_,E,R,C,T=!1)=>{const v=f&&f.children,L=f?f.shapeFlag:0,O=u.children,{patchFlag:S,shapeFlag:j}=u;if(S>0){if(S&128){kt(v,O,p,b,_,E,R,C,T);return}else if(S&256){ze(v,O,p,b,_,E,R,C,T);return}}j&8?(L&16&&Se(v,_,E),O!==v&&d(p,O)):L&16?j&16?kt(v,O,p,b,_,E,R,C,T):Se(v,_,E,!0):(L&8&&d(p,""),j&16&&x(O,p,b,_,E,R,C,T))},ze=(f,u,p,b,_,E,R,C,T)=>{f=f||at,u=u||at;const v=f.length,L=u.length,O=Math.min(v,L);let S;for(S=0;SL?Se(f,_,E,!0,!1,O):x(u,p,b,_,E,R,C,T,O)},kt=(f,u,p,b,_,E,R,C,T)=>{let v=0;const L=u.length;let O=f.length-1,S=L-1;for(;v<=O&&v<=S;){const j=f[v],z=u[v]=T?ke(u[v]):Te(u[v]);if(Ge(j,z))I(j,z,p,null,_,E,R,C,T);else break;v++}for(;v<=O&&v<=S;){const j=f[O],z=u[S]=T?ke(u[S]):Te(u[S]);if(Ge(j,z))I(j,z,p,null,_,E,R,C,T);else break;O--,S--}if(v>O){if(v<=S){const j=S+1,z=jS)for(;v<=O;)Ie(f[v],_,E,!0),v++;else{const j=v,z=v,G=new Map;for(v=z;v<=S;v++){const me=u[v]=T?ke(u[v]):Te(u[v]);me.key!=null&&G.set(me.key,v)}let Z,ie=0;const Ee=S-z+1;let lt=!1,As=0;const Et=new Array(Ee);for(v=0;v=Ee){Ie(me,_,E,!0);continue}let Fe;if(me.key!=null)Fe=G.get(me.key);else for(Z=z;Z<=S;Z++)if(Et[Z-z]===0&&Ge(me,u[Z])){Fe=Z;break}Fe===void 0?Ie(me,_,E,!0):(Et[Fe-z]=v+1,Fe>=As?As=Fe:lt=!0,I(me,u[Fe],p,null,_,E,R,C,T),ie++)}const Rs=lt?Il(Et):at;for(Z=Rs.length-1,v=Ee-1;v>=0;v--){const me=z+v,Fe=u[me],Ps=me+1{const{el:E,type:R,transition:C,children:T,shapeFlag:v}=f;if(v&6){Ye(f.component.subTree,u,p,b);return}if(v&128){f.suspense.move(u,p,b);return}if(v&64){R.move(f,u,p,ot);return}if(R===he){s(E,u,p);for(let O=0;OC.enter(E),_);else{const{leave:O,delayLeave:S,afterLeave:j}=C,z=()=>s(E,u,p),G=()=>{O(E,()=>{z(),j&&j()})};S?S(E,z,G):G()}else s(E,u,p)},Ie=(f,u,p,b=!1,_=!1)=>{const{type:E,props:R,ref:C,children:T,dynamicChildren:v,shapeFlag:L,patchFlag:O,dirs:S}=f;if(C!=null&&hn(C,null,p,f,!0),L&256){u.ctx.deactivate(f);return}const j=L&1&&S,z=!gt(f);let G;if(z&&(G=R&&R.onVnodeBeforeUnmount)&&ve(G,u,f),L&6)Hi(f.component,p,b);else{if(L&128){f.suspense.unmount(p,b);return}j&&Oe(f,null,u,"beforeUnmount"),L&64?f.type.remove(f,u,p,_,ot,b):v&&(E!==he||O>0&&O&64)?Se(v,u,p,!1,!0):(E===he&&O&384||!_&&L&16)&&Se(T,u,p),b&&xs(f)}(z&&(G=R&&R.onVnodeUnmounted)||j)&&de(()=>{G&&ve(G,u,f),j&&Oe(f,null,u,"unmounted")},p)},xs=f=>{const{type:u,el:p,anchor:b,transition:_}=f;if(u===he){Ni(p,b);return}if(u===Ot){P(f);return}const E=()=>{r(p),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(f.shapeFlag&1&&_&&!_.persisted){const{leave:R,delayLeave:C}=_,T=()=>R(p,E);C?C(f.el,E,T):T()}else E()},Ni=(f,u)=>{let p;for(;f!==u;)p=g(f),r(f),f=p;r(u)},Hi=(f,u,p)=>{const{bum:b,scope:_,update:E,subTree:R,um:C}=f;b&&tn(b),_.stop(),E&&(E.active=!1,Ie(R,f,u,p)),C&&de(C,u),de(()=>{f.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Se=(f,u,p,b=!1,_=!1,E=0)=>{for(let R=E;Rf.shapeFlag&6?Kt(f.component.subTree):f.shapeFlag&128?f.suspense.next():g(f.anchor||f.el),Ts=(f,u,p)=>{f==null?u._vnode&&Ie(u._vnode,null,null,!0):I(u._vnode||null,f,u,null,null,null,p),$s(),fn(),u._vnode=f},ot={p:I,um:Ie,m:Ye,r:xs,mt:M,mc:x,pc:Q,pbc:B,n:Kt,o:e};let In,Fn;return t&&([In,Fn]=t(ot)),{render:Ts,hydrate:In,createApp:yl(Ts,In)}}function Je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function ws(e,t,n=!1){const s=e.children,r=t.children;if(N(s)&&N(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}const Fl=e=>e.__isTeleport,Ft=e=>e&&(e.disabled||e.disabled===""),Js=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Zn=(e,t)=>{const n=e&&e.to;return se(n)?t?t(n):null:n},Ol={__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,a){const{mc:d,pc:h,pbc:g,o:{insert:w,querySelector:A,createText:I,createComment:H}}=a,m=Ft(t.props);let{shapeFlag:y,children:$,dynamicChildren:P}=t;if(e==null){const k=t.el=I(""),q=t.anchor=I("");w(k,n,s),w(q,n,s);const K=t.target=Zn(t.props,A),x=t.targetAnchor=I("");K&&(w(x,K),o=o||Js(K));const U=(B,W)=>{y&16&&d($,B,W,r,i,o,l,c)};m?U(n,q):K&&U(K,x)}else{t.el=e.el;const k=t.anchor=e.anchor,q=t.target=e.target,K=t.targetAnchor=e.targetAnchor,x=Ft(e.props),U=x?n:q,B=x?k:K;if(o=o||Js(q),P?(g(e.dynamicChildren,P,U,r,i,o,l),ws(e,t,!0)):c||h(e,t,U,B,r,i,o,l,!1),m)x||Qt(t,n,k,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const W=t.target=Zn(t.props,A);W&&Qt(t,W,null,a,0)}else x&&Qt(t,q,K,a,1)}hi(t)},remove(e,t,n,s,{um:r,o:{remove:i}},o){const{shapeFlag:l,children:c,anchor:a,targetAnchor:d,target:h,props:g}=e;if(h&&i(d),(o||!Ft(g))&&(i(a),l&16))for(let w=0;w0?Re||at:null,Ll(),Bt>0&&Re&&Re.push(e),e}function cf(e,t,n,s,r,i){return gi(bi(e,t,n,s,r,i,!0))}function mi(e,t,n,s,r){return gi(re(e,t,n,s,r,!0))}function pn(e){return e?e.__v_isVNode===!0:!1}function Ge(e,t){return e.type===t.type&&e.key===t.key}const Rn="__vInternal",_i=({key:e})=>e??null,sn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||ce(e)||D(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function bi(e,t=null,n=null,s=0,r=null,i=e===he?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&_i(t),ref:t&&sn(t),scopeId:Cn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:fe};return l?(Cs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),Bt>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const re=Sl;function Sl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===ni)&&(e=be),pn(e)){const l=qe(e,t,!0);return n&&Cs(l,n),Bt>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(Wl(e)&&(e=e.__vccOpts),t){t=Nl(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=os(l)),ee(c)&&(Dr(c)&&!N(c)&&(c=oe({},c)),t.style=is(c))}const o=se(e)?1:Jo(e)?128:Fl(e)?64:ee(e)?4:D(e)?2:0;return bi(e,t,n,s,r,o,i,!0)}function Nl(e){return e?Dr(e)||Rn in e?oe({},e):e:null}function qe(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Hl(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&_i(l),ref:t&&t.ref?n&&r?N(r)?r.concat(sn(t)):[r,sn(t)]:sn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==he?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qe(e.ssContent),ssFallback:e.ssFallback&&qe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function yi(e=" ",t=0){return re(bt,null,e,t)}function ff(e,t){const n=re(Ot,null,e);return n.staticCount=t,n}function af(e="",t=!1){return t?(pi(),mi(be,null,e)):re(be,null,e)}function Te(e){return e==null||typeof e=="boolean"?re(be):N(e)?re(he,null,e.slice()):typeof e=="object"?ke(e):re(bt,null,String(e))}function ke(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qe(e)}function Cs(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Cs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Rn in t)?t._ctx=fe:r===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else D(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),s&64?(n=16,t=[yi(t)]):n=8);e.children=t,e.shapeFlag|=n}function Hl(...e){const t={};for(let n=0;nle||fe;let Es,ct,Zs="__VUE_INSTANCE_SETTERS__";(ct=jn()[Zs])||(ct=jn()[Zs]=[]),ct.push(e=>le=e),Es=e=>{ct.length>1?ct.forEach(t=>t(e)):ct[0](e)};const yt=e=>{Es(e),e.scope.on()},rt=()=>{le&&le.scope.off(),Es(null)};function wi(e){return e.vnode.shapeFlag&4}let vt=!1;function jl(e,t=!1){vt=t;const{props:n,children:s}=e.vnode,r=wi(e);wl(e,n,r,t),xl(e,s);const i=r?Dl(e,t):void 0;return vt=!1,i}function Dl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Pt(new Proxy(e.ctx,ul));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Ei(e):null;yt(e),wt();const i=We(s,e,0,[e.props,r]);if(Ct(),rt(),Tr(i)){if(i.then(rt,rt),t)return i.then(o=>{Qs(e,o,t)}).catch(o=>{jt(o,e,0)});e.asyncDep=i}else Qs(e,i,t)}else Ci(e,t)}function Qs(e,t,n){D(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Kr(t)),Ci(e,n)}let Gs;function Ci(e,t,n){const s=e.type;if(!e.render){if(!t&&Gs&&!s.render){const r=s.template||ys(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,a=oe(oe({isCustomElement:i,delimiters:l},o),c);s.render=Gs(r,a)}}e.render=s.render||Pe}yt(e),wt(),hl(e),Ct(),rt()}function kl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return pe(e,"get","$attrs"),t[n]}}))}function Ei(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return kl(e)},slots:e.slots,emit:e.emit,expose:t}}function Pn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Kr(Pt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}}))}function Kl(e,t=!0){return D(e)?e.displayName||e.name:e.name||t&&e.__name}function Wl(e){return D(e)&&"__vccOpts"in e}const xe=(e,t)=>$o(e,t,vt);function Qn(e,t,n){const s=arguments.length;return s===2?ee(t)&&!N(t)?pn(t)?re(e,null,[t]):re(e,t):re(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&pn(n)&&(n=[n]),re(e,t,n))}const Vl=Symbol.for("v-scx"),ql=()=>mt(Vl),zl="3.3.4",Yl="http://www.w3.org/2000/svg",et=typeof document<"u"?document:null,er=et&&et.createElement("template"),Jl={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?et.createElementNS(Yl,e):et.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>et.createTextNode(e),createComment:e=>et.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>et.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{er.innerHTML=s?`${e}`:e;const l=er.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Xl(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Zl(e,t,n){const s=e.style,r=se(n);if(n&&!r){if(t&&!se(t))for(const i in t)n[i]==null&&Gn(s,i,"");for(const i in n)Gn(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const tr=/\s*!important$/;function Gn(e,t,n){if(N(n))n.forEach(s=>Gn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ql(e,t);tr.test(n)?e.setProperty(it(s),n.replace(tr,""),"important"):e[s]=n}}const nr=["Webkit","Moz","ms"],Nn={};function Ql(e,t){const n=Nn[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return Nn[t]=s;s=_n(s);for(let r=0;rHn||(rc.then(()=>Hn=0),Hn=Date.now());function oc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ce(lc(s,n.value),t,5,[s])};return n.value=e,n.attached=ic(),n}function lc(e,t){if(N(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ir=/^on[a-z]/,cc=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?Xl(e,s,r):t==="style"?Zl(e,n,s):Ut(t)?ts(t)||nc(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):fc(e,t,s,r))?ec(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Gl(e,t,s,r))};function fc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&ir.test(t)&&D(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||ir.test(t)&&se(n)?!1:t in e}const je="transition",xt="animation",xi=(e,{slots:t})=>Qn(el,ac(e),t);xi.displayName="Transition";const Ti={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};xi.props=oe({},Zr,Ti);const Xe=(e,t=[])=>{N(e)?e.forEach(n=>n(...t)):e&&e(...t)},or=e=>e?N(e)?e.some(t=>t.length>1):e.length>1:!1;function ac(e){const t={};for(const F in e)F in Ti||(t[F]=e[F]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:a=o,appearToClass:d=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:w=`${n}-leave-to`}=e,A=uc(r),I=A&&A[0],H=A&&A[1],{onBeforeEnter:m,onEnter:y,onEnterCancelled:$,onLeave:P,onLeaveCancelled:k,onBeforeAppear:q=m,onAppear:K=y,onAppearCancelled:x=$}=t,U=(F,V,M)=>{Ze(F,V?d:l),Ze(F,V?a:o),M&&M()},B=(F,V)=>{F._isLeaving=!1,Ze(F,h),Ze(F,w),Ze(F,g),V&&V()},W=F=>(V,M)=>{const ge=F?K:y,X=()=>U(V,F,M);Xe(ge,[V,X]),lr(()=>{Ze(V,F?c:i),De(V,F?d:l),or(ge)||cr(V,s,I,X)})};return oe(t,{onBeforeEnter(F){Xe(m,[F]),De(F,i),De(F,o)},onBeforeAppear(F){Xe(q,[F]),De(F,c),De(F,a)},onEnter:W(!1),onAppear:W(!0),onLeave(F,V){F._isLeaving=!0;const M=()=>B(F,V);De(F,h),pc(),De(F,g),lr(()=>{F._isLeaving&&(Ze(F,h),De(F,w),or(P)||cr(F,s,H,M))}),Xe(P,[F,M])},onEnterCancelled(F){U(F,!1),Xe($,[F])},onAppearCancelled(F){U(F,!0),Xe(x,[F])},onLeaveCancelled(F){B(F),Xe(k,[F])}})}function uc(e){if(e==null)return null;if(ee(e))return[$n(e.enter),$n(e.leave)];{const t=$n(e);return[t,t]}}function $n(e){return Ki(e)}function De(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ze(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function lr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let dc=0;function cr(e,t,n,s){const r=e._endId=++dc,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=hc(e,t);if(!o)return s();const a=o+"end";let d=0;const h=()=>{e.removeEventListener(a,g),i()},g=w=>{w.target===e&&++d>=c&&h()};setTimeout(()=>{d(n[A]||"").split(", "),r=s(`${je}Delay`),i=s(`${je}Duration`),o=fr(r,i),l=s(`${xt}Delay`),c=s(`${xt}Duration`),a=fr(l,c);let d=null,h=0,g=0;t===je?o>0&&(d=je,h=o,g=i.length):t===xt?a>0&&(d=xt,h=a,g=c.length):(h=Math.max(o,a),d=h>0?o>a?je:xt:null,g=d?d===je?i.length:c.length:0);const w=d===je&&/\b(transform|all)(,|$)/.test(s(`${je}Property`).toString());return{type:d,timeout:h,propCount:g,hasTransform:w}}function fr(e,t){for(;e.lengthar(n)+ar(e[s])))}function ar(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function pc(){return document.body.offsetHeight}const ur=e=>{const t=e.props["onUpdate:modelValue"]||!1;return N(t)?n=>tn(t,n):t};function gc(e){e.target.composing=!0}function dr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const uf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e._assign=ur(r);const i=s||r.props&&r.props.type==="number";ft(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Un(l)),e._assign(l)}),n&&ft(e,"change",()=>{e.value=e.value.trim()}),t||(ft(e,"compositionstart",gc),ft(e,"compositionend",dr),ft(e,"change",dr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},i){if(e._assign=ur(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(r||e.type==="number")&&Un(e.value)===t))return;const o=t??"";e.value!==o&&(e.value=o)}},mc=["ctrl","shift","alt","meta"],_c={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>mc.some(n=>e[`${n}Key`]&&!t.includes(n))},df=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=it(n.key);if(t.some(r=>r===s||bc[r]===s))return e(n)},Ai=oe({patchProp:cc},Jl);let Lt,hr=!1;function yc(){return Lt||(Lt=Rl(Ai))}function vc(){return Lt=hr?Lt:Pl(Ai),hr=!0,Lt}const pf=(...e)=>{const t=yc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ri(s);if(!r)return;const i=t._component;!D(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.innerHTML="";const o=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},gf=(...e)=>{const t=vc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ri(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ri(e){return se(e)?document.querySelector(e):e}const mf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},wc="modulepreload",Cc=function(e){return"/"+e},pr={},_f=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Cc(i),i in pr)return;pr[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const h=r[d];if(h.href===i&&(!o||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=o?"stylesheet":wc,o||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),o)return new Promise((d,h)=>{a.addEventListener("load",d),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})},Ec=window.__VP_SITE_DATA__,Pi=/^[a-z]+:/i,bf=/^pathname:\/\//,yf="vitepress-theme-appearance",Ii=/#.*$/,xc=/(index)?\.(md|html)$/,we=typeof document<"u",Fi={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Tc(e,t,n=!1){if(t===void 0)return!1;if(e=gr(`/${e}`),n)return new RegExp(t).test(e);if(gr(t)!==e)return!1;const s=t.match(Ii);return s?(we?location.hash:"")===s[0]:!0}function gr(e){return decodeURI(e).replace(Ii,"").replace(xc,"")}function Ac(e){return Pi.test(e)}function Rc(e,t){var s,r,i,o,l,c,a;const n=Object.keys(e.locales).find(d=>d!=="root"&&!Ac(d)&&Tc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Mi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function Oi(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=Pc(e.title,s);return`${n}${r}`}function Pc(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Ic(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Mi(e,t){return[...e.filter(n=>!Ic(t,n)),...t]}const Fc=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Oc=/^[a-z]:/i;function mr(e){const t=Oc.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Fc,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Mc=Symbol(),nt=Po(Ec);function vf(e){const t=xe(()=>Rc(nt.value,e.data.relativePath));return{site:t,theme:xe(()=>t.value.themeConfig),page:xe(()=>e.data),frontmatter:xe(()=>e.data.frontmatter),params:xe(()=>e.data.params),lang:xe(()=>t.value.lang),dir:xe(()=>t.value.dir),localeIndex:xe(()=>t.value.localeIndex||"root"),title:xe(()=>Oi(t.value,e.data)),description:xe(()=>e.data.description||t.value.description),isDark:ht(!1)}}function Lc(){const e=mt(Mc);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Sc(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function _r(e){return Pi.test(e)||e.startsWith(".")?e:Sc(nt.value.base,e)}function Nc(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),we){const n="/";t=mr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${mr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let rn=[];function wf(e){rn.push(e),An(()=>{rn=rn.filter(t=>t!==e)})}const Hc=Symbol(),br="http://a.com",$c=()=>({path:"/",component:null,data:Fi});function Cf(e,t){const n=yn($c()),s={route:n,go:r};async function r(l=we?location.href:"/"){var a,d;if(await((a=s.onBeforeRouteChange)==null?void 0:a.call(s,l))===!1)return;const c=new URL(l,br);nt.value.cleanUrls||!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),wr(l),await o(l),await((d=s.onAfterRouteChanged)==null?void 0:d.call(s,l))}let i=null;async function o(l,c=0,a=!1){var g;if(await((g=s.onBeforePageLoad)==null?void 0:g.call(s,l))===!1)return;const d=new URL(l,br),h=i=d.pathname;try{let w=await e(h);if(!w)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:A,__pageData:I}=w;if(!A)throw new Error(`Invalid route component: ${A}`);n.path=we?h:_r(h),n.component=Pt(A),n.data=Pt(I),we&&Vr(()=>{let H=nt.value.base+I.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!nt.value.cleanUrls&&!H.endsWith("/")&&(H+=".html"),H!==d.pathname&&(d.pathname=H,l=H+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let m=null;try{m=document.getElementById(decodeURIComponent(d.hash).slice(1))}catch(y){console.warn(y)}if(m){yr(m,d.hash);return}}window.scrollTo(0,c)})}}catch(w){if(!/fetch|Page not found/.test(w.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(w),!a)try{const A=await fetch(nt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await A.json(),await o(l,c,!0);return}catch{}i===h&&(i=null,n.path=we?h:_r(h),n.component=t?Pt(t):null,n.data=Fi)}}return we&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:d}=a,{href:h,origin:g,pathname:w,hash:A,search:I}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),H=window.location,m=w.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!d&&g===H.origin&&!(m&&m[0]!==".html")&&(l.preventDefault(),w===H.pathname&&I===H.search?(A!==H.hash&&(history.pushState(null,"",A),window.dispatchEvent(new Event("hashchange"))),A?yr(a,A,a.classList.contains("header-anchor")):(wr(h),window.scrollTo(0,0))):r(h))}},{capture:!0}),window.addEventListener("popstate",l=>{o(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Bc(){const e=mt(Hc);if(!e)throw new Error("useRouter() is called without provider.");return e}function Li(){return Bc().route}function yr(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let a=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},r=nt.value.scrollOffset,i=0,o=24;if(typeof r=="object"&&"padding"in r&&(o=r.padding,r=r.selector),typeof r=="number")i=r;else if(typeof r=="string")i=vr(r,o);else if(Array.isArray(r))for(const d of r){const h=vr(d,o);if(h){i=h;break}}const l=parseInt(window.getComputedStyle(s).paddingTop,10),c=window.scrollY+s.getBoundingClientRect().top-i+l;requestAnimationFrame(a)}}function vr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}function wr(e){we&&e!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}const Cr=()=>rn.forEach(e=>e()),Ef=_s({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Li(),{site:n}=Lc();return()=>Qn(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?Qn(t.component,{onVnodeMounted:Cr,onVnodeUpdated:Cr}):"404 Page Not Found"])}}),xf=_s({setup(e,{slots:t}){const n=ht(!1);return Tn(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Tf(){we&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(a=>a.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Af(){if(we){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Uc(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Uc(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Rf(e,t){let n=[],s=!0;const r=i=>{if(s){s=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=Er(o);document.head.appendChild(l),n.push(l)})};Xo(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Oi(o,i);const a=l||o.description;let d=document.querySelector("meta[name=description]");d?d.setAttribute("content",a):Er(["meta",{name:"description",content:a}]),r(Mi(o.head,Dc(c)))})}function Er([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),s}function jc(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Dc(e){return e.filter(t=>!jc(t))}const Bn=new Set,Si=()=>document.createElement("link"),kc=e=>{const t=Si();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Kc=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Gt;const Wc=we&&(Gt=Si())&&Gt.relList&&Gt.relList.supports&&Gt.relList.supports("prefetch")?kc:Kc;function Pf(){if(!we||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Bn.has(c)){Bn.add(c);const a=Nc(c);a&&Wc(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):Bn.add(l))})})};Tn(s);const r=Li();nn(()=>r.path,s),An(()=>{n&&n.disconnect()})}export{_f as $,Xo as A,vi as B,ce as C,Po as D,Vr as E,Tc as F,we as G,An as H,Zc as I,ol as J,ef as K,he as L,nf as M,wf as N,re as O,bf as P,tf as Q,Pi as R,Li as S,xi as T,Hl as U,mt as V,is as W,ff as X,yf as Y,Gc as Z,mf as _,yi as a,vl as a0,hf as a1,rf as a2,df as a3,of as a4,Rf as a5,Hc as a6,vf as a7,Mc as a8,Ef as a9,xf as aa,nt as ab,gf as ac,Cf as ad,Nc as ae,Pf as af,Af as ag,Tf as ah,Qn as ai,Bc as aj,ti as ak,Qc as al,uf as am,lf as an,Pt as ao,pf as ap,mi as b,cf as c,_s as d,af as e,_r as f,xe as g,ht as h,Ac as i,Tn as j,bi as k,Fo as l,Xc as m,os as n,pi as o,Jc as p,Qi as q,sf as r,qc as s,Vc as t,Lc as u,Yc as v,Wo as w,jr as x,zc as y,nn as z}; diff --git a/docs/.vitepress/dist/assets/chunks/theme.4451c782.js b/docs/.vitepress/dist/assets/chunks/theme.4451c782.js new file mode 100644 index 0000000..ee5ab32 --- /dev/null +++ b/docs/.vitepress/dist/assets/chunks/theme.4451c782.js @@ -0,0 +1,7 @@ +import{d as y,o as r,c as l,r as v,n as A,a as H,t as N,_ as g,b as P,w as p,T as Ie,e as m,u as Ct,i as At,P as Bt,f as Ne,g as V,h as L,j as F,k as _,l as i,p as j,m as G,q as xt,s as Ot,v as Ht,x as Ce,y as Et,z as U,A as ie,B as Dt,C as zt,D as le,E as it,F as ee,G as ke,H as Ae,I as Be,J as Ft,K as Q,L as C,M as O,N as oe,O as h,Q as X,R as lt,S as Pe,U as pe,V as xe,W as ct,X as jt,Y as qe,Z as Gt,$ as Rt,a0 as fe,a1 as Ut,a2 as Wt,a3 as Kt,a4 as qt}from"./framework.6e839c56.js";const Yt=y({__name:"VPBadge",props:{text:{},type:{}},setup(t){return(e,n)=>(r(),l("span",{class:A(["VPBadge",e.type??"tip"])},[v(e.$slots,"default",{},()=>[H(N(e.text),1)],!0)],2))}});const Jt=g(Yt,[["__scopeId","data-v-7a7936a3"]]),Xt={key:0,class:"VPBackdrop"},Qt=y({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(t){return(e,n)=>(r(),P(Ie,{name:"fade"},{default:p(()=>[e.show?(r(),l("div",Xt)):m("",!0)]),_:1}))}});const Zt=g(Qt,[["__scopeId","data-v-54a304ca"]]),T=Ct;function en(t,e){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(t,e):(t(),o=!0,setTimeout(()=>{o=!1},e))}}function Le(t){return/^\//.test(t)?t:`/${t}`}function se(t){if(At(t))return t.replace(Bt,"");const{site:e}=T(),{pathname:n,search:o,hash:s}=new URL(t,"http://a.com"),a=n.endsWith("/")||n.endsWith(".html")?t:t.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${o}${s}`);return Ne(a)}function ce({removeCurrent:t=!0,correspondingLink:e=!1}={}){const{site:n,localeIndex:o,page:s,theme:a}=T(),u=V(()=>{var c,f;return{label:(c=n.value.locales[o.value])==null?void 0:c.label,link:((f=n.value.locales[o.value])==null?void 0:f.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:V(()=>Object.entries(n.value.locales).flatMap(([c,f])=>t&&u.value.label===f.label?[]:{text:f.label,link:tn(f.link||(c==="root"?"/":`/${c}/`),a.value.i18nRouting!==!1&&e,s.value.relativePath.slice(u.value.link.length-1),!n.value.cleanUrls)})),currentLang:u}}function tn(t,e,n,o){return e?t.replace(/\/$/,"")+Le(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):t}const nn=t=>(j("data-v-1bc323a9"),t=t(),G(),t),on={class:"NotFound"},sn={class:"code"},an={class:"title"},rn=nn(()=>_("div",{class:"divider"},null,-1)),ln={class:"quote"},cn={class:"action"},un=["href","aria-label"],dn=y({__name:"NotFound",setup(t){const{site:e,theme:n}=T(),{localeLinks:o}=ce({removeCurrent:!1}),s=L("/");return F(()=>{var u;const a=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(s.value=((u=o.value.find(({link:d})=>d.startsWith(a)))==null?void 0:u.link)||o.value[0].link)}),(a,u)=>{var d,c,f,b,$;return r(),l("div",on,[_("p",sn,N(((d=i(n).notFound)==null?void 0:d.code)??"404"),1),_("h1",an,N(((c=i(n).notFound)==null?void 0:c.title)??"PAGE NOT FOUND"),1),rn,_("blockquote",ln,N(((f=i(n).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),_("div",cn,[_("a",{class:"link",href:i(Ne)(s.value),"aria-label":((b=i(n).notFound)==null?void 0:b.linkLabel)??"go to home"},N((($=i(n).notFound)==null?void 0:$.linkText)??"Take me home"),9,un)])])}}});const _n=g(dn,[["__scopeId","data-v-1bc323a9"]]);function Oe(t){return xt()?(Ot(t),!0):!1}function R(t){return typeof t=="function"?t():i(t)}const ut=typeof window<"u",ae=()=>{},Ye=vn();function vn(){var t;return ut&&((t=window==null?void 0:window.navigator)==null?void 0:t.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function pn(t,e){function n(...o){return new Promise((s,a)=>{Promise.resolve(t(()=>e.apply(this,o),{fn:e,thisArg:this,args:o})).then(s).catch(a)})}return n}const dt=t=>t();function fn(t,e={}){let n,o,s=ae;const a=d=>{clearTimeout(d),s(),s=ae};return d=>{const c=R(t),f=R(e.maxWait);return n&&a(n),c<=0||f!==void 0&&f<=0?(o&&(a(o),o=null),Promise.resolve(d())):new Promise((b,$)=>{s=e.rejectOnCancel?$:b,f&&!o&&(o=setTimeout(()=>{n&&a(n),o=null,b(d())},f)),n=setTimeout(()=>{o&&a(o),o=null,b(d())},c)})}}function hn(t=dt){const e=L(!0);function n(){e.value=!1}function o(){e.value=!0}const s=(...a)=>{e.value&&t(...a)};return{isActive:Ce(e),pause:n,resume:o,eventFilter:s}}function mn(...t){if(t.length!==1)return Ht(...t);const e=t[0];return typeof e=="function"?Ce(Et(()=>({get:e,set:ae}))):L(e)}var Je=Object.getOwnPropertySymbols,gn=Object.prototype.hasOwnProperty,yn=Object.prototype.propertyIsEnumerable,bn=(t,e)=>{var n={};for(var o in t)gn.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&Je)for(var o of Je(t))e.indexOf(o)<0&&yn.call(t,o)&&(n[o]=t[o]);return n};function _t(t,e,n={}){const o=n,{eventFilter:s=dt}=o,a=bn(o,["eventFilter"]);return U(t,pn(s,e),a)}var $n=Object.defineProperty,kn=Object.defineProperties,Pn=Object.getOwnPropertyDescriptors,me=Object.getOwnPropertySymbols,vt=Object.prototype.hasOwnProperty,pt=Object.prototype.propertyIsEnumerable,Xe=(t,e,n)=>e in t?$n(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,wn=(t,e)=>{for(var n in e||(e={}))vt.call(e,n)&&Xe(t,n,e[n]);if(me)for(var n of me(e))pt.call(e,n)&&Xe(t,n,e[n]);return t},Vn=(t,e)=>kn(t,Pn(e)),Sn=(t,e)=>{var n={};for(var o in t)vt.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&me)for(var o of me(t))e.indexOf(o)<0&&pt.call(t,o)&&(n[o]=t[o]);return n};function Fl(t,e,n={}){const o=n,{debounce:s=0,maxWait:a=void 0}=o,u=Sn(o,["debounce","maxWait"]);return _t(t,e,Vn(wn({},u),{eventFilter:fn(s,{maxWait:a})}))}var Ln=Object.defineProperty,Mn=Object.defineProperties,Tn=Object.getOwnPropertyDescriptors,ge=Object.getOwnPropertySymbols,ft=Object.prototype.hasOwnProperty,ht=Object.prototype.propertyIsEnumerable,Qe=(t,e,n)=>e in t?Ln(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,In=(t,e)=>{for(var n in e||(e={}))ft.call(e,n)&&Qe(t,n,e[n]);if(ge)for(var n of ge(e))ht.call(e,n)&&Qe(t,n,e[n]);return t},Nn=(t,e)=>Mn(t,Tn(e)),Cn=(t,e)=>{var n={};for(var o in t)ft.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&ge)for(var o of ge(t))e.indexOf(o)<0&&ht.call(t,o)&&(n[o]=t[o]);return n};function An(t,e,n={}){const o=n,{eventFilter:s}=o,a=Cn(o,["eventFilter"]),{eventFilter:u,pause:d,resume:c,isActive:f}=hn(s);return{stop:_t(t,e,Nn(In({},a),{eventFilter:u})),pause:d,resume:c,isActive:f}}function jl(t,e,n){let o;zt(n)?o={evaluating:n}:o=n||{};const{lazy:s=!1,evaluating:a=void 0,shallow:u=!0,onError:d=ae}=o,c=L(!s),f=u?le(e):L(e);let b=0;return ie(async $=>{if(!c.value)return;b++;const I=b;let S=!1;a&&Promise.resolve().then(()=>{a.value=!0});try{const k=await t(M=>{$(()=>{a&&(a.value=!1),S||M()})});I===b&&(f.value=k)}catch(k){d(k)}finally{a&&I===b&&(a.value=!1),S=!0}}),s?V(()=>(c.value=!0,f.value)):f}function Bn(t){var e;const n=R(t);return(e=n==null?void 0:n.$el)!=null?e:n}const K=ut?window:void 0;function re(...t){let e,n,o,s;if(typeof t[0]=="string"||Array.isArray(t[0])?([n,o,s]=t,e=K):[e,n,o,s]=t,!e)return ae;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const a=[],u=()=>{a.forEach(b=>b()),a.length=0},d=(b,$,I,S)=>(b.addEventListener($,I,S),()=>b.removeEventListener($,I,S)),c=U(()=>[Bn(e),R(s)],([b,$])=>{u(),b&&a.push(...n.flatMap(I=>o.map(S=>d(b,I,S,$))))},{immediate:!0,flush:"post"}),f=()=>{c(),u()};return Oe(f),f}function xn(t){return typeof t=="function"?t:typeof t=="string"?e=>e.key===t:Array.isArray(t)?e=>t.includes(e.key):()=>!0}function Ze(...t){let e,n,o={};t.length===3?(e=t[0],n=t[1],o=t[2]):t.length===2?typeof t[1]=="object"?(e=!0,n=t[0],o=t[1]):(e=t[0],n=t[1]):(e=!0,n=t[0]);const{target:s=K,eventName:a="keydown",passive:u=!1,dedupe:d=!1}=o,c=xn(e);return re(s,a,b=>{b.repeat&&R(d)||c(b)&&n(b)},u)}function On(){const t=L(!1);return Dt()&&F(()=>{t.value=!0}),t}function Hn(t){const e=On();return V(()=>(e.value,!!t()))}function Me(t,e={}){const{window:n=K}=e,o=Hn(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const a=L(!1),u=f=>{a.value=f.matches},d=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",u):s.removeListener(u))},c=ie(()=>{o.value&&(d(),s=n.matchMedia(R(t)),"addEventListener"in s?s.addEventListener("change",u):s.addListener(u),a.value=s.matches)});return Oe(()=>{c(),d(),s=void 0}),a}const _e=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ve="__vueuse_ssr_handlers__",En=Dn();function Dn(){return ve in _e||(_e[ve]=_e[ve]||{}),_e[ve]}function zn(t,e){return En[t]||e}function Fn(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}var jn=Object.defineProperty,et=Object.getOwnPropertySymbols,Gn=Object.prototype.hasOwnProperty,Rn=Object.prototype.propertyIsEnumerable,tt=(t,e,n)=>e in t?jn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,nt=(t,e)=>{for(var n in e||(e={}))Gn.call(e,n)&&tt(t,n,e[n]);if(et)for(var n of et(e))Rn.call(e,n)&&tt(t,n,e[n]);return t};const Un={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},ot="vueuse-storage";function mt(t,e,n,o={}){var s;const{flush:a="pre",deep:u=!0,listenToStorageChanges:d=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:b,window:$=K,eventFilter:I,onError:S=B=>{console.error(B)}}=o,k=(b?le:L)(e);if(!n)try{n=zn("getDefaultStorage",()=>{var B;return(B=K)==null?void 0:B.localStorage})()}catch(B){S(B)}if(!n)return k;const M=R(e),w=Fn(M),x=(s=o.serializer)!=null?s:Un[w],{pause:z,resume:D}=An(k,()=>ue(k.value),{flush:a,deep:u,eventFilter:I});return $&&d&&(re($,"storage",Ve),re($,ot,Nt)),Ve(),k;function ue(B){try{if(B==null)n.removeItem(t);else{const E=x.write(B),Y=n.getItem(t);Y!==E&&(n.setItem(t,E),$&&$.dispatchEvent(new CustomEvent(ot,{detail:{key:t,oldValue:Y,newValue:E,storageArea:n}})))}}catch(E){S(E)}}function de(B){const E=B?B.newValue:n.getItem(t);if(E==null)return c&&M!==null&&n.setItem(t,x.write(M)),M;if(!B&&f){const Y=x.read(E);return typeof f=="function"?f(Y,M):w==="object"&&!Array.isArray(Y)?nt(nt({},M),Y):Y}else return typeof E!="string"?E:x.read(E)}function Nt(B){Ve(B.detail)}function Ve(B){if(!(B&&B.storageArea!==n)){if(B&&B.key==null){k.value=M;return}if(!(B&&B.key!==t)){z();try{k.value=de(B)}catch(E){S(E)}finally{B?it(D):D()}}}}}function Gl(t,e,n={}){const{window:o=K}=n;return mt(t,e,o==null?void 0:o.localStorage,n)}function gt(t){const e=window.getComputedStyle(t);if(e.overflowX==="scroll"||e.overflowY==="scroll"||e.overflowX==="auto"&&t.clientWidth1?!0:(e.preventDefault&&e.preventDefault(),!1)}function Rl(t,e=!1){const n=L(e);let o=null,s;U(mn(t),d=>{if(d){const c=d;s=c.style.overflow,n.value&&(c.style.overflow="hidden")}},{immediate:!0});const a=()=>{const d=R(t);!d||n.value||(Ye&&(o=re(d,"touchmove",c=>{Wn(c)},{passive:!1})),d.style.overflow="hidden",n.value=!0)},u=()=>{const d=R(t);!d||!n.value||(Ye&&(o==null||o()),d.style.overflow=s,n.value=!1)};return Oe(u),V({get(){return n.value},set(d){d?a():u()}})}function Ul(t,e,n={}){const{window:o=K}=n;return mt(t,e,o==null?void 0:o.sessionStorage,n)}function yt({window:t=K}={}){if(!t)return{x:L(0),y:L(0)};const e=L(t.scrollX),n=L(t.scrollY);return re(t,"scroll",()=>{e.value=t.scrollX,n.value=t.scrollY},{capture:!1,passive:!0}),{x:e,y:n}}function bt(t,e){if(Array.isArray(t))return he(t);if(t==null)return[];e=Le(e);const n=Object.keys(t).sort((s,a)=>a.split("/").length-s.split("/").length).find(s=>e.startsWith(Le(s))),o=n?t[n]:[];return Array.isArray(o)?he(o):he(o.items,o.base)}function Kn(t){const e=[];let n=0;for(const o in t){const s=t[o];if(s.items){n=e.push(s);continue}e[n]||e.push({items:[]}),e[n].items.push(s)}return e}function qn(t){const e=[];function n(o){for(const s of o)s.text&&s.link&&e.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&n(s.items)}return n(t),e}function Te(t,e){return Array.isArray(e)?e.some(n=>Te(t,n)):ee(t,e.link)?!0:e.items?Te(t,e.items):!1}function he(t,e){return[...t].map(n=>{const o={...n},s=o.base||e;return s&&o.link&&(o.link=s+o.link),o.items&&(o.items=he(o.items,s)),o})}function W(){const{frontmatter:t,page:e,theme:n}=T(),o=Me("(min-width: 960px)"),s=L(!1),a=V(()=>{const k=n.value.sidebar,M=e.value.relativePath;return k?bt(k,M):[]}),u=V(()=>t.value.sidebar!==!1&&a.value.length>0&&t.value.layout!=="home"),d=V(()=>c?t.value.aside==null?n.value.aside==="left":t.value.aside==="left":!1),c=V(()=>t.value.layout==="home"?!1:t.value.aside!=null?!!t.value.aside:n.value.aside!==!1),f=V(()=>u.value&&o.value),b=V(()=>u.value?Kn(a.value):[]);function $(){s.value=!0}function I(){s.value=!1}function S(){s.value?I():$()}return{isOpen:s,sidebar:a,sidebarGroups:b,hasSidebar:u,hasAside:c,leftAside:d,isSidebarEnabled:f,open:$,close:I,toggle:S}}function Yn(t,e){let n;ie(()=>{n=t.value?document.activeElement:void 0}),F(()=>{window.addEventListener("keyup",o)}),Ae(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&t.value&&(e(),n==null||n.focus())}}const $t=L(ke?location.hash:"");ke&&window.addEventListener("hashchange",()=>{$t.value=location.hash});function Jn(t){const{page:e}=T(),n=L(!1),o=V(()=>t.value.collapsed!=null),s=V(()=>!!t.value.link),a=L(!1),u=()=>{a.value=ee(e.value.relativePath,t.value.link)};U([e,t,$t],u),F(u);const d=V(()=>a.value?!0:t.value.items?Te(e.value.relativePath,t.value.items):!1),c=V(()=>!!(t.value.items&&t.value.items.length));ie(()=>{n.value=!!(o.value&&t.value.collapsed)}),Be(()=>{(a.value||d.value)&&(n.value=!1)});function f(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:a,hasActiveLink:d,hasChildren:c,toggle:f}}function Xn(){const{hasSidebar:t}=W(),e=Me("(min-width: 960px)"),n=Me("(min-width: 1280px)");return{isAsideEnabled:V(()=>!n.value&&!e.value?!1:t.value?n.value:e.value)}}const Qn=71;function He(t){return typeof t.outline=="object"&&!Array.isArray(t.outline)&&t.outline.label||t.outlineTitle||"On this page"}function Ee(t){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{title:Zn(n),link:"#"+n.id,level:o}});return eo(e,t)}function Zn(t){let e="";for(const n of t.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor"))continue;e+=n.textContent}else n.nodeType===3&&(e+=n.textContent);return e.trim()}function eo(t,e){if(e===!1)return[];const n=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;t=t.filter(u=>u.level>=o&&u.level<=s);const a=[];e:for(let u=0;u=0;c--){const f=t[c];if(f.level{requestAnimationFrame(a),window.addEventListener("scroll",o)}),Ft(()=>{u(location.hash)}),Ae(()=>{window.removeEventListener("scroll",o)});function a(){if(!n.value)return;const d=[].slice.call(t.value.querySelectorAll(".outline-link")),c=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(S=>d.some(k=>k.hash===S.hash&&S.offsetParent!==null)),f=window.scrollY,b=window.innerHeight,$=document.body.offsetHeight,I=Math.abs(f+b-$)<1;if(c.length&&I){u(c[c.length-1].hash);return}for(let S=0;S{const s=Q("VPDocOutlineItem",!0);return r(),l("ul",{class:A(n.root?"root":"nested")},[(r(!0),l(C,null,O(n.headers,({children:a,link:u,title:d})=>(r(),l("li",null,[_("a",{class:"outline-link",href:u,onClick:e,title:d},N(d),9,oo),a!=null&&a.length?(r(),P(s,{key:0,headers:a},null,8,["headers"])):m("",!0)]))),256))],2)}}});const De=g(so,[["__scopeId","data-v-463da30f"]]),ao=t=>(j("data-v-c834746b"),t=t(),G(),t),ro={class:"content"},io={class:"outline-title"},lo={"aria-labelledby":"doc-outline-aria-label"},co=ao(()=>_("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),uo=y({__name:"VPDocAsideOutline",setup(t){const{frontmatter:e,theme:n}=T(),o=le([]);oe(()=>{o.value=Ee(e.value.outline??n.value.outline)});const s=L(),a=L();return to(s,a),(u,d)=>(r(),l("div",{class:A(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s},[_("div",ro,[_("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),_("div",io,N(i(He)(i(n))),1),_("nav",lo,[co,h(De,{headers:o.value,root:!0},null,8,["headers"])])])],2))}});const _o=g(uo,[["__scopeId","data-v-c834746b"]]),vo={class:"VPDocAsideCarbonAds"},po=y({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(t){const e=()=>null;return(n,o)=>(r(),l("div",vo,[h(i(e),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),fo=t=>(j("data-v-cb998dce"),t=t(),G(),t),ho={class:"VPDocAside"},mo=fo(()=>_("div",{class:"spacer"},null,-1)),go=y({__name:"VPDocAside",setup(t){const{theme:e}=T();return(n,o)=>(r(),l("div",ho,[v(n.$slots,"aside-top",{},void 0,!0),v(n.$slots,"aside-outline-before",{},void 0,!0),h(_o),v(n.$slots,"aside-outline-after",{},void 0,!0),mo,v(n.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(r(),P(po,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):m("",!0),v(n.$slots,"aside-ads-after",{},void 0,!0),v(n.$slots,"aside-bottom",{},void 0,!0)]))}});const yo=g(go,[["__scopeId","data-v-cb998dce"]]);function bo(){const{theme:t,page:e}=T();return V(()=>{const{text:n="Edit this page",pattern:o=""}=t.value.editLink||{};let s;return typeof o=="function"?s=o(e.value):s=o.replace(/:path/g,e.value.filePath),{url:s,text:n}})}function $o(){const{page:t,theme:e,frontmatter:n}=T();return V(()=>{var c,f,b,$,I,S,k,M;const o=bt(e.value.sidebar,t.value.relativePath),s=qn(o),a=s.findIndex(w=>ee(t.value.relativePath,w.link)),u=((c=e.value.docFooter)==null?void 0:c.prev)===!1&&!n.value.prev||n.value.prev===!1,d=((f=e.value.docFooter)==null?void 0:f.next)===!1&&!n.value.next||n.value.next===!1;return{prev:u?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=s[a-1])==null?void 0:b.docFooterText)??(($=s[a-1])==null?void 0:$.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((I=s[a-1])==null?void 0:I.link)},next:d?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((S=s[a+1])==null?void 0:S.docFooterText)??((k=s[a+1])==null?void 0:k.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((M=s[a+1])==null?void 0:M.link)}}})}const ko={},Po={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},wo=_("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Vo=_("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),So=[wo,Vo];function Lo(t,e){return r(),l("svg",Po,So)}const Mo=g(ko,[["render",Lo]]),q=y({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(t){const e=t,n=V(()=>e.tag??(e.href?"a":"span")),o=V(()=>e.href&<.test(e.href));return(s,a)=>(r(),P(X(n.value),{class:A(["VPLink",{link:s.href,"vp-external-link-icon":o.value,"no-icon":s.noIcon}]),href:s.href?i(se)(s.href):void 0,target:s.target??(o.value?"_blank":void 0),rel:s.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[v(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),To={class:"VPLastUpdated"},Io=["datetime"],No=y({__name:"VPDocFooterLastUpdated",setup(t){const{theme:e,page:n}=T(),o=V(()=>new Date(n.value.lastUpdated)),s=V(()=>o.value.toISOString()),a=L("");return F(()=>{ie(()=>{var u;a.value=new Intl.DateTimeFormat(void 0,((u=e.value.lastUpdated)==null?void 0:u.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(u,d)=>{var c;return r(),l("p",To,[H(N(((c=i(e).lastUpdated)==null?void 0:c.text)||i(e).lastUpdatedText||"Last updated")+": ",1),_("time",{datetime:s.value},N(a.value),9,Io)])}}});const Co=g(No,[["__scopeId","data-v-b89b6307"]]),Ao={key:0,class:"VPDocFooter"},Bo={key:0,class:"edit-info"},xo={key:0,class:"edit-link"},Oo={key:1,class:"last-updated"},Ho={key:1,class:"prev-next"},Eo={class:"pager"},Do=["href"],zo=["innerHTML"],Fo=["innerHTML"],jo={class:"pager"},Go=["href"],Ro=["innerHTML"],Uo=["innerHTML"],Wo=y({__name:"VPDocFooter",setup(t){const{theme:e,page:n,frontmatter:o}=T(),s=bo(),a=$o(),u=V(()=>e.value.editLink&&o.value.editLink!==!1),d=V(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),c=V(()=>u.value||d.value||a.value.prev||a.value.next);return(f,b)=>{var $,I,S,k,M,w;return c.value?(r(),l("footer",Ao,[v(f.$slots,"doc-footer-before",{},void 0,!0),u.value||d.value?(r(),l("div",Bo,[u.value?(r(),l("div",xo,[h(q,{class:"edit-link-button",href:i(s).url,"no-icon":!0},{default:p(()=>[h(Mo,{class:"edit-link-icon","aria-label":"edit icon"}),H(" "+N(i(s).text),1)]),_:1},8,["href"])])):m("",!0),d.value?(r(),l("div",Oo,[h(Co)])):m("",!0)])):m("",!0),($=i(a).prev)!=null&&$.link||(I=i(a).next)!=null&&I.link?(r(),l("nav",Ho,[_("div",Eo,[(S=i(a).prev)!=null&&S.link?(r(),l("a",{key:0,class:"pager-link prev",href:i(se)(i(a).prev.link)},[_("span",{class:"desc",innerHTML:((k=i(e).docFooter)==null?void 0:k.prev)||"Previous page"},null,8,zo),_("span",{class:"title",innerHTML:i(a).prev.text},null,8,Fo)],8,Do)):m("",!0)]),_("div",jo,[(M=i(a).next)!=null&&M.link?(r(),l("a",{key:0,class:"pager-link next",href:i(se)(i(a).next.link)},[_("span",{class:"desc",innerHTML:((w=i(e).docFooter)==null?void 0:w.next)||"Next page"},null,8,Ro),_("span",{class:"title",innerHTML:i(a).next.text},null,8,Uo)],8,Go)):m("",!0)])])):m("",!0)])):m("",!0)}}});const Ko=g(Wo,[["__scopeId","data-v-5774f702"]]),qo={},Yo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Jo=_("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Xo=[Jo];function Qo(t,e){return r(),l("svg",Yo,Xo)}const ze=g(qo,[["render",Qo]]),Zo={key:0,class:"VPDocOutlineDropdown"},es={key:0,class:"items"},ts=y({__name:"VPDocOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=T(),o=L(!1);oe(()=>{o.value=!1});const s=le([]);return oe(()=>{s.value=Ee(e.value.outline??n.value.outline)}),(a,u)=>s.value.length>0?(r(),l("div",Zo,[_("button",{onClick:u[0]||(u[0]=d=>o.value=!o.value),class:A({open:o.value})},[H(N(i(He)(i(n)))+" ",1),h(ze,{class:"icon"})],2),o.value?(r(),l("div",es,[h(De,{headers:s.value},null,8,["headers"])])):m("",!0)])):m("",!0)}});const ns=g(ts,[["__scopeId","data-v-0bc40447"]]),os=t=>(j("data-v-a3c25e27"),t=t(),G(),t),ss={class:"container"},as=os(()=>_("div",{class:"aside-curtain"},null,-1)),rs={class:"aside-container"},is={class:"aside-content"},ls={class:"content"},cs={class:"content-container"},us={class:"main"},ds=y({__name:"VPDoc",setup(t){const{theme:e}=T(),n=Pe(),{hasSidebar:o,hasAside:s,leftAside:a}=W(),u=V(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,c)=>{const f=Q("Content");return r(),l("div",{class:A(["VPDoc",{"has-sidebar":i(o),"has-aside":i(s)}])},[v(d.$slots,"doc-top",{},void 0,!0),_("div",ss,[i(s)?(r(),l("div",{key:0,class:A(["aside",{"left-aside":i(a)}])},[as,_("div",rs,[_("div",is,[h(yo,null,{"aside-top":p(()=>[v(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),_("div",ls,[_("div",cs,[v(d.$slots,"doc-before",{},void 0,!0),h(ns),_("main",us,[h(f,{class:A(["vp-doc",[u.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(Ko,null,{"doc-footer-before":p(()=>[v(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),v(d.$slots,"doc-after",{},void 0,!0)])])]),v(d.$slots,"doc-bottom",{},void 0,!0)],2)}}});const _s=g(ds,[["__scopeId","data-v-a3c25e27"]]),vs=y({__name:"VPButton",props:{tag:{},size:{},theme:{},text:{},href:{}},setup(t){const e=t,n=V(()=>[e.size??"medium",e.theme??"brand"]),o=V(()=>e.href&<.test(e.href)),s=V(()=>e.tag?e.tag:e.href?"a":"button");return(a,u)=>(r(),P(X(s.value),{class:A(["VPButton",n.value]),href:a.href?i(se)(a.href):void 0,target:o.value?"_blank":void 0,rel:o.value?"noreferrer":void 0},{default:p(()=>[H(N(a.text),1)]),_:1},8,["class","href","target","rel"]))}});const ps=g(vs,[["__scopeId","data-v-fa1633a1"]]),fs=["src","alt"],hs=y({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=Q("VPImage",!0);return e.image?(r(),l(C,{key:0},[typeof e.image=="string"||"src"in e.image?(r(),l("img",pe({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(Ne)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,fs)):(r(),l(C,{key:1},[h(o,pe({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,pe({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}});const Fe=g(hs,[["__scopeId","data-v-ab19afbb"]]),ms=t=>(j("data-v-5a3e9999"),t=t(),G(),t),gs={class:"container"},ys={class:"main"},bs={key:0,class:"name"},$s=["innerHTML"],ks=["innerHTML"],Ps=["innerHTML"],ws={key:0,class:"actions"},Vs={key:0,class:"image"},Ss={class:"image-container"},Ls=ms(()=>_("div",{class:"image-bg"},null,-1)),Ms=y({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(t){const e=xe("hero-image-slot-exists");return(n,o)=>(r(),l("div",{class:A(["VPHero",{"has-image":n.image||i(e)}])},[_("div",gs,[_("div",ys,[v(n.$slots,"home-hero-info",{},()=>[n.name?(r(),l("h1",bs,[_("span",{innerHTML:n.name,class:"clip"},null,8,$s)])):m("",!0),n.text?(r(),l("p",{key:1,innerHTML:n.text,class:"text"},null,8,ks)):m("",!0),n.tagline?(r(),l("p",{key:2,innerHTML:n.tagline,class:"tagline"},null,8,Ps)):m("",!0)],!0),n.actions?(r(),l("div",ws,[(r(!0),l(C,null,O(n.actions,s=>(r(),l("div",{key:s.link,class:"action"},[h(ps,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):m("",!0)]),n.image||i(e)?(r(),l("div",Vs,[_("div",Ss,[Ls,v(n.$slots,"home-hero-image",{},()=>[n.image?(r(),P(Fe,{key:0,class:"image-src",image:n.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}});const Ts=g(Ms,[["__scopeId","data-v-5a3e9999"]]),Is=y({__name:"VPHomeHero",setup(t){const{frontmatter:e}=T();return(n,o)=>i(e).hero?(r(),P(Ts,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":p(()=>[v(n.$slots,"home-hero-info")]),"home-hero-image":p(()=>[v(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),Ns={},Cs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},As=_("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Bs=[As];function xs(t,e){return r(),l("svg",Cs,Bs)}const Os=g(Ns,[["render",xs]]),Hs={class:"box"},Es=["innerHTML"],Ds=["innerHTML"],zs=["innerHTML"],Fs={key:3,class:"link-text"},js={class:"link-text-value"},Gs=y({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{}},setup(t){return(e,n)=>(r(),P(q,{class:"VPFeature",href:e.link,rel:e.rel,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[_("article",Hs,[typeof e.icon=="object"?(r(),P(Fe,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(r(),l("div",{key:1,class:"icon",innerHTML:e.icon},null,8,Es)):m("",!0),_("h2",{class:"title",innerHTML:e.title},null,8,Ds),e.details?(r(),l("p",{key:2,class:"details",innerHTML:e.details},null,8,zs)):m("",!0),e.linkText?(r(),l("div",Fs,[_("p",js,[H(N(e.linkText)+" ",1),h(Os,{class:"link-text-icon"})])])):m("",!0)])]),_:1},8,["href","rel","tag"]))}});const Rs=g(Gs,[["__scopeId","data-v-aeb6d69c"]]),Us={key:0,class:"VPFeatures"},Ws={class:"container"},Ks={class:"items"},qs=y({__name:"VPFeatures",props:{features:{}},setup(t){const e=t,n=V(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,s)=>o.features?(r(),l("div",Us,[_("div",Ws,[_("div",Ks,[(r(!0),l(C,null,O(o.features,a=>(r(),l("div",{key:a.title,class:A(["item",[n.value]])},[h(Rs,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel},null,8,["icon","title","details","link","link-text","rel"])],2))),128))])])])):m("",!0)}});const Ys=g(qs,[["__scopeId","data-v-7e232fde"]]),Js=y({__name:"VPHomeFeatures",setup(t){const{frontmatter:e}=T();return(n,o)=>i(e).features?(r(),P(Ys,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):m("",!0)}}),Xs={class:"VPHome"},Qs=y({__name:"VPHome",setup(t){return(e,n)=>{const o=Q("Content");return r(),l("div",Xs,[v(e.$slots,"home-hero-before",{},void 0,!0),h(Is,null,{"home-hero-info":p(()=>[v(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),v(e.$slots,"home-hero-after",{},void 0,!0),v(e.$slots,"home-features-before",{},void 0,!0),h(Js),v(e.$slots,"home-features-after",{},void 0,!0),h(o)])}}});const Zs=g(Qs,[["__scopeId","data-v-20eabd3a"]]),ea={},ta={class:"VPPage"};function na(t,e){const n=Q("Content");return r(),l("div",ta,[v(t.$slots,"page-top"),h(n),v(t.$slots,"page-bottom")])}const oa=g(ea,[["render",na]]),sa=y({__name:"VPContent",setup(t){const{page:e,frontmatter:n}=T(),{hasSidebar:o}=W();return(s,a)=>(r(),l("div",{class:A(["VPContent",{"has-sidebar":i(o),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?v(s.$slots,"not-found",{key:0},()=>[h(_n)],!0):i(n).layout==="page"?(r(),P(oa,{key:1},{"page-top":p(()=>[v(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(r(),P(Zs,{key:2},{"home-hero-before":p(()=>[v(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(r(),P(X(i(n).layout),{key:3})):(r(),P(_s,{key:4},{"doc-top":p(()=>[v(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[v(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[v(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[v(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[v(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const aa=g(sa,[["__scopeId","data-v-3cf691b6"]]),ra={class:"container"},ia=["innerHTML"],la=["innerHTML"],ca=y({__name:"VPFooter",setup(t){const{theme:e,frontmatter:n}=T(),{hasSidebar:o}=W();return(s,a)=>i(e).footer&&i(n).footer!==!1?(r(),l("footer",{key:0,class:A(["VPFooter",{"has-sidebar":i(o)}])},[_("div",ra,[i(e).footer.message?(r(),l("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,ia)):m("",!0),i(e).footer.copyright?(r(),l("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,la)):m("",!0)])],2)):m("",!0)}});const ua=g(ca,[["__scopeId","data-v-e4279f1c"]]),da={class:"header"},_a={class:"outline"},va=y({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(t){const e=t,{theme:n}=T(),o=L(!1),s=L(0),a=L();oe(()=>{o.value=!1});function u(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function d(f){f.target.classList.contains("outline-link")&&(a.value&&(a.value.style.transition="none"),it(()=>{o.value=!1}))}function c(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(f,b)=>(r(),l("div",{class:"VPLocalNavOutlineDropdown",style:ct({"--vp-vh":s.value+"px"})},[f.headers.length>0?(r(),l("button",{key:0,onClick:u,class:A({open:o.value})},[H(N(i(He)(i(n)))+" ",1),h(ze,{class:"icon"})],2)):(r(),l("button",{key:1,onClick:c},N(i(n).returnToTopLabel||"Return to top"),1)),h(Ie,{name:"flyout"},{default:p(()=>[o.value?(r(),l("div",{key:0,ref_key:"items",ref:a,class:"items",onClick:d},[_("div",da,[_("a",{class:"top-link",href:"#",onClick:c},N(i(n).returnToTopLabel||"Return to top"),1)]),_("div",_a,[h(De,{headers:f.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}});const pa=g(va,[["__scopeId","data-v-e8ae7d87"]]),fa={},ha={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ma=_("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),ga=_("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),ya=_("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),ba=_("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),$a=[ma,ga,ya,ba];function ka(t,e){return r(),l("svg",ha,$a)}const Pa=g(fa,[["render",ka]]),wa=["aria-expanded"],Va={class:"menu-text"},Sa=y({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(t){const{theme:e,frontmatter:n}=T(),{hasSidebar:o}=W(),{y:s}=yt(),a=le([]),u=L(0);F(()=>{u.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),oe(()=>{a.value=Ee(n.value.outline??e.value.outline)});const d=V(()=>a.value.length===0&&!o.value),c=V(()=>({VPLocalNav:!0,fixed:d.value,"reached-top":s.value>=u.value}));return(f,b)=>i(n).layout!=="home"&&(!d.value||i(s)>=u.value)?(r(),l("div",{key:0,class:A(c.value)},[i(o)?(r(),l("button",{key:0,class:"menu","aria-expanded":f.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=$=>f.$emit("open-menu"))},[h(Pa,{class:"menu-icon"}),_("span",Va,N(i(e).sidebarMenuLabel||"Menu"),1)],8,wa)):m("",!0),h(pa,{headers:a.value,navHeight:u.value},null,8,["headers","navHeight"])],2)):m("",!0)}});const La=g(Sa,[["__scopeId","data-v-693d654a"]]);function Ma(){const t=L(!1);function e(){t.value=!0,window.addEventListener("resize",s)}function n(){t.value=!1,window.removeEventListener("resize",s)}function o(){t.value?n():e()}function s(){window.outerWidth>=768&&n()}const a=Pe();return U(()=>a.path,n),{isScreenOpen:t,openScreen:e,closeScreen:n,toggleScreen:o}}const Ta={},Ia={class:"VPSwitch",type:"button",role:"switch"},Na={class:"check"},Ca={key:0,class:"icon"};function Aa(t,e){return r(),l("button",Ia,[_("span",Na,[t.$slots.default?(r(),l("span",Ca,[v(t.$slots,"default",{},void 0,!0)])):m("",!0)])])}const Ba=g(Ta,[["render",Aa],["__scopeId","data-v-92d8f6fb"]]),xa={},Oa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ha=jt('',9),Ea=[Ha];function Da(t,e){return r(),l("svg",Oa,Ea)}const za=g(xa,[["render",Da]]),Fa={},ja={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ga=_("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Ra=[Ga];function Ua(t,e){return r(),l("svg",ja,Ra)}const Wa=g(Fa,[["render",Ua]]),Ka=y({__name:"VPSwitchAppearance",setup(t){const{site:e,isDark:n}=T(),o=L(!1),s=ke?a():()=>{};F(()=>{o.value=document.documentElement.classList.contains("dark")});function a(){const u=window.matchMedia("(prefers-color-scheme: dark)"),d=document.documentElement.classList;let c=localStorage.getItem(qe),f=e.value.appearance==="dark"&&c==null||(c==="auto"||c==null?u.matches:c==="dark");u.onchange=I=>{c==="auto"&&$(f=I.matches)};function b(){$(f=!f),c=f?u.matches?"auto":"dark":u.matches?"light":"auto",localStorage.setItem(qe,c)}function $(I){const S=document.createElement("style");S.type="text/css",S.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; +}`)),document.head.appendChild(S),o.value=I,d[I?"add":"remove"]("dark"),window.getComputedStyle(S).opacity,document.head.removeChild(S)}return b}return U(o,u=>{n.value=u}),(u,d)=>(r(),P(Ba,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":o.value,onClick:i(s)},{default:p(()=>[h(za,{class:"sun"}),h(Wa,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const je=g(Ka,[["__scopeId","data-v-a99ed743"]]),qa={key:0,class:"VPNavBarAppearance"},Ya=y({__name:"VPNavBarAppearance",setup(t){const{site:e}=T();return(n,o)=>i(e).appearance?(r(),l("div",qa,[h(je)])):m("",!0)}});const Ja=g(Ya,[["__scopeId","data-v-5e9f0637"]]),Ge=L();let kt=!1,Se=0;function Xa(t){const e=L(!1);if(ke){!kt&&Qa(),Se++;const n=U(Ge,o=>{var s,a,u;o===t.el.value||(s=t.el.value)!=null&&s.contains(o)?(e.value=!0,(a=t.onFocus)==null||a.call(t)):(e.value=!1,(u=t.onBlur)==null||u.call(t))});Ae(()=>{n(),Se--,Se||Za()})}return Ce(e)}function Qa(){document.addEventListener("focusin",Pt),kt=!0,Ge.value=document.activeElement}function Za(){document.removeEventListener("focusin",Pt)}function Pt(){Ge.value=document.activeElement}const er={},tr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},nr=_("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),or=[nr];function sr(t,e){return r(),l("svg",tr,or)}const wt=g(er,[["render",sr]]),ar={},rr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ir=_("circle",{cx:"12",cy:"12",r:"2"},null,-1),lr=_("circle",{cx:"19",cy:"12",r:"2"},null,-1),cr=_("circle",{cx:"5",cy:"12",r:"2"},null,-1),ur=[ir,lr,cr];function dr(t,e){return r(),l("svg",rr,ur)}const _r=g(ar,[["render",dr]]),vr={class:"VPMenuLink"},pr=y({__name:"VPMenuLink",props:{item:{}},setup(t){const{page:e}=T();return(n,o)=>(r(),l("div",vr,[h(q,{class:A({active:i(ee)(i(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:p(()=>[H(N(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const we=g(pr,[["__scopeId","data-v-2a4d50e5"]]),fr={class:"VPMenuGroup"},hr={key:0,class:"title"},mr=y({__name:"VPMenuGroup",props:{text:{},items:{}},setup(t){return(e,n)=>(r(),l("div",fr,[e.text?(r(),l("p",hr,N(e.text),1)):m("",!0),(r(!0),l(C,null,O(e.items,o=>(r(),l(C,null,["link"in o?(r(),P(we,{key:0,item:o},null,8,["item"])):m("",!0)],64))),256))]))}});const gr=g(mr,[["__scopeId","data-v-a6b0397c"]]),yr={class:"VPMenu"},br={key:0,class:"items"},$r=y({__name:"VPMenu",props:{items:{}},setup(t){return(e,n)=>(r(),l("div",yr,[e.items?(r(),l("div",br,[(r(!0),l(C,null,O(e.items,o=>(r(),l(C,{key:o.text},["link"in o?(r(),P(we,{key:0,item:o},null,8,["item"])):(r(),P(gr,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0),v(e.$slots,"default",{},void 0,!0)]))}});const kr=g($r,[["__scopeId","data-v-e42ed9b3"]]),Pr=["aria-expanded","aria-label"],wr={key:0,class:"text"},Vr=["innerHTML"],Sr={class:"menu"},Lr=y({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(t){const e=L(!1),n=L();Xa({el:n,onBlur:o});function o(){e.value=!1}return(s,a)=>(r(),l("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:a[1]||(a[1]=u=>e.value=!0),onMouseleave:a[2]||(a[2]=u=>e.value=!1)},[_("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:a[0]||(a[0]=u=>e.value=!e.value)},[s.button||s.icon?(r(),l("span",wr,[s.icon?(r(),P(X(s.icon),{key:0,class:"option-icon"})):m("",!0),s.button?(r(),l("span",{key:1,innerHTML:s.button},null,8,Vr)):m("",!0),h(wt,{class:"text-icon"})])):(r(),P(_r,{key:1,class:"icon"}))],8,Pr),_("div",Sr,[h(kr,{items:s.items},{default:p(()=>[v(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const Re=g(Lr,[["__scopeId","data-v-6b19ffdd"]]),Mr={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},Tr=["href","aria-label","innerHTML"],Ir=y({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(t){const e=t,n=V(()=>typeof e.icon=="object"?e.icon.svg:Mr[e.icon]);return(o,s)=>(r(),l("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,Tr))}});const Nr=g(Ir,[["__scopeId","data-v-16cf740a"]]),Cr={class:"VPSocialLinks"},Ar=y({__name:"VPSocialLinks",props:{links:{}},setup(t){return(e,n)=>(r(),l("div",Cr,[(r(!0),l(C,null,O(e.links,({link:o,icon:s,ariaLabel:a})=>(r(),P(Nr,{key:o,icon:s,link:o,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}});const Ue=g(Ar,[["__scopeId","data-v-e71e869c"]]),Br={key:0,class:"group translations"},xr={class:"trans-title"},Or={key:1,class:"group"},Hr={class:"item appearance"},Er={class:"label"},Dr={class:"appearance-action"},zr={key:2,class:"group"},Fr={class:"item social-links"},jr=y({__name:"VPNavBarExtra",setup(t){const{site:e,theme:n}=T(),{localeLinks:o,currentLang:s}=ce({correspondingLink:!0}),a=V(()=>o.value.length&&s.value.label||e.value.appearance||n.value.socialLinks);return(u,d)=>a.value?(r(),P(Re,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(o).length&&i(s).label?(r(),l("div",Br,[_("p",xr,N(i(s).label),1),(r(!0),l(C,null,O(i(o),c=>(r(),P(we,{key:c.link,item:c},null,8,["item"]))),128))])):m("",!0),i(e).appearance?(r(),l("div",Or,[_("div",Hr,[_("p",Er,N(i(n).darkModeSwitchLabel||"Appearance"),1),_("div",Dr,[h(je)])])])):m("",!0),i(n).socialLinks?(r(),l("div",zr,[_("div",Fr,[h(Ue,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}});const Gr=g(jr,[["__scopeId","data-v-c8c2ae4b"]]),Rr=t=>(j("data-v-6bee1efd"),t=t(),G(),t),Ur=["aria-expanded"],Wr=Rr(()=>_("span",{class:"container"},[_("span",{class:"top"}),_("span",{class:"middle"}),_("span",{class:"bottom"})],-1)),Kr=[Wr],qr=y({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(t){return(e,n)=>(r(),l("button",{type:"button",class:A(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>e.$emit("click"))},Kr,10,Ur))}});const Yr=g(qr,[["__scopeId","data-v-6bee1efd"]]),Jr=["innerHTML"],Xr=y({__name:"VPNavBarMenuLink",props:{item:{}},setup(t){const{page:e}=T();return(n,o)=>(r(),P(q,{class:A({VPNavBarMenuLink:!0,active:i(ee)(i(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:p(()=>[_("span",{innerHTML:n.item.text},null,8,Jr)]),_:1},8,["class","href","target","rel"]))}});const Qr=g(Xr,[["__scopeId","data-v-e5ab8091"]]),Zr=y({__name:"VPNavBarMenuGroup",props:{item:{}},setup(t){const{page:e}=T();return(n,o)=>(r(),P(Re,{class:A({VPNavBarMenuGroup:!0,active:i(ee)(i(e).relativePath,n.item.activeMatch,!!n.item.activeMatch)}),button:n.item.text,items:n.item.items},null,8,["class","button","items"]))}}),ei=t=>(j("data-v-f732b5d0"),t=t(),G(),t),ti={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},ni=ei(()=>_("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),oi=y({__name:"VPNavBarMenu",setup(t){const{theme:e}=T();return(n,o)=>i(e).nav?(r(),l("nav",ti,[ni,(r(!0),l(C,null,O(i(e).nav,s=>(r(),l(C,{key:s.text},["link"in s?(r(),P(Qr,{key:0,item:s},null,8,["item"])):(r(),P(Zr,{key:1,item:s},null,8,["item"]))],64))),128))])):m("",!0)}});const si=g(oi,[["__scopeId","data-v-f732b5d0"]]);const ai={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},ri={class:"DocSearch-Button-Container"},ii=_("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[_("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),li={class:"DocSearch-Button-Placeholder"},ci=_("span",{class:"DocSearch-Button-Keys"},[_("kbd",{class:"DocSearch-Button-Key"}),_("kbd",{class:"DocSearch-Button-Key"},"K")],-1),at=y({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(t){return(e,n)=>(r(),l("button",ai,[_("span",ri,[ii,_("span",li,N(e.placeholder),1)]),ci]))}});const ui={id:"local-search"},di={key:1,id:"docsearch"},_i=y({__name:"VPNavBarSearch",setup(t){const e=Gt(()=>Rt(()=>import("./VPLocalSearchBox.2bf1f725.js"),["assets/chunks/VPLocalSearchBox.2bf1f725.js","assets/chunks/framework.6e839c56.js"])),n=()=>null,{theme:o,localeIndex:s}=T(),a=L(!1),u=L(!1),d=V(()=>{var M,w,x,z,D,ue,de;const k=((M=o.value.search)==null?void 0:M.options)??o.value.algolia;return((D=(z=(x=(w=k==null?void 0:k.locales)==null?void 0:w[s.value])==null?void 0:x.translations)==null?void 0:z.button)==null?void 0:D.buttonText)||((de=(ue=k==null?void 0:k.translations)==null?void 0:ue.button)==null?void 0:de.buttonText)||"Search"});F(()=>{});function c(){a.value||(a.value=!0,setTimeout(f,16))}function f(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function b(k){const M=k.target,w=M.tagName;return M.isContentEditable||w==="INPUT"||w==="SELECT"||w==="TEXTAREA"}const $=L(!1);Ze("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),$.value=!0)}),Ze("/",k=>{b(k)||(k.preventDefault(),$.value=!0)});const I=L("'Meta'");F(()=>{I.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'"});const S="local";return(k,M)=>{var w;return r(),l("div",{class:"VPNavBarSearch",style:ct({"--vp-meta-key":I.value})},[i(S)==="local"?(r(),l(C,{key:0},[$.value?(r(),P(i(e),{key:0,placeholder:d.value,onClose:M[0]||(M[0]=x=>$.value=!1)},null,8,["placeholder"])):m("",!0),_("div",ui,[h(at,{placeholder:d.value,onClick:M[1]||(M[1]=x=>$.value=!0)},null,8,["placeholder"])])],64)):i(S)==="algolia"?(r(),l(C,{key:1},[a.value?(r(),P(i(n),{key:0,algolia:((w=i(o).search)==null?void 0:w.options)??i(o).algolia,onVnodeBeforeMount:M[2]||(M[2]=x=>u.value=!0)},null,8,["algolia"])):m("",!0),u.value?m("",!0):(r(),l("div",di,[h(at,{placeholder:d.value,onClick:c},null,8,["placeholder"])]))],64)):m("",!0)],4)}}});const vi=y({__name:"VPNavBarSocialLinks",setup(t){const{theme:e}=T();return(n,o)=>i(e).socialLinks?(r(),P(Ue,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):m("",!0)}});const pi=g(vi,[["__scopeId","data-v-ef6192dc"]]),fi=["href"],hi=y({__name:"VPNavBarTitle",setup(t){const{site:e,theme:n}=T(),{hasSidebar:o}=W(),{currentLang:s}=ce();return(a,u)=>(r(),l("div",{class:A(["VPNavBarTitle",{"has-sidebar":i(o)}])},[_("a",{class:"title",href:i(n).logoLink??i(se)(i(s).link)},[v(a.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(r(),P(Fe,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(r(),l(C,{key:1},[H(N(i(n).siteTitle),1)],64)):i(n).siteTitle===void 0?(r(),l(C,{key:2},[H(N(i(e).title),1)],64)):m("",!0),v(a.$slots,"nav-bar-title-after",{},void 0,!0)],8,fi)],2))}});const mi=g(hi,[["__scopeId","data-v-2973dbb4"]]),gi={},yi={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},bi=_("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),$i=_("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),ki=[bi,$i];function Pi(t,e){return r(),l("svg",yi,ki)}const Vt=g(gi,[["render",Pi]]),wi={class:"items"},Vi={class:"title"},Si=y({__name:"VPNavBarTranslations",setup(t){const{theme:e}=T(),{localeLinks:n,currentLang:o}=ce({correspondingLink:!0});return(s,a)=>i(n).length&&i(o).label?(r(),P(Re,{key:0,class:"VPNavBarTranslations",icon:Vt,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[_("div",wi,[_("p",Vi,N(i(o).label),1),(r(!0),l(C,null,O(i(n),u=>(r(),P(we,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}});const Li=g(Si,[["__scopeId","data-v-ff4524ae"]]),Mi=t=>(j("data-v-c8ceaf10"),t=t(),G(),t),Ti={class:"container"},Ii={class:"title"},Ni={class:"content"},Ci=Mi(()=>_("div",{class:"curtain"},null,-1)),Ai={class:"content-body"},Bi=y({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(t){const{y:e}=yt(),{hasSidebar:n}=W(),{frontmatter:o}=T(),s=L({});return Be(()=>{var a;s.value={"has-sidebar":n.value,top:((a=o.value)==null?void 0:a.layout)==="home"&&e.value===0}}),(a,u)=>(r(),l("div",{class:A(["VPNavBar",s.value])},[_("div",Ti,[_("div",Ii,[h(mi,null,{"nav-bar-title-before":p(()=>[v(a.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(a.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),_("div",Ni,[Ci,_("div",Ai,[v(a.$slots,"nav-bar-content-before",{},void 0,!0),h(_i,{class:"search"}),h(si,{class:"menu"}),h(Li,{class:"translations"}),h(Ja,{class:"appearance"}),h(pi,{class:"social-links"}),h(Gr,{class:"extra"}),v(a.$slots,"nav-bar-content-after",{},void 0,!0),h(Yr,{class:"hamburger",active:a.isScreenOpen,onClick:u[0]||(u[0]=d=>a.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const xi=g(Bi,[["__scopeId","data-v-c8ceaf10"]]);function Oi(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1),Z=[],be=!1,Ke=-1,te=void 0,J=void 0,ne=void 0,St=function(e){return Z.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(e))})},$e=function(e){var n=e||window.event;return St(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},Hi=function(e){if(ne===void 0){var n=!!e&&e.reserveScrollBarGap===!0,o=window.innerWidth-document.documentElement.clientWidth;if(n&&o>0){var s=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);ne=document.body.style.paddingRight,document.body.style.paddingRight=s+o+"px"}}te===void 0&&(te=document.body.style.overflow,document.body.style.overflow="hidden")},Ei=function(){ne!==void 0&&(document.body.style.paddingRight=ne,ne=void 0),te!==void 0&&(document.body.style.overflow=te,te=void 0)},Di=function(){return window.requestAnimationFrame(function(){if(J===void 0){J={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,n=e.scrollY,o=e.scrollX,s=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-o,setTimeout(function(){return window.requestAnimationFrame(function(){var a=s-window.innerHeight;a&&n>=s&&(document.body.style.top=-(n+a))})},300)}})},zi=function(){if(J!==void 0){var e=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=J.position,document.body.style.top=J.top,document.body.style.left=J.left,window.scrollTo(n,e),J=void 0}},Fi=function(e){return e?e.scrollHeight-e.scrollTop<=e.clientHeight:!1},ji=function(e,n){var o=e.targetTouches[0].clientY-Ke;return St(e.target)?!1:n&&n.scrollTop===0&&o>0||Fi(n)&&o<0?$e(e):(e.stopPropagation(),!0)},Lt=function(e,n){if(!e){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!Z.some(function(s){return s.targetElement===e})){var o={targetElement:e,options:n||{}};Z=[].concat(Oi(Z),[o]),ye?Di():Hi(n),ye&&(e.ontouchstart=function(s){s.targetTouches.length===1&&(Ke=s.targetTouches[0].clientY)},e.ontouchmove=function(s){s.targetTouches.length===1&&ji(s,e)},be||(document.addEventListener("touchmove",$e,We?{passive:!1}:void 0),be=!0))}},Mt=function(){ye&&(Z.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),be&&(document.removeEventListener("touchmove",$e,We?{passive:!1}:void 0),be=!1),Ke=-1),ye?zi():Ei(),Z=[]};const Gi=y({__name:"VPNavScreenMenuLink",props:{item:{}},setup(t){const e=xe("close-screen");return(n,o)=>(r(),P(q,{class:"VPNavScreenMenuLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:i(e)},{default:p(()=>[H(N(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const Ri=g(Gi,[["__scopeId","data-v-08b49756"]]),Ui={},Wi={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ki=_("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),qi=[Ki];function Yi(t,e){return r(),l("svg",Wi,qi)}const Ji=g(Ui,[["render",Yi]]),Xi=y({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(t){const e=xe("close-screen");return(n,o)=>(r(),P(q,{class:"VPNavScreenMenuGroupLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:i(e)},{default:p(()=>[H(N(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const Tt=g(Xi,[["__scopeId","data-v-97083fb3"]]),Qi={class:"VPNavScreenMenuGroupSection"},Zi={key:0,class:"title"},el=y({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(t){return(e,n)=>(r(),l("div",Qi,[e.text?(r(),l("p",Zi,N(e.text),1)):m("",!0),(r(!0),l(C,null,O(e.items,o=>(r(),P(Tt,{key:o.text,item:o},null,8,["item"]))),128))]))}});const tl=g(el,[["__scopeId","data-v-f60dbfa7"]]),nl=["aria-controls","aria-expanded"],ol={class:"button-text"},sl=["id"],al={key:1,class:"group"},rl=y({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(t){const e=t,n=L(!1),o=V(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(a,u)=>(r(),l("div",{class:A(["VPNavScreenMenuGroup",{open:n.value}])},[_("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[_("span",ol,N(a.text),1),h(Ji,{class:"button-icon"})],8,nl),_("div",{id:o.value,class:"items"},[(r(!0),l(C,null,O(a.items,d=>(r(),l(C,{key:d.text},["link"in d?(r(),l("div",{key:d.text,class:"item"},[h(Tt,{item:d},null,8,["item"])])):(r(),l("div",al,[h(tl,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,sl)],2))}});const il=g(rl,[["__scopeId","data-v-10e00a88"]]),ll={key:0,class:"VPNavScreenMenu"},cl=y({__name:"VPNavScreenMenu",setup(t){const{theme:e}=T();return(n,o)=>i(e).nav?(r(),l("nav",ll,[(r(!0),l(C,null,O(i(e).nav,s=>(r(),l(C,{key:s.text},["link"in s?(r(),P(Ri,{key:0,item:s},null,8,["item"])):(r(),P(il,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),ul={key:0,class:"VPNavScreenAppearance"},dl={class:"text"},_l=y({__name:"VPNavScreenAppearance",setup(t){const{site:e,theme:n}=T();return(o,s)=>i(e).appearance?(r(),l("div",ul,[_("p",dl,N(i(n).darkModeSwitchLabel||"Appearance"),1),h(je)])):m("",!0)}});const vl=g(_l,[["__scopeId","data-v-0dc5cf49"]]),pl={class:"list"},fl=y({__name:"VPNavScreenTranslations",setup(t){const{localeLinks:e,currentLang:n}=ce({correspondingLink:!0}),o=L(!1);function s(){o.value=!o.value}return(a,u)=>i(e).length&&i(n).label?(r(),l("div",{key:0,class:A(["VPNavScreenTranslations",{open:o.value}])},[_("button",{class:"title",onClick:s},[h(Vt,{class:"icon lang"}),H(" "+N(i(n).label)+" ",1),h(wt,{class:"icon chevron"})]),_("ul",pl,[(r(!0),l(C,null,O(i(e),d=>(r(),l("li",{key:d.link,class:"item"},[h(q,{class:"link",href:d.link},{default:p(()=>[H(N(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}});const hl=g(fl,[["__scopeId","data-v-41505286"]]),ml=y({__name:"VPNavScreenSocialLinks",setup(t){const{theme:e}=T();return(n,o)=>i(e).socialLinks?(r(),P(Ue,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):m("",!0)}}),gl={class:"container"},yl=y({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(t){const e=L(null);function n(){Lt(e.value,{reserveScrollBarGap:!0})}function o(){Mt()}return(s,a)=>(r(),P(Ie,{name:"fade",onEnter:n,onAfterLeave:o},{default:p(()=>[s.open?(r(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[_("div",gl,[v(s.$slots,"nav-screen-content-before",{},void 0,!0),h(cl,{class:"menu"}),h(hl,{class:"translations"}),h(vl,{class:"appearance"}),h(ml,{class:"social-links"}),v(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}});const bl=g(yl,[["__scopeId","data-v-dc785598"]]),$l={class:"VPNav"},kl=y({__name:"VPNav",setup(t){const{isScreenOpen:e,closeScreen:n,toggleScreen:o}=Ma();return fe("close-screen",n),(s,a)=>(r(),l("header",$l,[h(xi,{"is-screen-open":i(e),onToggleScreen:i(o)},{"nav-bar-title-before":p(()=>[v(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(bl,{open:i(e)},{"nav-screen-content-before":p(()=>[v(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const Pl=g(kl,[["__scopeId","data-v-5bdc5df3"]]),wl=t=>(j("data-v-c356ab37"),t=t(),G(),t),Vl=["role","tabindex"],Sl=wl(()=>_("div",{class:"indicator"},null,-1)),Ll=["onKeydown"],Ml={key:1,class:"items"},Tl=y({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(t){const e=t,{collapsed:n,collapsible:o,isLink:s,isActiveLink:a,hasActiveLink:u,hasChildren:d,toggle:c}=Jn(V(()=>e.item)),f=V(()=>d.value?"section":"div"),b=V(()=>s.value?"a":"div"),$=V(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),I=V(()=>s.value?void 0:"button"),S=V(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":a.value},{"has-active":u.value}]);function k(w){"key"in w&&w.key!=="Enter"||!e.item.link&&c()}function M(){e.item.link&&c()}return(w,x)=>{const z=Q("VPSidebarItem",!0);return r(),P(X(f.value),{class:A(["VPSidebarItem",S.value])},{default:p(()=>[w.item.text?(r(),l("div",pe({key:0,class:"item",role:I.value},Wt(w.item.items?{click:k,keydown:k}:{},!0),{tabindex:w.item.items&&0}),[Sl,w.item.link?(r(),P(q,{key:0,tag:b.value,class:"link",href:w.item.link},{default:p(()=>[(r(),P(X($.value),{class:"text",innerHTML:w.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"])):(r(),P(X($.value),{key:1,class:"text",innerHTML:w.item.text},null,8,["innerHTML"])),w.item.collapsed!=null?(r(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:M,onKeydown:Ut(M,["enter"]),tabindex:"0"},[h(ze,{class:"caret-icon"})],40,Ll)):m("",!0)],16,Vl)):m("",!0),w.item.items&&w.item.items.length?(r(),l("div",Ml,[w.depth<5?(r(!0),l(C,{key:0},O(w.item.items,D=>(r(),P(z,{key:D.text,item:D,depth:w.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}});const Il=g(Tl,[["__scopeId","data-v-c356ab37"]]),It=t=>(j("data-v-b04a928c"),t=t(),G(),t),Nl=It(()=>_("div",{class:"curtain"},null,-1)),Cl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Al=It(()=>_("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Bl=y({__name:"VPSidebar",props:{open:{type:Boolean}},setup(t){const e=t,{sidebarGroups:n,hasSidebar:o}=W();let s=L(null);function a(){Lt(s.value,{reserveScrollBarGap:!0})}function u(){Mt()}return Be(async()=>{var d;e.open?(a(),(d=s.value)==null||d.focus()):u()}),(d,c)=>i(o)?(r(),l("aside",{key:0,class:A(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:s,onClick:c[0]||(c[0]=Kt(()=>{},["stop"]))},[Nl,_("nav",Cl,[Al,v(d.$slots,"sidebar-nav-before",{},void 0,!0),(r(!0),l(C,null,O(i(n),f=>(r(),l("div",{key:f.text,class:"group"},[h(Il,{item:f,depth:0},null,8,["item"])]))),128)),v(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}});const xl=g(Bl,[["__scopeId","data-v-b04a928c"]]),Ol=y({__name:"VPSkipLink",setup(t){const e=Pe(),n=L();U(()=>e.path,()=>n.value.focus());function o({target:s}){const a=document.getElementById(decodeURIComponent(s.hash).slice(1));if(a){const u=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",u)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",u),a.focus(),window.scrollTo(0,0)}}return(s,a)=>(r(),l(C,null,[_("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),_("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}});const Hl=g(Ol,[["__scopeId","data-v-9c8615dd"]]),El=y({__name:"Layout",setup(t){const{isOpen:e,open:n,close:o}=W(),s=Pe();U(()=>s.path,o),Yn(e,o),fe("close-sidebar",o),fe("is-sidebar-open",e);const{frontmatter:a}=T(),u=qt(),d=V(()=>!!u["home-hero-image"]);return fe("hero-image-slot-exists",d),(c,f)=>{const b=Q("Content");return i(a).layout!==!1?(r(),l("div",{key:0,class:A(["Layout",i(a).pageClass])},[v(c.$slots,"layout-top",{},void 0,!0),h(Hl),h(Zt,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),i(a).navbar!==!1?(r(),P(Pl,{key:0},{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(c.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[v(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3})):m("",!0),h(La,{open:i(e),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),h(xl,{open:i(e)},{"sidebar-nav-before":p(()=>[v(c.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[v(c.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(aa,null,{"page-top":p(()=>[v(c.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(c.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[v(c.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[v(c.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(c.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(c.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(c.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(c.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(c.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[v(c.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(c.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(c.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[v(c.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(c.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[v(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(ua),v(c.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),P(b,{key:1}))}}});const Dl=g(El,[["__scopeId","data-v-324e8308"]]);const Wl={Layout:Dl,enhanceApp:({app:t})=>{t.component("Badge",Jt)}};function Kl(t,e){const{localeIndex:n}=T();function o(s){var S,k;const a=s.split("."),u=t&&typeof t=="object",d=u&&((k=(S=t.locales)==null?void 0:S[n.value])==null?void 0:k.translations)||null,c=u&&t.translations||null;let f=d,b=c,$=e;const I=a.pop();for(const M of a){let w=null;const x=$==null?void 0:$[M];x&&(w=$=x);const z=b==null?void 0:b[M];z&&(w=b=z);const D=f==null?void 0:f[M];D&&(w=f=D),x||($=w),z||(b=w),D||(f=w)}return(f==null?void 0:f[I])??(b==null?void 0:b[I])??($==null?void 0:$[I])??""}return o}export{Oe as a,T as b,jl as c,Ul as d,Gl as e,Kl as f,re as g,Rl as h,Ze as o,Wl as t,Bn as u,Fl as w}; diff --git a/docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.js b/docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.js new file mode 100644 index 0000000..c4da4b3 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.js @@ -0,0 +1 @@ +import{_ as e,o as a,c,X as i}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"API Overview","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/api/overview.md","filePath":"en/api/overview.md"}'),l={name:"en/api/overview.md"},s=i('

API Overview

Lancet (Lancet) is a powerful, comprehensive, efficient and reusable go language tool function library. Contains 25 packages, more than 600 utility functions. Functions cover string processing, slice processing, network, concurrency, encryption and decryption, file processing, time/date, stream processing, iterators, and more.

lancet function module

algorithm
compare
concurrency
condition
convertor
cryptor
datastructure
datetime
fileutil
formatter
function
iterator
maputil
mathutil
netutil
pointer
random
retry
slice
stream
structs
strutil
system
tuple
validator
xerror
',3),t=[s];function d(v,r,o,n,p,g){return a(),c("div",null,t)}const u=e(l,[["render",d]]);export{k as __pageData,u as default}; diff --git a/docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.lean.js b/docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.lean.js new file mode 100644 index 0000000..2ad4fb5 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_overview.md.1eb70105.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c,X as i}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"API Overview","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/api/overview.md","filePath":"en/api/overview.md"}'),l={name:"en/api/overview.md"},s=i("",3),t=[s];function d(v,r,o,n,p,g){return a(),c("div",null,t)}const u=e(l,[["render",d]]);export{k as __pageData,u as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.js b/docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.js new file mode 100644 index 0000000..9c8b55d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.js @@ -0,0 +1,809 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const S=JSON.parse('{"title":"Algorithm","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/algorithm.md","filePath":"en/api/packages/algorithm.md"}'),e={name:"en/api/packages/algorithm.md"},t=s("h1",{id:"Algorithm",tabindex:"-1"},[o("Algorithm "),s("a",{class:"header-anchor",href:"#Algorithm","aria-label":'Permalink to "Algorithm"'},"​")],-1),c=s("p",null,"Package algorithm implements some basic algorithm. eg. sort, search.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n('

Source

',2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n(`

Usage

go
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

Index

',2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

Documentation

BubbleSort

Sort slice with bubble sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

InsertionSort

Sort slice with insertion sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}

SelectionSort

Sort slice with selection sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

ShellSort

Sort slice with shell sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

QuickSort

Sort slice with quick sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

HeapSort

Sort slice with heap sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

MergeSort

Sort slice with merge sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

CountSort

Sort slice with count sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

BinarySearch

BinarySearch search for target within a sorted slice, recursive call itself. If a target is found, the index of the target is returned. Else the function return -1.

Signature:

go
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

BinaryIterativeSearch

BinaryIterativeSearch search for target within a sorted slice, recursive call itself. If a target is found, the index of the target is returned. Else the function return -1.

Signature:

go
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

LinearSearch

return the index of target in slice base on equal function.If a target is found, the index of the target is returned. Else the function return -1.

Signature:

go
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LRUCache

LRUCache implements mem cache with lru.

Signature:

go
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}
`,73),g=[t,c,r,y,F,i,A,E,u,m];function d(h,B,C,v,f,b){return l(),p("div",null,g)}const D=a(e,[["render",d]]);export{S as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.lean.js b/docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.lean.js new file mode 100644 index 0000000..ff57dda --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_algorithm.md.4b3abf4d.lean.js @@ -0,0 +1 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const S=JSON.parse('{"title":"Algorithm","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/algorithm.md","filePath":"en/api/packages/algorithm.md"}'),e={name:"en/api/packages/algorithm.md"},t=s("h1",{id:"Algorithm",tabindex:"-1"},[o("Algorithm "),s("a",{class:"header-anchor",href:"#Algorithm","aria-label":'Permalink to "Algorithm"'},"​")],-1),c=s("p",null,"Package algorithm implements some basic algorithm. eg. sort, search.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n("",2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",73),g=[t,c,r,y,F,i,A,E,u,m];function d(h,B,C,v,f,b){return l(),p("div",null,g)}const D=a(e,[["render",d]]);export{S as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.js b/docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.js new file mode 100644 index 0000000..7aae677 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.js @@ -0,0 +1,455 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Compare","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/compare.md","filePath":"en/api/packages/compare.md"}'),e={name:"en/api/packages/compare.md"},t=s("h1",{id:"Compare",tabindex:"-1"},[a("Compare "),s("a",{class:"header-anchor",href:"#Compare","aria-label":'Permalink to "Compare"'},"​")],-1),c=s("p",null,"Package compare provides a lightweight comparison function on any type.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

Index

',2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n(`

Documentation

Equal

Checks if two values are equal or not. (check both type and value)

Signature: Run

go
func Equal(left, right any) bool
func Equal(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

EqualValue

Checks if two values are equal or not. (check value only)

Signature: Run

go
func EqualValue(left, right any) bool
func EqualValue(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

LessThan

Checks if value \`left\` less than value \`right\`.

Signature: Run

go
func LessThan(left, right any) bool
func LessThan(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterThan

Checks if value \`left\` greater than value \`right\`.

Signature:

go
func GreaterThan(left, right any) bool
func GreaterThan(left, right any) bool

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LessOrEqual

Checks if value \`left\` less than or equal than value \`right\`.

Signature:

go
func LessOrEqual(left, right any) bool
func LessOrEqual(left, right any) bool

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterOrEqual

Checks if value \`left\` less greater or equal than value \`right\`.

Signature: Run

go
func GreaterOrEqual(left, right any) bool
func GreaterOrEqual(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

InDelta

Checks if two values are equal or not within a delta.

Signature: Run

go
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}
`,43),d=[t,c,r,y,F,i,E,A,u,m,B];function f(h,q,g,D,b,v){return p(),o("div",null,d)}const P=l(e,[["render",f]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.lean.js b/docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.lean.js new file mode 100644 index 0000000..86db03d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_compare.md.409d8174.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Compare","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/compare.md","filePath":"en/api/packages/compare.md"}'),e={name:"en/api/packages/compare.md"},t=s("h1",{id:"Compare",tabindex:"-1"},[a("Compare "),s("a",{class:"header-anchor",href:"#Compare","aria-label":'Permalink to "Compare"'},"​")],-1),c=s("p",null,"Package compare provides a lightweight comparison function on any type.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n("",43),d=[t,c,r,y,F,i,E,A,u,m,B];function f(h,q,g,D,b,v){return p(),o("div",null,d)}const P=l(e,[["render",f]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.js b/docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.js new file mode 100644 index 0000000..2ba7ec4 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.js @@ -0,0 +1,513 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const q=JSON.parse('{"title":"Concurrency","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/concurrency.md","filePath":"en/api/packages/concurrency.md"}'),e={name:"en/api/packages/concurrency.md"},c=s("h1",{id:"Concurrency",tabindex:"-1"},[a("Concurrency "),s("a",{class:"header-anchor",href:"#Concurrency","aria-label":'Permalink to "Concurrency"'},"​")],-1),t=s("p",null,"Package concurrency contain some functions to support concurrent programming. eg, goroutine, channel.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

Index

Channel

',3),h=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

Documentation

Channel

NewChannel

Create a Channel pointer instance.

Signature:

go
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}

Bridge

Link multiple channels into one channel until cancel the context.

Signature:

go
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T

Example: Run

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}

FanIn

Merge multiple channels into one channel until cancel the context.

Signature:

go
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T

Example: Run

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}

Repeat

Create channel, put values into the channel repeatly until cancel the context.

Signature: Run

go
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}

Generate

Creates a channel, then put values into the channel.

Signature:

go
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T

Example: Run

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

RepeatFn

Create a channel, excutes fn repeatly, and put the result into the channel, until close context.

Signature: Run

go
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // hello
+    // hello
+    // hello
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // hello
+    // hello
+    // hello
+}

Or

Read one or more channels into one channel, will close when any readin channel is closed.

Signature: Run

go
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}

OrDone

Read a channel into another channel, will close until cancel context.

Signature: Run

go
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}

Take

Create a channel whose values are taken from another channel with limit number.

Signature: Run

go
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

Tee

Split one chanel into two channels, until cancel the context.

Signature: Run

go
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}
`,62),g=[c,t,r,y,F,i,A,u,E,h,d];function C(B,m,f,v,k,x){return p(),o("div",null,g)}const D=l(e,[["render",C]]);export{q as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.lean.js b/docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.lean.js new file mode 100644 index 0000000..af17dfc --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_concurrency.md.4ccb7541.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const q=JSON.parse('{"title":"Concurrency","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/concurrency.md","filePath":"en/api/packages/concurrency.md"}'),e={name:"en/api/packages/concurrency.md"},c=s("h1",{id:"Concurrency",tabindex:"-1"},[a("Concurrency "),s("a",{class:"header-anchor",href:"#Concurrency","aria-label":'Permalink to "Concurrency"'},"​")],-1),t=s("p",null,"Package concurrency contain some functions to support concurrent programming. eg, goroutine, channel.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/concurrency/channel.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",3),h=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",62),g=[c,t,r,y,F,i,A,u,E,h,d];function C(B,m,f,v,k,x){return p(),o("div",null,g)}const D=l(e,[["render",C]]);export{q as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.js b/docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.js new file mode 100644 index 0000000..098b46f --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.js @@ -0,0 +1,289 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Condition","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/condition.md","filePath":"en/api/packages/condition.md"}'),e={name:"en/api/packages/condition.md"},t=s("h1",{id:"Condition",tabindex:"-1"},[n("Condition "),s("a",{class:"header-anchor",href:"#Condition","aria-label":'Permalink to "Condition"'},"​")],-1),c=s("p",null,[n("Package condition contains some functions for conditional judgment. eg. And, Or, TernaryOperator... The implementation of this package refers to the implementation of carlmjohnson's truthy package, you may find more useful information in "),s("a",{href:"https://github.com/carlmjohnson/truthy",target:"_blank",rel:"noreferrer"},"truthy"),n(", thanks carlmjohnson.")],-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/condition/condition.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/condition/condition.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
`,2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a('

Index

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),f=a(`

Documentation

Bool

Returns the truthy value of anything.
If the value's type has a Bool() bool method, the method is called and returned.
If the type has an IsZero() bool method, the opposite value is returned.
Slices and maps are truthy if they have a length greater than zero.
All other types are truthy if they are not their zero value.

Signature:

go
func Bool[T any](value T) bool
func Bool[T any](value T) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}

And

Returns true if both a and b are truthy.

Signature:

go
func And[T, U any](a T, b U) bool
func And[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}

Or

Returns false if neither a nor b is truthy.

Signature:

go
func Or[T, U any](a T, b U) bool
func Or[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}

Xor

Returns true if a or b but not both is truthy.

Signature:

go
func Xor[T, U any](a T, b U) bool
func Xor[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}

Nor

Returns true if neither a nor b is truthy.

Signature:

go
func Nor[T, U any](a T, b U) bool
func Nor[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}

Xnor

Returns true if both a and b or neither a nor b are truthy.

Signature:

go
func Xnor[T, U any](a T, b U) bool
func Xnor[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}

Nand

Returns false if both a and b are truthy

Signature:

go
func Nand[T, U any](a T, b U) bool
func Nand[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}

TernaryOperator

Checks the value of param \`isTrue\`, if true return ifValue else return elseValue

Signature:

go
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}
`,49),h=[t,c,r,y,F,i,A,d,u,E,f];function B(g,m,b,v,q,k){return p(),o("div",null,h)}const P=l(e,[["render",B]]);export{C as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.lean.js b/docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.lean.js new file mode 100644 index 0000000..5b2adbc --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_condition.md.a164dfc9.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Condition","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/condition.md","filePath":"en/api/packages/condition.md"}'),e={name:"en/api/packages/condition.md"},t=s("h1",{id:"Condition",tabindex:"-1"},[n("Condition "),s("a",{class:"header-anchor",href:"#Condition","aria-label":'Permalink to "Condition"'},"​")],-1),c=s("p",null,[n("Package condition contains some functions for conditional judgment. eg. And, Or, TernaryOperator... The implementation of this package refers to the implementation of carlmjohnson's truthy package, you may find more useful information in "),s("a",{href:"https://github.com/carlmjohnson/truthy",target:"_blank",rel:"noreferrer"},"truthy"),n(", thanks carlmjohnson.")],-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/condition/condition.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/condition/condition.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),f=a("",49),h=[t,c,r,y,F,i,A,d,u,E,f];function B(g,m,b,v,q,k){return p(),o("div",null,h)}const P=l(e,[["render",B]]);export{C as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.js b/docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.js new file mode 100644 index 0000000..59721c3 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.js @@ -0,0 +1,991 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Convertor","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/convertor.md","filePath":"en/api/packages/convertor.md"}'),e={name:"en/api/packages/convertor.md"},t=s("h1",{id:"Convertor",tabindex:"-1"},[a("Convertor "),s("a",{class:"header-anchor",href:"#Convertor","aria-label":'Permalink to "Convertor"'},"​")],-1),c=s("p",null,"Package convertor contains some functions for data type convertion.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n(`

Documentation

ColorHexToRGB

Convert color hex to color rgb.

Signature:

go
func ColorHexToRGB(colorHex string) (red, green, blue int)
func ColorHexToRGB(colorHex string) (red, green, blue int)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}

ColorRGBToHex

Convert color rgb to color hex.

Signature:

go
func ColorRGBToHex(red, green, blue int) string
func ColorRGBToHex(red, green, blue int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}

ToBool

Convert string to bool. Use strconv.ParseBool.

Signature:

go
func ToBool(s string) (bool, error)
func ToBool(s string) (bool, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}

ToBytes

Convert value to byte slice.

Signature:

go
func ToBytes(data any) ([]byte, error)
func ToBytes(data any) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}

ToChar

Convert string to char slice.

Signature:

go
func ToChar(s string) []string
func ToChar(s string) []string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}

ToChannel

Convert a collection of elements to a read-only channel.

Signature:

go
func ToChannel[T any](array []T) <-chan T
func ToChannel[T any](array []T) <-chan T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

ToFloat

Convert value to a float64 value. If param is a invalid floatable, will return 0.0 and error.

Signature:

go
func ToFloat(value any) (float64, error)
func ToFloat(value any) (float64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}

ToInt

Convert value to a int64 value. If param is a invalid intable, will return 0 and error.

Signature:

go
func ToInt(value any) (int64, error)
func ToInt(value any) (int64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}

ToJson

Convert interface to json string. If param can't be converted, will return "" and error.

Signature:

go
func ToJson(value any) (string, error)
func ToJson(value any) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}

ToMap

Convert a slice of structs to a map based on iteratee function.

Signature:

go
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}

ToPointer

Returns a pointer to passed value.

Signature:

go
func ToPointer[T any](value T) *T
func ToPointer[T any](value T) *T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}

ToString

ToString convert value to string, for number, string, []byte, will convert to string. For other type (slice, map, array, struct) will call json.Marshal

Signature:

go
func ToString(value any) string
func ToString(value any) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}

StructToMap

Convert struct to map, only convert exported field, struct field tag \`json\` should be set.

Signature:

go
func StructToMap(value any) (map[string]any, error)
func StructToMap(value any) (map[string]any, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}

MapToSlice

Convert a map to a slice based on iteratee function.

Signature:

go
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}

EncodeByte

Encode data to byte slice.

Signature:

go
func EncodeByte(data any) ([]byte, error)
func EncodeByte(data any) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}

DecodeByte

Decode byte data to target object. target should be a pointer instance.

Signature:

go
func DecodeByte(data []byte, target any) error
func DecodeByte(data []byte, target any) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

DeepClone

Creates a deep copy of passed item, can't clone unexported field of struct.

Signature:

go
func DeepClone[T any](src T) T
func DeepClone[T any](src T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}

CopyProperties

Copies each field from the source struct into the destination struct. Use json.Marshal/Unmarshal, so json tag should be set for fields of dst and src struct.

Signature:

go
func CopyProperties[T, U any](dst T, src U) (err error)
func CopyProperties[T, U any](dst T, src U) (err error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type DiskVO struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type Indicator struct {
+        Id      string    \`json:"id"\`
+        Ip      string    \`json:"ip"\`
+        UpTime  string    \`json:"upTime"\`
+        LoadAvg string    \`json:"loadAvg"\`
+        Cpu     int       \`json:"cpu"\`
+        Disk    []Disk    \`json:"disk"\`
+        Stop    chan bool \`json:"-"\`
+    }
+
+    type IndicatorVO struct {
+        Id      string   \`json:"id"\`
+        Ip      string   \`json:"ip"\`
+        UpTime  string   \`json:"upTime"\`
+        LoadAvg string   \`json:"loadAvg"\`
+        Cpu     int64    \`json:"cpu"\`
+        Disk    []DiskVO \`json:"disk"\`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type DiskVO struct {
+        Name    string  \`json:"name"\`
+        Total   string  \`json:"total"\`
+        Used    string  \`json:"used"\`
+        Percent float64 \`json:"percent"\`
+    }
+
+    type Indicator struct {
+        Id      string    \`json:"id"\`
+        Ip      string    \`json:"ip"\`
+        UpTime  string    \`json:"upTime"\`
+        LoadAvg string    \`json:"loadAvg"\`
+        Cpu     int       \`json:"cpu"\`
+        Disk    []Disk    \`json:"disk"\`
+        Stop    chan bool \`json:"-"\`
+    }
+
+    type IndicatorVO struct {
+        Id      string   \`json:"id"\`
+        Ip      string   \`json:"ip"\`
+        UpTime  string   \`json:"upTime"\`
+        LoadAvg string   \`json:"loadAvg"\`
+        Cpu     int64    \`json:"cpu"\`
+        Disk    []DiskVO \`json:"disk"\`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}

ToInterface

Converts reflect value to its interface type.

Signature:

go
func ToInterface(v reflect.Value) (value interface{}, ok bool)
func ToInterface(v reflect.Value) (value interface{}, ok bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\\n", iVal)
+    fmt.Printf("%v\\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true    
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\\n", iVal)
+    fmt.Printf("%v\\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true    
+}

Utf8ToGbk

Converts utf8 encoding data to GBK encoding data.

Signature:

go
func Utf8ToGbk(bs []byte) ([]byte, error)
func Utf8ToGbk(bs []byte) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true   
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true   
+}

GbkToUtf8

Converts GBK encoding data to utf8 encoding data.

Signature:

go
func GbkToUtf8(bs []byte) ([]byte, error)
func GbkToUtf8(bs []byte) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello   
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello   
+}
`,127),g=[t,c,r,y,F,i,u,A,E,d,B];function f(q,v,h,m,D,b){return p(),o("div",null,g)}const T=l(e,[["render",f]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.lean.js b/docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.lean.js new file mode 100644 index 0000000..f6f0bce --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_convertor.md.4d1b1ca4.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Convertor","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/convertor.md","filePath":"en/api/packages/convertor.md"}'),e={name:"en/api/packages/convertor.md"},t=s("h1",{id:"Convertor",tabindex:"-1"},[a("Convertor "),s("a",{class:"header-anchor",href:"#Convertor","aria-label":'Permalink to "Convertor"'},"​")],-1),c=s("p",null,"Package convertor contains some functions for data type convertion.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/convertor/convertor.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n("",127),g=[t,c,r,y,F,i,u,A,E,d,B];function f(q,v,h,m,D,b){return p(),o("div",null,g)}const T=l(e,[["render",f]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.js b/docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.js new file mode 100644 index 0000000..1a68e09 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.js @@ -0,0 +1,1369 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Cryptor","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/cryptor.md","filePath":"en/api/packages/cryptor.md"}'),e={name:"en/api/packages/cryptor.md"},t=s("h1",{id:"Cryptor",tabindex:"-1"},[n("Cryptor "),s("a",{class:"header-anchor",href:"#Cryptor","aria-label":'Permalink to "Cryptor"'},"​")],-1),c=s("p",null,"Package cryptor contains some functions for data encryption and decryption. Support base64, md5, hmac, aes, des, rsa.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a('

Index

',2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),h=a(`

Documentation

AesEcbEncrypt

Encrypt data with key use AES ECB algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesEcbEncrypt(data, key []byte) []byte
func AesEcbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesEcbDecrypt

Decrypt data with key use AES ECB algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesEcbDecrypt(encrypted, key []byte) []byte
func AesEcbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcEncrypt

Encrypt data with key use AES CBC algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesCbcEncrypt(data, key []byte) []byte
func AesCbcEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcDecrypt

Decrypt data with key use AES CBC algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesCbcDecrypt(encrypted, key []byte) []byte
func AesCbcDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCtrCrypt

Encrypt or decrypt data with key use AES CTR algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesCtrCrypt(data, key []byte) []byte
func AesCtrCrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbEncrypt

Encrypt data with key use AES CFB algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesCfbEncrypt(data, key []byte) []byte
func AesCfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbDecrypt

Decrypt data with key use AES CBC algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesCfbDecrypt(encrypted, key []byte) []byte
func AesCfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbEncrypt

Enecrypt data with key use AES OFB algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesOfbEncrypt(data, key []byte) []byte
func AesOfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbDecrypt

Decrypt data with key use AES OFB algorithm. Length of \`key\` param should be 16, 24 or 32.

Signature:

go
func AesOfbDecrypt(encrypted, key []byte) []byte
func AesOfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

Base64StdEncode

Encode string with base64 encoding.

Signature:

go
func Base64StdEncode(s string) string
func Base64StdEncode(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}

Base64StdDecode

Decode a base64 encoded string.

Signature:

go
func Base64StdDecode(s string) string
func Base64StdDecode(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}

DesEcbEncrypt

Encrypt data with key use DES ECB algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesEcbEncrypt(data, key []byte) []byte
func DesEcbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesEcbDecrypt

Decrypt data with key use DES ECB algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesEcbDecrypt(encrypted, key []byte) []byte
func DesEcbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcEncrypt

Encrypt data with key use DES CBC algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesCbcEncrypt(data, key []byte) []byte
func DesCbcEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcDecrypt

Decrypt data with key use DES CBC algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesCbcDecrypt(encrypted, key []byte) []byte
func DesCbcDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCtrCrypt

Encrypt or decrypt data with key use DES CTR algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesCtrCrypt(data, key []byte) []byte
func DesCtrCrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbEncrypt

Encrypt data with key use DES CFB algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesCfbEncrypt(data, key []byte) []byte
func DesCfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbDecrypt

Decrypt data with key use DES CBC algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesCfbDecrypt(encrypted, key []byte) []byte
func DesCfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbEncrypt

Enecrypt data with key use DES OFB algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesOfbEncrypt(data, key []byte) []byte
func DesOfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbDecrypt

Decrypt data with key use DES OFB algorithm. Length of \`key\` param should be 8.

Signature:

go
func DesOfbDecrypt(encrypted, key []byte) []byte
func DesOfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

HmacMd5

Get the md5 hmac hash of string.

Signature:

go
func HmacMd5(str, key string) string
func HmacMd5(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}

HmacMd5WithBase64

Get the md5 hmac hash of base64 string.

Signature:

go
func HmacMd5WithBase64(str, key string) string
func HmacMd5WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}

HmacSha1

Get the sha1 hmac hash of string.

Signature:

go
func HmacSha1(str, key string) string
func HmacSha1(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}

HmacSha1WithBase64

Return the hmac hash of string use sha1 with base64.

Signature:

go
func HmacSha1WithBase64(str, key string) string
func HmacSha1WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}

HmacSha256

Get the sha256 hmac hash of string

Signature:

go
func HmacSha256(str, key string) string
func HmacSha256(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}

HmacSha256WithBase64

Return the hmac hash of string use sha256 with base64.

Signature:

go
func HmacSha256WithBase64(str, key string) string
func HmacSha256WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}

HmacSha512

Get the sha512 hmac hash of string.

Signature:

go
func HmacSha512(str, key string) string
func HmacSha512(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}

HmacSha512WithBase64

Return the hmac hash of string use sha512 with base64.

Signature:

go
func HmacSha512WithBase64(str, key string) string
func HmacSha512WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}

Md5String

Get the md5 value of string.

Signature:

go
func Md5String(s string) string
func Md5String(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}

Md5StringWithBase64

Return the md5 value of string with base64.

Signature:

go
func Md5StringWithBase64(s string) string
func Md5StringWithBase64(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5Byte

Return the md5 string of byte slice.

Signature:

go
func Md5Byte(data []byte) string
func Md5Byte(data []byte) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}

Md5ByteWithBase64

Return the md5 string of byte slice with base64.

Signature:

go
func Md5ByteWithBase64(data []byte) string
func Md5ByteWithBase64(data []byte) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5File

Get the md5 value of file.

Signature:

go
func Md5File(filepath string) (string, error)
func Md5File(filepath string) (string, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}

Sha1

Get the sha1 value of string.

Signature:

go
func Sha1(str string) string
func Sha1(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}

Sha1WithBase64

Return the sha1 value (SHA-1 hash algorithm) of base64 string.

Signature:

go
func Sha1WithBase64(str string) string
func Sha1WithBase64(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}

Sha256

Get the sha256 value of string.

Signature:

go
func Sha256(str string) string
func Sha256(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}

Sha256WithBase64

Return the sha256 value (SHA256 hash algorithm) of base64 string.

Signature:

go
func Sha256WithBase64(str string) string
func Sha256WithBase64(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}

Sha512

Get the sha512 value of string.

Signature:

go
func Sha512(str string) string
func Sha512(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}

Sha512WithBase64

Get the sha512 value of string with base64.

Signature:

go
func Sha512WithBase64(str string) string
func Sha512WithBase64(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}

GenerateRsaKey

Create the rsa public and private key file in current directory.

Signature:

go
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

RsaEncrypt

Encrypt data with public key file useing ras algorithm.

Signature:

go
func RsaEncrypt(data []byte, pubKeyFileName string) []byte
func RsaEncrypt(data []byte, pubKeyFileName string) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

RsaDecrypt

Decrypt data with private key file useing ras algorithm.

Signature:

go
func RsaDecrypt(data []byte, privateKeyFileName string) []byte
func RsaDecrypt(data []byte, privateKeyFileName string) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
`,253),g=[t,c,r,y,i,F,d,E,u,A,h];function b(f,m,B,k,q,D){return l(),o("div",null,g)}const S=p(e,[["render",b]]);export{C as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.lean.js b/docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.lean.js new file mode 100644 index 0000000..322e334 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_cryptor.md.83b35674.lean.js @@ -0,0 +1 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Cryptor","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/cryptor.md","filePath":"en/api/packages/cryptor.md"}'),e={name:"en/api/packages/cryptor.md"},t=s("h1",{id:"Cryptor",tabindex:"-1"},[n("Cryptor "),s("a",{class:"header-anchor",href:"#Cryptor","aria-label":'Permalink to "Cryptor"'},"​")],-1),c=s("p",null,"Package cryptor contains some functions for data encryption and decryption. Support base64, md5, hmac, aes, des, rsa.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/basic.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/cryptor/crypto.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),h=a("",253),g=[t,c,r,y,i,F,d,E,u,A,h];function b(f,m,B,k,q,D){return l(),o("div",null,g)}const S=p(e,[["render",b]]);export{C as __pageData,S as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.js new file mode 100644 index 0000000..13b440c --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.js @@ -0,0 +1,359 @@ +import{_ as a,o as n,c as l,X as s,k as p}from"./chunks/framework.6e839c56.js";const m=JSON.parse('{"title":"CopyOnWriteList","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/copyonwritelist.md","filePath":"en/api/packages/datastructure/copyonwritelist.md"}'),o={name:"en/api/packages/datastructure/copyonwritelist.md"},e=s(`

CopyOnWriteList

CopyOnWriteList is a thread-safe list implementation that uses go slicing as its base. When writing, a new slice is copied and assigned to the original slice when writing is complete. When reading, the original slice is read directly.

源码

用法

go
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)
`,6),t=p("div",{STYLE:"page-break-after: always;"},null,-1),c=s(`

目录

Documentation

NewCopyOnWriteList

Returns a CopyOnWriteList with empty slices.

go
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}

Size

Returns the length of the CopyOnWriteList.

go
func (l *CopyOnWriteList[T]) Size() int
func (l *CopyOnWriteList[T]) Size() int

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}

Get

Returns the element at the specified position in the list

go
func (c *CopyOnWriteList[T]) Get(index int) *T
func (c *CopyOnWriteList[T]) Get(index int) *T

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Get(2))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Get(2))
+}

Set

Replaces the element at the specified position in this list with the specified element.

go
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}

Remove

IndexOf

Returns the index of the value in the list, or -1 if not found.

go
func (c *CopyOnWriteList[T]) IndexOf(e T) int
func (c *CopyOnWriteList[T]) IndexOf(e T) int

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}

LastIndexOf

Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not contain that element.

go
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,1})
+    fmt.Println(l.LastIndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,1})
+    fmt.Println(l.LastIndexOf(1))
+}

IsEmpty

Returns true if this list does not contain any elements.

go
func (c *CopyOnWriteList[T]) IsEmpty() bool
func (c *CopyOnWriteList[T]) IsEmpty() bool

Example

go
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{})
+    fmt.Println(l.IsEmpty())
+}
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{})
+    fmt.Println(l.IsEmpty())
+}

Contain

Determines if a CopyOnWriteList contains an element.

go
func (c *CopyOnWriteList[T]) Contain(e T) bool
func (c *CopyOnWriteList[T]) Contain(e T) bool

Example

go
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+l := list.NewCopyOnWriteList([]int{1,2,3})
+fmt.Println(l.Contain(1))
+}
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+l := list.NewCopyOnWriteList([]int{1,2,3})
+fmt.Println(l.Contain(1))
+}

ValueOf

Returns a pointer to the value at the index in the list

go
func (c *CopyOnWriteList[T]) ValueOf(index int) []T
func (c *CopyOnWriteList[T]) ValueOf(index int) []T

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}

Add

Appends the specified element to the end of the list.

go
func (c *CopyOnWriteList[T]) Add(e T) bool
func (c *CopyOnWriteList[T]) Add(e T) bool

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}

AddAll

Appends all the elements of the specified collection to the end of this list

go
func (c *CopyOnWriteList[T]) AddAll(e []T) bool
func (c *CopyOnWriteList[T]) AddAll(e []T) bool

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}

AddByIndex

Inserts the specified element into the list at the specified position.

go
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool

Example

go
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.AddByIndex(2, 6)
+    fmt.Println(l.getList())
+}
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.AddByIndex(2, 6)
+    fmt.Println(l.getList())
+}

DeleteAt

Removes the element at the specified position in this list.

go
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)

Example

go
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteAt(2)
+    fmt.Println(l.getList())
+}
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteAt(2)
+    fmt.Println(l.getList())
+}

DeleteIf

Removes the first occurrence of the specified element from this list (if it exists).

go
func (c *CopyOnWriteList[T]) DeleteIf(func(T) bool) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteIf(func(T) bool) (oldValue *T, ok bool)

Example

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}

DeleteBy

Deletes the first occurrence of the specified element from this list (if it exists).

go
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)

Example

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}

DeleteRange

Deletes all elements from this list with indexes between fromIndex (included) and toIndex (not included). (leftCloseRightOpen)

go
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)

Example

go
package main
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}
package main
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}

Equal

Returns true if the specified object is equal to this list

go
func (c *CopyOnWriteList[T]) Equal(e []T) bool
func (c *CopyOnWriteList[T]) Equal(e []T) bool

Example

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}
`,89),r=[e,t,c];function y(i,F,E,d,u,A){return n(),l("div",null,r)}const g=a(o,[["render",y]]);export{m as __pageData,g as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.lean.js new file mode 100644 index 0000000..a14737a --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_copyonwritelist.md.c4ab8b5a.lean.js @@ -0,0 +1 @@ +import{_ as a,o as n,c as l,X as s,k as p}from"./chunks/framework.6e839c56.js";const m=JSON.parse('{"title":"CopyOnWriteList","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/copyonwritelist.md","filePath":"en/api/packages/datastructure/copyonwritelist.md"}'),o={name:"en/api/packages/datastructure/copyonwritelist.md"},e=s("",6),t=p("div",{STYLE:"page-break-after: always;"},null,-1),c=s("",89),r=[e,t,c];function y(i,F,E,d,u,A){return n(),l("div",null,r)}const g=a(o,[["render",y]]);export{m as __pageData,g as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.js new file mode 100644 index 0000000..132bad2 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.js @@ -0,0 +1,247 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"HashMap","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/hashmap.md","filePath":"en/api/packages/datastructure/hashmap.md"}'),e={name:"en/api/packages/datastructure/hashmap.md"},t=s("h1",{id:"HashMap",tabindex:"-1"},[n("HashMap "),s("a",{class:"header-anchor",href:"#HashMap","aria-label":'Permalink to "HashMap"'},"​")],-1),c=s("p",null,"HashMap is a key value map data structure.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[n("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a(`

Usage

go
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
`,2),h=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

Documentation

NewHashMap

Make a HashMap instance with default capacity is 1 << 10.

Signature:

go
func NewHashMap() *HashMap
func NewHashMap() *HashMap

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}

NewHashMap

Make a HashMap instance with given size and capacity.

Signature:

go
func NewHashMapWithCapacity(size, capacity uint64) *HashMap
func NewHashMapWithCapacity(size, capacity uint64) *HashMap

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}

Get

Get the value of given key in hashmap

Signature:

go
func (hm *HashMap) Get(key any) any
func (hm *HashMap) Get(key any) any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}

Put

Put new key value in hashmap, then return value

Signature:

go
func (hm *HashMap) Put(key any, value any) any
func (hm *HashMap) Put(key any, value any) any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}

Delete

Delete key-value item by given key in hashmap.

Signature:

go
func (hm *HashMap) Delete(key any)
func (hm *HashMap) Delete(key any)

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}

Contains

Checks if given key is in hashmap or not.

Signature:

go
func (hm *HashMap) Contains(key any) bool
func (hm *HashMap) Contains(key any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}

Iterate

Executes iteratee funcation for every key and value pair of hashmap.

Signature:

go
func (hm *HashMap) Iterate(iteratee func(key, value any))
func (hm *HashMap) Iterate(iteratee func(key, value any))

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}

Keys

Return a slice of the hashmap's keys (random order).

Signature:

go
func (hm *HashMap) Keys() []any
func (hm *HashMap) Keys() []any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}

Values

Return a slice of the hashmap's values (random order).

Signature:

go
func (hm *HashMap) Values() []any
func (hm *HashMap) Values() []any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}
`,55),m=[t,c,r,y,F,i,u,h,E,d,A];function g(q,v,f,B,k,b){return l(),o("div",null,m)}const P=p(e,[["render",g]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.lean.js new file mode 100644 index 0000000..084ce6d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_hashmap.md.55db8537.lean.js @@ -0,0 +1 @@ +import{_ as p,o as l,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"HashMap","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/hashmap.md","filePath":"en/api/packages/datastructure/hashmap.md"}'),e={name:"en/api/packages/datastructure/hashmap.md"},t=s("h1",{id:"HashMap",tabindex:"-1"},[n("HashMap "),s("a",{class:"header-anchor",href:"#HashMap","aria-label":'Permalink to "HashMap"'},"​")],-1),c=s("p",null,"HashMap is a key value map data structure.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[n("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/hashmap/hashmap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",2),h=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",55),m=[t,c,r,y,F,i,u,h,E,d,A];function g(q,v,f,B,k,b){return l(),o("div",null,m)}const P=p(e,[["render",g]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.js new file mode 100644 index 0000000..6d0f19a --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.js @@ -0,0 +1,437 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const x=JSON.parse('{"title":"Heap","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/heap.md","filePath":"en/api/packages/datastructure/heap.md"}'),e={name:"en/api/packages/datastructure/heap.md"},t=s("h1",{id:"Heap",tabindex:"-1"},[n("Heap "),s("a",{class:"header-anchor",href:"#Heap","aria-label":'Permalink to "Heap"'},"​")],-1),c=s("p",null,"Heap is a binary heap tree implemented by slice.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[n("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

Usage

go
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a('

Index

',2),v=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a(`

Documentation

1. MaxHeap

MaxHeap is a binary heap tree implemented by slice, The key of the root node is both greater than or equal to the key value of the left subtree and greater than or equal to the key value of the right subtree.

NewMaxHeap

Return a NewMaxHeap pointer instance.

Signature:

go
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}

Push

Push value into the heap

Signature:

go
func (h *MaxHeap[T]) Push(value T)
func (h *MaxHeap[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Pop

Pop return the largest value, and remove it from the heap if heap is empty, return zero value and fasle

Signature:

go
func (h *MaxHeap[T]) Pop() (T, bool)
func (h *MaxHeap[T]) Pop() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}

Peek

Return the largest element from the heap without removing it, if heap is empty, it returns zero value and false.

Signature:

go
func (h *MaxHeap[T]) Peek() (T, bool)
func (h *MaxHeap[T]) Peek() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}

Data

Return all element of the heap

Signature:

go
func (h *MaxHeap[T]) Data() []T
func (h *MaxHeap[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Size

Return the number of elements in the heap

Signature:

go
func (h *MaxHeap[T]) Size() int
func (h *MaxHeap[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}

PrintStructure

Print the tree structure of the heap

Signature:

go
func (h *MaxHeap[T]) PrintStructure()
func (h *MaxHeap[T]) PrintStructure()

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}
`,45),h=[t,c,r,y,F,i,A,E,u,v,d];function m(C,B,g,f,b,k){return p(),o("div",null,h)}const _=l(e,[["render",m]]);export{x as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.lean.js new file mode 100644 index 0000000..f098917 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_heap.md.638dd5d1.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const x=JSON.parse('{"title":"Heap","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/heap.md","filePath":"en/api/packages/datastructure/heap.md"}'),e={name:"en/api/packages/datastructure/heap.md"},t=s("h1",{id:"Heap",tabindex:"-1"},[n("Heap "),s("a",{class:"header-anchor",href:"#Heap","aria-label":'Permalink to "Heap"'},"​")],-1),c=s("p",null,"Heap is a binary heap tree implemented by slice.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[n("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/heap/maxheap.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",2),v=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a("",45),h=[t,c,r,y,F,i,A,E,u,v,d];function m(C,B,g,f,b,k){return p(),o("div",null,h)}const _=l(e,[["render",m]]);export{x as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.js new file mode 100644 index 0000000..c8945cd --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.js @@ -0,0 +1,959 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Linklist","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/link.md","filePath":"en/api/packages/datastructure/link.md"}'),e={name:"en/api/packages/datastructure/link.md"},t=s("h1",{id:"Linklist",tabindex:"-1"},[a("Linklist "),s("a",{class:"header-anchor",href:"#Linklist","aria-label":'Permalink to "Linklist"'},"​")],-1),c=s("p",null,"Linklist a linked list, whose node has a value and a pointer points to next node of the link.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Usage

go
import (
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
import (
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

Index

',5),k=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

Documentation

SinglyLink a linked list, whose node has a value and a pointer points to next node of the link.

Return a singly link(SinglyLink) instance

Signature:

go
type LinkNode[T any] struct {
+	Value T
+	Next  *LinkNode[T]
+}
+type SinglyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewSinglyLink[T any]() *SinglyLink[T]
type LinkNode[T any] struct {
+	Value T
+	Next  *LinkNode[T]
+}
+type SinglyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewSinglyLink[T any]() *SinglyLink[T]

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk)
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk)
+}

Values

Return a slice of all node value in singly linklist

Signature:

go
func (link *SinglyLink[T]) Values() []T
func (link *SinglyLink[T]) Values() []T

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

InsertAt

Insert value into singly linklist at index, param \`index\` should between [0, len(SinglyLink)], if index do not meet the conditions, do nothing

Signature:

go
func (link *SinglyLink[T]) InsertAt(index int, value T)
func (link *SinglyLink[T]) InsertAt(index int, value T)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+    
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+    
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}

InsertAtHead

Insert value into singly linklist at head(first) index

Signature:

go
func (link *SinglyLink[T]) InsertAtHead(value T)
func (link *SinglyLink[T]) InsertAtHead(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

InsertAtTail

Insert value into singly linklist at tail(last) index

Signature:

go
func (link *SinglyLink[T]) InsertAtTail(value T)
func (link *SinglyLink[T]) InsertAtTail(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAt

Delete value at specific index, param \`index\` should be [0, len(SinglyLink)-1]

Signature:

go
func (link *SinglyLink[T]) DeleteAt(index int)
func (link *SinglyLink[T]) DeleteAt(index int)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAtHead

Delete value in singly linklist at first index

Signature:

go
func (link *SinglyLink[T]) DeleteAtHead()
func (link *SinglyLink[T]) DeleteAtHead()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}

DeleteAtTail

Delete value in singly linklist at last index

Signature:

go
func (link *SinglyLink[T]) DeleteAtTail()
func (link *SinglyLink[T]) DeleteAtTail()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteAtTail()
+    
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteAtTail()
+    
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}

DeleteValue

Delete all \`value\` in singly linklist

Signature:

go
func (link *SinglyLink[T]) DeleteValue(value T)
func (link *SinglyLink[T]) DeleteValue(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteValue(2)
+    fmt.Println(lk.Values()) //[]int{1, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.DeleteValue(2)
+    fmt.Println(lk.Values()) //[]int{1, 3}
+}

Reverse

Reverse all nodes order in linkist

Signature:

go
func (link *SinglyLink[T]) Reverse()
func (link *SinglyLink[T]) Reverse()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

GetMiddleNode

Get the node at middle index of linkist

Signature:

go
func (link *SinglyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]
func (link *SinglyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}

Size

Get the number of nodes in linklist

Signature:

go
func (link *SinglyLink[T]) Size() int
func (link *SinglyLink[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}

IsEmpty

Checks if linklist is empty or not

Signature:

go
func (link *SinglyLink[T]) IsEmpty() bool
func (link *SinglyLink[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}

Clear

Clear all nodes in the linklist, make it empty

Signature:

go
func (link *SinglyLink[T]) Clear()
func (link *SinglyLink[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}

Print

Print all nodes info of linklist

Signature:

go
func (link *SinglyLink[T]) Clear()
func (link *SinglyLink[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //[ &{Value:1 Pre:<nil> Next:0xc0000a4048}, &{Value:2 Pre:<nil> Next:0xc0000a4060}, &{Value:3 Pre:<nil> Next:<nil>} ]
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewSinglyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //[ &{Value:1 Pre:<nil> Next:0xc0000a4048}, &{Value:2 Pre:<nil> Next:0xc0000a4060}, &{Value:3 Pre:<nil> Next:<nil>} ]
+}

DoublyLink is a linked list, whose node has a value, a next pointer points to next node and pre pointer points to previous node of the link.

Return a doubly link instance

Signature:

go
type LinkNode[T any] struct {
+	Value T
+    Pre   *LinkNode[T]
+	Next  *LinkNode[T]
+}
+type DoublyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewDoublyLink[T any]() *DoublyLink[T]
type LinkNode[T any] struct {
+	Value T
+    Pre   *LinkNode[T]
+	Next  *LinkNode[T]
+}
+type DoublyLink[T any] struct {
+	Head   *datastructure.LinkNode[T]
+	length int
+}
+func NewDoublyLink[T any]() *DoublyLink[T]

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk)
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk)
+}

Values

Return a slice of all node value in doubly linklist

Signature:

go
func (link *DoublyLink[T]) Values() []T
func (link *DoublyLink[T]) Values() []T

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

InsertAt

Insert value into doubly linklist at index, param \`index\` should between [0, len(DoublyLink)], if index do not meet the conditions, do nothing

Signature:

go
func (link *DoublyLink[T]) InsertAt(index int, value T)
func (link *DoublyLink[T]) InsertAt(index int, value T)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAt(1, 1) //do nothing
+
+    lk.InsertAt(0, 1)
+    lk.InsertAt(1, 2)
+    lk.InsertAt(2, 3)
+    lk.InsertAt(2, 4)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 4, 3}
+}

InsertAtHead

Insert value into doubly linklist at head(first) index

Signature:

go
func (link *DoublyLink[T]) InsertAtHead(value T)
func (link *DoublyLink[T]) InsertAtHead(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtHead(1)
+    lk.InsertAtHead(2)
+    lk.InsertAtHead(3)
+
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

InsertAtTail

Insert value into doubly linklist at tail(last) index

Signature:

go
func (link *DoublyLink[T]) InsertAtTail(value T)
func (link *DoublyLink[T]) InsertAtTail(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAt

Delete value at specific index, param \`index\` should be [0, len(DoublyLink)-1]

Signature:

go
func (link *DoublyLink[T]) DeleteAt(index int)
func (link *DoublyLink[T]) DeleteAt(index int)

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAt(3)
+
+    fmt.Println(lk.Values()) //[]int{1, 2, 3}
+}

DeleteAtHead

Delete value in doubly linklist at first index

Signature:

go
func (link *DoublyLink[T]) DeleteAtHead()
func (link *DoublyLink[T]) DeleteAtHead()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    lk.InsertAtTail(4)
+
+    lk.DeleteAtHead()
+    
+    fmt.Println(lk.Values()) //[]int{2, 3, 4}
+}

DeleteAtTail

Delete value in doubly linklist at last index

Signature:

go
func (link *DoublyLink[T]) DeleteAtTail() error
func (link *DoublyLink[T]) DeleteAtTail() error

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    err := lk.DeleteAtTail()
+    
+    fmt.Println(err) //nil
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    err := lk.DeleteAtTail()
+    
+    fmt.Println(err) //nil
+    fmt.Println(lk.Values()) //[]int{1, 2}
+}

Reverse

Reverse all nodes order in linkist

Signature:

go
func (link *DoublyLink[T]) Reverse()
func (link *DoublyLink[T]) Reverse()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Reverse()
+    fmt.Println(lk.Values()) //[]int{3, 2, 1}
+}

GetMiddleNode

Get the node at middle index of linkist

Signature:

go
func (link *DoublyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]
func (link *DoublyLink[T]) GetMiddleNode() *datastructure.LinkNode[T]

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    midNode := lk.GetMiddleNode()
+    fmt.Println(midNode.Value) //2
+}

Size

Get the number of nodes in linklist

Signature:

go
func (link *DoublyLink[T]) Size() int
func (link *DoublyLink[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.Size()) //3
+}

IsEmpty

Checks if linklist is empty or not

Signature:

go
func (link *DoublyLink[T]) IsEmpty() bool
func (link *DoublyLink[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+    fmt.Println(lk.IsEmpty()) //true
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    fmt.Println(lk.IsEmpty()) //false
+}

Clear

Clear all nodes in the linklist, make it empty

Signature:

go
func (link *DoublyLink[T]) Clear()
func (link *DoublyLink[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+
+    lk.Clear()
+
+    fmt.Println(lk.Values()) //
+}

Print all nodes info of linklist

Signature:

go
func (link *DoublyLink[T]) Clear()
func (link *DoublyLink[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //
+}
package main
+
+import (
+    "fmt"
+    link "github.com/duke-git/lancet/v2/datastructure/link"
+)
+
+func main() {
+    lk := link.NewDoublyLink[int]()
+
+    lk.InsertAtTail(1)
+    lk.InsertAtTail(2)
+    lk.InsertAtTail(3)
+    
+    lk.Print() //
+}
`,179),g=[t,c,r,y,i,F,A,u,d,k,E];function h(m,v,b,f,D,B){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.lean.js new file mode 100644 index 0000000..9e8a4cb --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_link.md.062572a5.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Linklist","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/link.md","filePath":"en/api/packages/datastructure/link.md"}'),e={name:"en/api/packages/datastructure/link.md"},t=s("h1",{id:"Linklist",tabindex:"-1"},[a("Linklist "),s("a",{class:"header-anchor",href:"#Linklist","aria-label":'Permalink to "Linklist"'},"​")],-1),c=s("p",null,"Linklist a linked list, whose node has a value and a pointer points to next node of the link.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/singlylink.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/link/doublylink.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",5),k=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",179),g=[t,c,r,y,i,F,A,u,d,k,E];function h(m,v,b,f,D,B){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.js new file mode 100644 index 0000000..648e1a4 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.js @@ -0,0 +1,995 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"List","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/list.md","filePath":"en/api/packages/datastructure/list.md"}'),e={name:"en/api/packages/datastructure/list.md"},t=s("h1",{id:"List",tabindex:"-1"},[a("List "),s("a",{class:"header-anchor",href:"#List","aria-label":'Permalink to "List"'},"​")],-1),c=s("p",null,"List is a linear table, implemented with slice.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Usage

go
import (
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
import (
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation

NewList

List is a linear table, implemented with slice. NewList function return a list pointer

Signature:

go
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}

Contain

Check if the value in the list or not

Signature:

go
func (l *List[T]) Contain(value T) bool
func (l *List[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}

Data

Return slice of list data

Signature:

go
func (l *List[T]) Data() []T
func (l *List[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}

ValueOf

Return the value pointer at index in list

Signature:

go
func (l *List[T]) ValueOf(index int) (*T, bool)
func (l *List[T]) ValueOf(index int) (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}

IndexOf

Returns the index of value in the list. if not found return -1

Signature:

go
func (l *List[T]) IndexOf(value T) int
func (l *List[T]) IndexOf(value T) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}

LastIndexOf

Returns the index of the last occurrence of the value in this list if not found return -1

Signature:

go
func (l *List[T]) LastIndexOf(value T) int
func (l *List[T]) LastIndexOf(value T) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}

IndexOfFunc

IndexOfFunc returns the first index satisfying f(v). if not found return -1

Signature:

go
func (l *List[T]) IndexOfFunc(f func(T) bool) int
func (l *List[T]) IndexOfFunc(f func(T) bool) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

LastIndexOfFunc

LastIndexOfFunc returns the index of the last occurrence of the value in this list satisfying f(data[i]). if not found return -1

Signature:

go
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

Push

Append value to the list

Signature:

go
func (l *List[T]) Push(value T)
func (l *List[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}

PopFirst

Delete the first value of list and return it

Signature:

go
func (l *List[T]) PopFirst() (*T, bool)
func (l *List[T]) PopFirst() (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}

PopFirst

Delete the last value of list and return it

Signature:

go
func (l *List[T]) PopLast() (*T, bool)
func (l *List[T]) PopLast() (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}

DeleteAt

Delete the value of list at index, if index is not between 0 and length of list data, do nothing

Signature:

go
func (l *List[T]) DeleteAt(index int)
func (l *List[T]) DeleteAt(index int)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}

InsertAt

Insert value into list at index, if index is not between 0 and length of list data, do nothing

Signature:

go
func (l *List[T]) InsertAt(index int, value T)
func (l *List[T]) InsertAt(index int, value T)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}

UpdateAt

Update value of list at index, index shoud between 0 and list size - 1

Signature:

go
func (l *List[T]) UpdateAt(index int, value T)
func (l *List[T]) UpdateAt(index int, value T)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}

Equal

Compare a list to another list, use reflect.DeepEqual on every element

Signature:

go
func (l *List[T]) Equal(other *List[T]) bool
func (l *List[T]) Equal(other *List[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}

IsEmpty

Check if a list is empty or not

Signature:

go
func (l *List[T]) IsEmpty() bool
func (l *List[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}

Clear

Clear the data of list

Signature:

go
func (l *List[T]) Clear()
func (l *List[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}

Clone

Return a copy of list

Signature:

go
func (l *List[T]) Clone() *List[T]
func (l *List[T]) Clone() *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}

Merge

Merge two list, return new list, don't change original list

Signature:

go
func (l *List[T]) Merge(other *List[T]) *List[T]
func (l *List[T]) Merge(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}

Size

Return number of list data items

Signature:

go
func (l *List[T]) Size() int
func (l *List[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}

Cap

Cap return cap of the inner data

Signature:

go
func (l *List[T]) Cap() int
func (l *List[T]) Cap() int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}

Swap

Swap the value at two index in list

Signature:

go
func (l *List[T]) Swap(i, j int)
func (l *List[T]) Swap(i, j int)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}

Reverse

Reverse the data item order of list

Signature:

go
func (l *List[T]) Reverse()
func (l *List[T]) Reverse()

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}

Unique

Remove duplicate items in list

Signature:

go
func (l *List[T]) Unique()
func (l *List[T]) Unique()

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}

Union

Creates a new list contain all elements in list l and other, remove duplicate element

Signature:

go
func (l *List[T]) Union(other *List[T]) *List[T]
func (l *List[T]) Union(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}

Intersection

Creates a new list whose element both be contained in list l and other

Signature:

go
func (l *List[T]) Intersection(other *List[T]) *List[T]
func (l *List[T]) Intersection(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}

Difference

Return a list whose element in the original list, not in the given list.

Signature:

go
func (l *List[T]) Difference(other *List[T]) *List[T]
func (l *List[T]) Difference(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}

SymmetricDifference

Oppoiste operation of intersection function.

Signature:

go
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}

RetainAll

Retains only the elements in this list that are contained in the given list.

Signature:

go
func (l *List[T]) RetainAll(list *List[T]) bool
func (l *List[T]) RetainAll(list *List[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}

DeleteAll

Removes from this list all of its elements that are contained in the given list.

Signature:

go
func (l *List[T]) DeleteAll(list *List[T]) bool
func (l *List[T]) DeleteAll(list *List[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}

ForEach

Performs the given action for each element of the list.

Signature:

go
func (l *List[T]) ForEach(consumer func(T))
func (l *List[T]) ForEach(consumer func(T))

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

Iterator

Returns an iterator over the elements in this list in proper sequence.

Signature:

go
func (l *List[T]) Iterator() iterator.Iterator[T]
func (l *List[T]) Iterator() iterator.Iterator[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

ListToMap

Converts a list to a map based on iteratee function.

Signature:

go
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}

SubList

SubList returns a sub list of the original list between the specified fromIndex, inclusive, and toIndex, exclusive.

Signature:

go
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}

DeleteIf

DeleteIf delete all satisfying f(data[i]), returns count of removed elements

Signature:

go
func (l *List[T]) DeleteIf(f func(T) bool) int
func (l *List[T]) DeleteIf(f func(T) bool) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}
`,211),f=[t,c,r,y,F,i,A,E,u,d,g];function h(m,B,v,b,C,q){return p(),o("div",null,f)}const L=l(e,[["render",h]]);export{k as __pageData,L as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.lean.js new file mode 100644 index 0000000..a42ef3d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_list.md.d467285d.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"List","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/list.md","filePath":"en/api/packages/datastructure/list.md"}'),e={name:"en/api/packages/datastructure/list.md"},t=s("h1",{id:"List",tabindex:"-1"},[a("List "),s("a",{class:"header-anchor",href:"#List","aria-label":'Permalink to "List"'},"​")],-1),c=s("p",null,"List is a linear table, implemented with slice.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/list/list.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",211),f=[t,c,r,y,F,i,A,E,u,d,g];function h(m,B,v,b,C,q){return p(),o("div",null,f)}const L=l(e,[["render",h]]);export{k as __pageData,L as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.js new file mode 100644 index 0000000..30fbf01 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.js @@ -0,0 +1,1307 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const b=JSON.parse('{"title":"Queue","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/queue.md","filePath":"en/api/packages/datastructure/queue.md"}'),e={name:"en/api/packages/datastructure/queue.md"},t=s("h1",{id:"Queue",tabindex:"-1"},[o("Queue "),s("a",{class:"header-anchor",href:"#Queue","aria-label":'Permalink to "Queue"'},"​")],-1),c=s("p",null,"A queue is a kind of linear table. It only allows delete operations at the front of the table and insert operations at the rear of the table. This package includes ArrayQueue, LinkedQueue, CircularQueue, and PriorityQueue.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n('

Source

',2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n(`

Usage

go
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

1. ArrayQueue

2. LinkedQueue

3. CircularQueue

4. PriorityQueue

',9),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

Documentation

1. ArrayQueue

Common queue implemented by slice.

NewArrayQueue

Return a ArrayQueue pointer with specific capacity

Signature:

go
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *ArrayQueue[T]) Data() []T
func (q *ArrayQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue, if queue is full, return false

Signature:

go
func (q *ArrayQueue[T]) Enqueue(item T) bool
func (q *ArrayQueue[T]) Enqueue(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *ArrayQueue[T]) Dequeue() (T, bool)
func (q *ArrayQueue[T]) Dequeue() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

Just get the head element of queue

Signature:

go
func (q *ArrayQueue[T]) Front() T
func (q *ArrayQueue[T]) Front() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

Just get the tail element of queue

Signature:

go
func (q *ArrayQueue[T]) Back() T
func (q *ArrayQueue[T]) Back() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

Get the number of elements in queue

Signature:

go
func (q *ArrayQueue[T]) Size() int
func (q *ArrayQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *ArrayQueue[T]) IsEmpty() bool
func (q *ArrayQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

Check if queue is full or not

Signature:

go
func (q *ArrayQueue[T]) IsFull() bool
func (q *ArrayQueue[T]) IsFull() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

Clean all data in queue

Signature:

go
func (q *ArrayQueue[T]) Clear()
func (q *ArrayQueue[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

Check if the value is in queue or not

Signature:

go
func (q *ArrayQueue[T]) Contain(value T) bool
func (q *ArrayQueue[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

2. LinkedQueue

Common queue implemented by link.

NewLinkedQueue

Return a LinkedQueue pointer

Signature:

go
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *LinkedQueue[T]) Data() []T
func (q *LinkedQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue

Signature:

go
func (q *LinkedQueue[T]) Enqueue(value T)
func (q *LinkedQueue[T]) Enqueue(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *LinkedQueue[T]) Dequeue() (T, error)
func (q *LinkedQueue[T]) Dequeue() (T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

Just get the head element of queue

Signature:

go
func (q *LinkedQueue[T]) Front() (*T, error)
func (q *LinkedQueue[T]) Front() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

Just get the tail element of queue

Signature:

go
func (q *LinkedQueue[T]) Back() (*T, error)
func (q *LinkedQueue[T]) Back() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

Get the number of elements in queue

Signature:

go
func (q *LinkedQueue[T]) Size() int
func (q *LinkedQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *LinkedQueue[T]) IsEmpty() bool
func (q *LinkedQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

Clear

Clean all data in queue

Signature:

go
func (q *LinkedQueue[T]) Clear()
func (q *LinkedQueue[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

Check if the value is in queue or not

Signature:

go
func (q *LinkedQueue[T]) Contain(value T) bool
func (q *LinkedQueue[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

3. CircularQueue

Circular queue implemented by slice.

NewCircularQueue

Return a CircularQueue pointer with specific capacity

Signature:

go
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *CircularQueue[T]) Data() []T
func (q *CircularQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue, if queue is full, return error

Signature:

go
func (q *CircularQueue[T]) Enqueue(value T) error
func (q *CircularQueue[T]) Enqueue(value T) error

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *CircularQueue[T]) Dequeue() (*T, bool)
func (q *CircularQueue[T]) Dequeue() (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

Just get head element of queue

Signature:

go
func (q *CircularQueue[T]) Front() T
func (q *CircularQueue[T]) Front() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

Just get tail element of queue

Signature:

go
func (q *CircularQueue[T]) Back() T
func (q *CircularQueue[T]) Back() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

Get the number of elements in queue

Signature:

go
func (q *CircularQueue[T]) Size() int
func (q *CircularQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *CircularQueue[T]) IsEmpty() bool
func (q *CircularQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

Check if queue is full or not

Signature:

go
func (q *CircularQueue[T]) IsFull() bool
func (q *CircularQueue[T]) IsFull() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

Clean all data in queue

Signature:

go
func (q *CircularQueue[T]) Clear()
func (q *CircularQueue[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

Check if the value is in queue or not

Signature:

go
func (q *CircularQueue[T]) Contain(value T) bool
func (q *CircularQueue[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

4. PriorityQueue

Common queue implemented by slice.

NewPriorityQueue

Return a PriorityQueue pointer with specific capacity, param \`comparator\` is used to compare values of type T in the queue.

Signature:

go
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *PriorityQueue[T]) Data() []T
func (q *PriorityQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue, if queue is full, return false

Signature:

go
func (q *PriorityQueue[T]) Enqueue(item T) bool
func (q *PriorityQueue[T]) Enqueue(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *PriorityQueue[T]) Dequeue() (T, bool)
func (q *PriorityQueue[T]) Dequeue() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *PriorityQueue[T]) IsEmpty() bool
func (q *PriorityQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

Check if queue is full or not

Signature:

go
func (q *PriorityQueue[T]) IsFull() bool
func (q *PriorityQueue[T]) IsFull() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}

Size

Get nubmers of elements in queue

Signature:

go
func (q *PriorityQueue[T]) Size() int
func (q *PriorityQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}
`,243),q=[t,c,r,y,F,i,u,A,E,d];function g(m,h,v,C,f,B){return l(),p("div",null,q)}const D=a(e,[["render",g]]);export{b as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.lean.js new file mode 100644 index 0000000..5676776 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_queue.md.88ad36da.lean.js @@ -0,0 +1 @@ +import{_ as a,o as l,c as p,k as s,a as o,X as n}from"./chunks/framework.6e839c56.js";const b=JSON.parse('{"title":"Queue","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/queue.md","filePath":"en/api/packages/datastructure/queue.md"}'),e={name:"en/api/packages/datastructure/queue.md"},t=s("h1",{id:"Queue",tabindex:"-1"},[o("Queue "),s("a",{class:"header-anchor",href:"#Queue","aria-label":'Permalink to "Queue"'},"​")],-1),c=s("p",null,"A queue is a kind of linear table. It only allows delete operations at the front of the table and insert operations at the rear of the table. This package includes ArrayQueue, LinkedQueue, CircularQueue, and PriorityQueue.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=n("",2),F=s("div",{STYLE:"page-break-after: always;"},null,-1),i=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",9),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",243),q=[t,c,r,y,F,i,u,A,E,d];function g(m,h,v,C,f,B){return l(),p("div",null,q)}const D=a(e,[["render",g]]);export{b as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.js new file mode 100644 index 0000000..aa1db4a --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.js @@ -0,0 +1,571 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const S=JSON.parse('{"title":"Set","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/set.md","filePath":"en/api/packages/datastructure/set.md"}'),e={name:"en/api/packages/datastructure/set.md"},t=s("h1",{id:"Set",tabindex:"-1"},[a("Set "),s("a",{class:"header-anchor",href:"#Set","aria-label":'Permalink to "Set"'},"​")],-1),c=s("p",null,"Set is a data container, like list, but elements of set is not duplicate.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Usage

go
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

Index

',2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation

NewSet

Create a set instance

Signature:

go
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

NewSetFromSlice

Create a set from slice

Signature:

go
func NewSetFromSlice[T comparable](items []T) Set[T]
func NewSetFromSlice[T comparable](items []T) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}

Values

Return slice of all set data

Signature:

go
func (s Set[T]) Values() []T
func (s Set[T]) Values() []T

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

Add

Add items to set

Signature:

go
func (s Set[T]) Add(items ...T)
func (s Set[T]) Add(items ...T)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}

AddIfNotExist

AddIfNotExist checks if item exists in the set, it adds the item to set and returns true if it does not exist in the set, or else it does nothing and returns false.

Signature:

go
func (s Set[T]) AddIfNotExist(item T) bool
func (s Set[T]) AddIfNotExist(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}

AddIfNotExistBy

AddIfNotExistBy checks if item exists in the set and pass the \`checker\` function it adds the item to set and returns true if it does not exists in the set and function \`checker\` returns true, or else it does nothing and returns false.

Signature:

go
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}

Delete

Delete item in set

Signature:

go
func (s Set[T]) Delete(items ...T)
func (s Set[T]) Delete(items ...T)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}

Contain

Check if item is in set or not

Signature:

go
func (s Set[T]) Contain(item T) bool
func (s Set[T]) Contain(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}

ContainAll

Checks if set contains another set

Signature:

go
func (s Set[T]) ContainAll(other Set[T]) bool
func (s Set[T]) ContainAll(other Set[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}

Size

Get the number of elements in set

Signature:

go
func (s Set[T]) Size() int
func (s Set[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}

Clone

Make a copy of set

Signature:

go
func (s Set[T]) Clone() Set[T]
func (s Set[T]) Clone() Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}

Equal

Check if two sets has same elements or not

Signature:

go
func (s Set[T]) Equal(other Set[T]) bool
func (s Set[T]) Equal(other Set[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}

Iterate

Call function by every element of set

Signature:

go
func (s Set[T]) Iterate(fn func(item T))
func (s Set[T]) Iterate(fn func(item T))

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}

EachWithBreak

Iterates over elements of a set and invokes function for each element, when iteratee return false, will break the for each loop.

Signature:

go
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}

IsEmpty

Check if the set is empty or not

Signature:

go
func (s Set[T]) IsEmpty() bool
func (s Set[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}

Union

Create a new set contain all element of set s and other

Signature:

go
func (s Set[T]) Union(other Set[T]) Set[T]
func (s Set[T]) Union(other Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}

Intersection

Create a new set whose element both be contained in set s and other

Signature:

go
func (s Set[T]) Intersection(other Set[T]) Set[T]
func (s Set[T]) Intersection(other Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}

SymmetricDifference

Create a new set whose element is in set1 or set2, but not in both set1 and set2

Signature:

go
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}

Minus

Create an set of whose element in origin set but not in compared set

Signature:

go
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}

Pop

Delete the top element of set then return it, if set is empty, return nil-value of T and false.

Signature:

go
func (s Set[T]) Pop() (v T, ok bool)
func (s Set[T]) Pop() (v T, ok bool)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}
`,121),m=[t,c,r,y,F,i,A,E,d,u,g];function h(f,B,v,b,C,k){return p(),o("div",null,m)}const D=l(e,[["render",h]]);export{S as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.lean.js new file mode 100644 index 0000000..e127c4d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_set.md.963fc914.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const S=JSON.parse('{"title":"Set","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/set.md","filePath":"en/api/packages/datastructure/set.md"}'),e={name:"en/api/packages/datastructure/set.md"},t=s("h1",{id:"Set",tabindex:"-1"},[a("Set "),s("a",{class:"header-anchor",href:"#Set","aria-label":'Permalink to "Set"'},"​")],-1),c=s("p",null,"Set is a data container, like list, but elements of set is not duplicate.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/set/set.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",121),m=[t,c,r,y,F,i,A,E,d,u,g];function h(f,B,v,b,C,k){return p(),o("div",null,m)}const D=l(e,[["render",h]]);export{S as __pageData,D as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.js new file mode 100644 index 0000000..1e9d72d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.js @@ -0,0 +1,545 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Stack","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/stack.md","filePath":"en/api/packages/datastructure/stack.md"}'),e={name:"en/api/packages/datastructure/stack.md"},t=s("h1",{id:"Stack",tabindex:"-1"},[n("Stack "),s("a",{class:"header-anchor",href:"#Stack","aria-label":'Permalink to "Stack"'},"​")],-1),c=s("p",null,"Stack is an abstract data type that serves as a collection of elements. Elements follow the LIFO principle. FIFO is last-in, first-out, meaning that the most recently produced items are recorded as sold first.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[n("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a(`

Usage

go
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
`,2),k=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a('

Index

1. ArrayStack

2. LinkedStack

',5),d=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a(`

Documentation

1. ArrayStack

ArrayStack is a stack implemented by slice.

NewArrayStack

Return a empty ArrayStack pointer

Signature:

go
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}

Push

Push element into array stack

Signature:

go
func (s *ArrayStack[T]) Push(value T)
func (s *ArrayStack[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

Delete the top element of stack then return it, if stack is empty, return nil and error

Signature:

go
func (s *ArrayStack[T]) Pop() (*T, error)
func (s *ArrayStack[T]) Pop() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

Return the top element of array stack

Signature:

go
func (s *ArrayStack[T]) Peak() (*T, error)
func (s *ArrayStack[T]) Peak() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

Return a slice of all data in array stack

Signature:

go
func (s *ArrayStack[T]) Data() []T
func (s *ArrayStack[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

Return number of elements in array stack

Signature:

go
func (s *ArrayStack[T]) Size() int
func (s *ArrayStack[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

Check if array stack is empty or not

Signature:

go
func (s *ArrayStack[T]) IsEmpty() bool
func (s *ArrayStack[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

Clear all elments in array stack

Signature:

go
func (s *ArrayStack[T]) Clear()
func (s *ArrayStack[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

2. LinkedStack

LinkedStack is a stack implemented by linked list.

NewLinkedStack

Return a empty LinkedStack pointer

Signature:

go
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}

Push

Push element into linked stack

Signature:

go
func (s *LinkedStack[T]) Push(value T)
func (s *LinkedStack[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

Delete the top element of stack then return it, if stack is empty, return nil and error

Signature:

go
func (s *LinkedStack[T]) Pop() (*T, error)
func (s *LinkedStack[T]) Pop() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

Return the top element of linked stack

Signature:

go
func (s *LinkedStack[T]) Peak() (*T, error)
func (s *LinkedStack[T]) Peak() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

Return a slice of all data in linked stack

Signature:

go
func (s *LinkedStack[T]) Data() []T
func (s *LinkedStack[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

Return number of elements in linked stack

Signature:

go
func (s *LinkedStack[T]) Size() int
func (s *LinkedStack[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

Check if linked stack is empty or not

Signature:

go
func (s *LinkedStack[T]) IsEmpty() bool
func (s *LinkedStack[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

Clear all elments in linked stack

Signature:

go
func (s *LinkedStack[T]) Clear()
func (s *LinkedStack[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

Print

Print the structure of a linked stack

Signature:

go
func (s *LinkedStack[T]) Print()
func (s *LinkedStack[T]) Print()

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}
`,107),h=[t,c,r,y,F,i,A,k,u,d,E];function g(m,v,f,P,b,B){return p(),o("div",null,h)}const q=l(e,[["render",g]]);export{C as __pageData,q as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.lean.js new file mode 100644 index 0000000..4b80e49 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_stack.md.1998c8dc.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Stack","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/stack.md","filePath":"en/api/packages/datastructure/stack.md"}'),e={name:"en/api/packages/datastructure/stack.md"},t=s("h1",{id:"Stack",tabindex:"-1"},[n("Stack "),s("a",{class:"header-anchor",href:"#Stack","aria-label":'Permalink to "Stack"'},"​")],-1),c=s("p",null,"Stack is an abstract data type that serves as a collection of elements. Elements follow the LIFO principle. FIFO is last-in, first-out, meaning that the most recently produced items are recorded as sold first.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[n("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/arraystack.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/stack/linkedstack.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=a("",2),k=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",5),d=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a("",107),h=[t,c,r,y,F,i,A,k,u,d,E];function g(m,v,f,P,b,B){return p(),o("div",null,h)}const q=l(e,[["render",g]]);export{C as __pageData,q as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.js new file mode 100644 index 0000000..d665ea4 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.js @@ -0,0 +1,635 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"Tree","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/tree.md","filePath":"en/api/packages/datastructure/tree.md"}'),e={name:"en/api/packages/datastructure/tree.md"},t=s("h1",{id:"Tree",tabindex:"-1"},[a("Tree "),s("a",{class:"header-anchor",href:"#Tree","aria-label":'Permalink to "Tree"'},"​")],-1),r=s("p",null,"Tree is a collection of tree nodes. Each tree node has a value, a left pointer point to left node and a right pointer point to right node.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Usage

go
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

Index

1. BSTree

',3),d=s("div",{STYLE:"page-break-after: always;"},null,-1),v=n(`

Documentation

1. BSTree

BSTree is a binary search tree data structure in which each node has at two children, which are referred to as the left child and the right child. In BSTree: leftNode < rootNode < rightNode. Type T should implements Compare function in lancetconstraints.Comparator interface.

NewBSTree

Make a BSTree pointer instance

Signature:

go
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}

Insert

Insert value into binary search tree

Signature:

go
func (t *BSTree[T]) Insert(data T)
func (t *BSTree[T]) Insert(data T)

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

Delete

Delete value of binary search tree

Signature:

go
func (t *BSTree[T]) Delete(data T)
func (t *BSTree[T]) Delete(data T)

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}

PreOrderTraverse

Traverse tree nodes in pre order

Signature:

go
func (t *BSTree[T]) PreOrderTraverse() []T
func (t *BSTree[T]) PreOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

InOrderTraverse

Traverse tree nodes in middle order

Signature:

go
func (t *BSTree[T]) InOrderTraverse() []T
func (t *BSTree[T]) InOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}

PostOrderTraverse

Traverse tree nodes in post order

Signature:

go
func (t *BSTree[T]) PostOrderTraverse() []T
func (t *BSTree[T]) PostOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}

LevelOrderTraverse

Traverse tree nodes in node level order

Signature:

go
func (t *BSTree[T]) LevelOrderTraverse() []T
func (t *BSTree[T]) LevelOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}

Depth

Get the depth of a binary saerch tree

Signature:

go
func (t *BSTree[T]) Depth() int
func (t *BSTree[T]) Depth() int

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}

HasSubTree

Check if the given tree is sub tree of origin tree or not

Signature:

go
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}

Print

Print the structure of binary saerch tree

Signature:

go
func (t *BSTree[T]) Print()
func (t *BSTree[T]) Print()

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \\
+//      /   \\
+//     /     \\
+//    /       \\
+//    5       7
+//   /
+//  /
+//  2
+//   \\
+//    4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \\
+//      /   \\
+//     /     \\
+//    /       \\
+//    5       7
+//   /
+//  /
+//  2
+//   \\
+//    4
+}
`,63),B=[t,r,c,y,F,i,A,E,u,d,v];function C(m,g,b,h,T,f){return p(),o("div",null,B)}const k=l(e,[["render",C]]);export{_ as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.lean.js new file mode 100644 index 0000000..639afcd --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datastructure_tree.md.e0a47a13.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"Tree","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datastructure/tree.md","filePath":"en/api/packages/datastructure/tree.md"}'),e={name:"en/api/packages/datastructure/tree.md"},t=s("h1",{id:"Tree",tabindex:"-1"},[a("Tree "),s("a",{class:"header-anchor",href:"#Tree","aria-label":'Permalink to "Tree"'},"​")],-1),r=s("p",null,"Tree is a collection of tree nodes. Each tree node has a value, a left pointer point to left node and a right pointer point to right node.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source",tabindex:"-1"},[a("Source "),s("a",{class:"header-anchor",href:"#Source","aria-label":'Permalink to "Source"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datastructure/tree/bstree.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",3),d=s("div",{STYLE:"page-break-after: always;"},null,-1),v=n("",63),B=[t,r,c,y,F,i,A,E,u,d,v];function C(m,g,b,h,T,f){return p(),o("div",null,B)}const k=l(e,[["render",C]]);export{_ as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.js b/docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.js new file mode 100644 index 0000000..7203d9f --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.js @@ -0,0 +1,1399 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Datetime","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datetime.md","filePath":"en/api/packages/datetime.md"}'),e={name:"en/api/packages/datetime.md"},t=s("h1",{id:"Datetime",tabindex:"-1"},[a("Datetime "),s("a",{class:"header-anchor",href:"#Datetime","aria-label":'Permalink to "Datetime"'},"​")],-1),c=s("p",null,"Package datetime supports date and time format and compare.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datetime/conversion.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datetime/conversion.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

',2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

Documentation

Note:

  1. In below functions, the format string param should be one of flows value (case no sensitive):
  • yyyy-mm-dd hh:mm:ss
  • yyyy-mm-dd hh:mm
  • yyyy-mm-dd hh
  • yyyy-mm-dd
  • yyyy-mm
  • mm-dd
  • dd-mm-yy hh:mm:ss
  • yyyy/mm/dd hh:mm:ss
  • yyyy/mm/dd hh:mm
  • yyyy/mm/dd hh
  • yyyy/mm/dd
  • yyyy/mm
  • mm/dd
  • dd/mm/yy hh:mm:ss
  • yyyymmdd
  • mmddyy
  • yyyy
  • yy
  • mm
  • hh:mm:ss
  • hh:mm
  • mm:ss

AddDay

Add or sub days to time.

Signature:

go
func AddDay(t time.Time, day int64) time.Time
func AddDay(t time.Time, day int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}

AddHour

Add or sub hours to time.

Signature:

go
func AddHour(t time.Time, hour int64) time.Time
func AddHour(t time.Time, hour int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}

AddMinute

Add or sub minutes to time.

Signature:

go
func AddMinute(t time.Time, minute int64) time.Time
func AddMinute(t time.Time, minute int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}

AddYear

Add or sub year to the time.

Signature:

go
func AddYear(t time.Time, year int64) time.Time
func AddYear(t time.Time, year int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}

BeginOfMinute

Return beginning minute time of day.

Signature:

go
func BeginOfMinute(t time.Time) time.Time
func BeginOfMinute(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}

BeginOfHour

Return zero time of day.

Signature:

go
func BeginOfHour(t time.Time) time.Time
func BeginOfHour(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}

BeginOfDay

Return begin time of day.

Signature:

go
func BeginOfDay(t time.Time) time.Time
func BeginOfDay(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfWeek

Return beginning time of week, week begin from Sunday.

Signature:

go
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfMonth

Return beginning time of month

Signature:

go
func BeginOfMonth(t time.Time) time.Time
func BeginOfMonth(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

BeginOfYear

Return beginning time of year.

Signature:

go
func BeginOfYear(t time.Time) time.Time
func BeginOfYear(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

EndOfMinute

Return end time minute of day.

Signature:

go
func EndOfMinute(t time.Time) time.Time
func EndOfMinute(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}

EndOfHour

Return end time hour of day.

Signature:

go
func EndOfHour(t time.Time) time.Time
func EndOfHour(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}

EndOfDay

Return end time hour of day.

Signature:

go
func EndOfDay(t time.Time) time.Time
func EndOfDay(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}

EndOfWeek

Return end time of week, week end with Saturday.

Signature:

go
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}

EndOfMonth

Return end time of month

Signature:

go
func EndOfMonth(t time.Time) time.Time
func EndOfMonth(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}

EndOfYear

Return beginning time of year.

Signature:

go
func EndOfYear(t time.Time) time.Time
func EndOfYear(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}

GetNowDate

Get current date string, format is yyyy-mm-dd.

Signature:

go
func GetNowDate() string
func GetNowDate() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}

GetNowTime

Get current time string, format is hh:mm:ss.

Signature:

go
func GetNowTime() string
func GetNowTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime) // 15:57:33
+
+    // Output:
+    // 15:57:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime) // 15:57:33
+
+    // Output:
+    // 15:57:33
+}

GetNowDateTime

Get current date time string, format is yyyy-mm-dd hh:mm:ss.

Signature:

go
func GetNowDateTime() string
func GetNowDateTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}

GetTodayStartTime

Return the start time of today, format: yyyy-mm-dd 00:00:00.

Signature:

go
func GetTodayStartTime() string
func GetTodayStartTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}

GetTodayEndTime

Return the end time of today, format: yyyy-mm-dd 23:59:59.

Signature:

go
func GetTodayEndTime() string
func GetTodayEndTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}

GetZeroHourTimestamp

Return timestamp of zero hour (timestamp of 00:00).

Signature:

go
func GetZeroHourTimestamp() int64
func GetZeroHourTimestamp() int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}

GetNightTimestamp

Return timestamp of zero hour (timestamp of 23:59).

Signature:

go
func GetNightTimestamp() int64
func GetNightTimestamp() int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}

FormatTimeToStr

Format time to string, \`format\` param specification see note 1.

Signature:

go
func FormatTimeToStr(t time.Time, format string, timezone ...string) string
func FormatTimeToStr(t time.Time, format string, timezone ...string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}

FormatStrToTime

Format string to time, \`format\` param specification see note 1.

Signature:

go
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}

NewUnixNow

Return unix timestamp of current time

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewUnix

Return unix timestamp of specified int64 value.

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewFormat

Return unix timestamp of specified time string, t should be "yyyy-mm-dd hh:mm:ss".

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}

NewISO8601

Return unix timestamp of specified iso8601 time string.

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}

ToUnix

Return unix timestamp.

Signature:

go
func (t *theTime) ToUnix() int64
func (t *theTime) ToUnix() int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}

ToFormat

Return time string 'yyyy-mm-dd hh:mm:ss'.

Signature:

go
func (t *theTime) ToFormat() string
func (t *theTime) ToFormat() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}

ToFormatForTpl

Return the time string which format is specified tpl.

Signature:

go
func (t *theTime) ToFormatForTpl(tpl string) string
func (t *theTime) ToFormatForTpl(tpl string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}

ToIso8601

Return iso8601 time string.

Signature:

go
func (t *theTime) ToIso8601() string
func (t *theTime) ToIso8601() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}

IsLeapYear

check if param \`year\` is leap year or not.

Signature:

go
func IsLeapYear(year int) bool
func IsLeapYear(year int) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

BetweenSeconds

Return the number of seconds between two times.

Signature:

go
func BetweenSeconds(t1 time.Time, t2 time.Time) int64
func BetweenSeconds(t1 time.Time, t2 time.Time) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}

DayOfYear

Returns which day of the year the parameter date \`t\` is.

Signature:

go
func DayOfYear(t time.Time) int
func DayOfYear(t time.Time) int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}

IsWeekend(Deprecated, Use '== Weekday' instead)

Checks if passed time is weekend or not.

Signature:

go
func IsWeekend(t time.Time) bool
func IsWeekend(t time.Time) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

NowDateOrTime

Return current datetime with specific format and timezone.

Signature:

go
func NowDateOrTime(format string, timezone ...string) string
func NowDateOrTime(format string, timezone ...string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}

Timestamp

Return current second timestamp.

Signature:

go
func Timestamp(timezone ...string) int64
func Timestamp(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}

TimestampMilli

Return current mill second timestamp.

Signature:

go
func TimestampMilli(timezone ...string) int64
func TimestampMilli(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}

TimestampMicro

Return current micro second timestamp.

Signature:

go
func TimestampMicro(timezone ...string) int64
func TimestampMicro(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}

TimestampNano

Return current nano second timestamp.

Signature:

go
func TimestampNano(timezone ...string) int64
func TimestampNano(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}
`,256),g=[t,c,r,y,i,F,d,u,A,m,E];function h(f,B,v,q,b,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.lean.js b/docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.lean.js new file mode 100644 index 0000000..0bfe2f7 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_datetime.md.32edaec1.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Datetime","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/datetime.md","filePath":"en/api/packages/datetime.md"}'),e={name:"en/api/packages/datetime.md"},t=s("h1",{id:"Datetime",tabindex:"-1"},[a("Datetime "),s("a",{class:"header-anchor",href:"#Datetime","aria-label":'Permalink to "Datetime"'},"​")],-1),c=s("p",null,"Package datetime supports date and time format and compare.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datetime/datetime.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/datetime/conversion.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/datetime/conversion.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",256),g=[t,c,r,y,i,F,d,u,A,m,E];function h(f,B,v,q,b,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{C as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.js b/docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.js new file mode 100644 index 0000000..7551c6e --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.js @@ -0,0 +1,781 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Fileutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/fileutil.md","filePath":"en/api/packages/fileutil.md"}'),e={name:"en/api/packages/fileutil.md"},t=s("h1",{id:"Fileutil",tabindex:"-1"},[a("Fileutil "),s("a",{class:"header-anchor",href:"#Fileutil","aria-label":'Permalink to "Fileutil"'},"​")],-1),c=s("p",null,"Package fileutil implements some basic functions for file operations.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/fileutil/file.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/fileutil/file.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

Index

',2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n(`

Documentation

ClearFile

Clear the file content, write empty string to the file.

Signature:

go
func ClearFile(path string) error
func ClearFile(path string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CreateFile

Create file in path. return true if create succeed.

Signature:

go
func CreateFile(path string) bool
func CreateFile(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}

CreateDir

Create directory in absolute path. param \`absPath\` like /a, /a/b.

Signature:

go
func CreateDir(absPath string) error
func CreateDir(absPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}

CopyFile

Copy src file to dest file. If dest file exist will overwrite it.

Signature:

go
func CopyFile(srcPath string, dstPath string) error
func CopyFile(srcPath string, dstPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CurrentPath

return current absolute path.

Signature:

go
func CurrentPath() string
func CurrentPath() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}

FileMode

Return file mode infomation.

Signature:

go
func FileMode(path string) (fs.FileMode, error)
func FileMode(path string) (fs.FileMode, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}

MiMeType

Get file mime type, 'file' param's type should be string or *os.File.

Signature:

go
func MiMeType(file any) string
func MiMeType(file any) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}

IsExist

Checks if a file or directory exists.

Signature:

go
func IsExist(path string) bool
func IsExist(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}

Checks if a file is symbol link or not.

Signature:

go
func IsLink(path string) bool
func IsLink(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}

IsDir

Checks if the path is directy or not.

Signature:

go
func IsDir(path string) bool
func IsDir(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}

ListFileNames

List all file names in given path.

Signature:

go
func ListFileNames(path string) ([]string, error)
func ListFileNames(path string) ([]string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}

RemoveFile

Remove the file of path.

Signature:

go
func RemoveFile(path string) error
func RemoveFile(path string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ReadFileToString

Return string of file content.

Signature:

go
func ReadFileToString(path string) (string, error)
func ReadFileToString(path string) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}

ReadFileByLine

Read file line by line, and return slice of lines

Signature:

go
func ReadFileByLine(path string)([]string, error)
func ReadFileByLine(path string)([]string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}

Zip

Create a zip file of fpath, fpath could be a file or a directory.

Signature:

go
func Zip(fpath string, destPath string) error
func Zip(fpath string, destPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ZipAppendEntry

Append a single file or directory by fpath to an existing zip file.

Signature:

go
func ZipAppendEntry(fpath string, destPath string) error
func ZipAppendEntry(fpath string, destPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

UnZip

Unzip the file and save it to dest path.

Signature:

go
func UnZip(zipFile string, destPath string) error
func UnZip(zipFile string, destPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

IsZipFile

Checks if file is zip file or not.

Signature:

go
func IsZipFile(filepath string) bool
func IsZipFile(filepath string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}

FileSize

Returns file size in bytes.

Signature:

go
func FileSize(path string) (int64, error)
func FileSize(path string) (int64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}

MTime

Returns file modified time(unix timestamp).

Signature:

go
func MTime(filepath string) (int64, error)
func MTime(filepath string) (int64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}

Sha

returns file sha value, param \`shaType\` should be 1, 256 or 512.

Signature:

go
func Sha(filepath string, shaType ...int) (string, error)
func Sha(filepath string, shaType ...int) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}

ReadCsvFile

Reads file content into slice.

Signature:

go
func ReadCsvFile(filepath string) ([][]string, error)
func ReadCsvFile(filepath string) ([][]string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}

WriteCsvFile

Write content to target csv file.

Signature:

go
func WriteCsvFile(filepath string, records [][]string, append bool) error
func WriteCsvFile(filepath string, records [][]string, append bool) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}

WriteBytesToFile

Writes bytes to target file.

Signature:

go
func WriteBytesToFile(filepath string, content []byte) error
func WriteBytesToFile(filepath string, content []byte) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}

WriteStringToFile

Writes string to target file.

Signature:

go
func WriteStringToFile(filepath string, content string, append bool) error
func WriteStringToFile(filepath string, content string, append bool) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
`,151),g=[t,c,r,y,i,F,u,E,d,A,f];function h(m,q,B,v,b,C){return p(),o("div",null,g)}const P=l(e,[["render",h]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.lean.js b/docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.lean.js new file mode 100644 index 0000000..5dd3834 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_fileutil.md.fea45f47.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Fileutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/fileutil.md","filePath":"en/api/packages/fileutil.md"}'),e={name:"en/api/packages/fileutil.md"},t=s("h1",{id:"Fileutil",tabindex:"-1"},[a("Fileutil "),s("a",{class:"header-anchor",href:"#Fileutil","aria-label":'Permalink to "Fileutil"'},"​")],-1),c=s("p",null,"Package fileutil implements some basic functions for file operations.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/fileutil/file.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/fileutil/file.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n("",151),g=[t,c,r,y,i,F,u,E,d,A,f];function h(m,q,B,v,b,C){return p(),o("div",null,g)}const P=l(e,[["render",h]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.js b/docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.js new file mode 100644 index 0000000..c6e74b0 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.js @@ -0,0 +1,329 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Formatter","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/formatter.md","filePath":"en/api/packages/formatter.md"}'),e={name:"en/api/packages/formatter.md"},t=s("h1",{id:"Formatter",tabindex:"-1"},[n("Formatter "),s("a",{class:"header-anchor",href:"#Formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),r=s("p",null,"formatter contains some functions for data formatting.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/byte.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/byte.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a('

Index

',2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),m=a(`

Documentation

Comma

Add comma to a number value by every 3 numbers from right to left. ahead by symbol char. if value is a invalid number string like "aa", return empty string.

Signature:

go
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}

Pretty

Pretty data to JSON string.

Signature:

go
func Pretty(v any) (string, error)
func Pretty(v any) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}

PrettyToWriter

Pretty encode data to writer.

Signature:

go
func PrettyToWriter(v any, out io.Writer) error
func PrettyToWriter(v any, out io.Writer) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string \`json:"name"\`
+        Aage uint   \`json:"age"\`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string \`json:"name"\`
+        Aage uint   \`json:"age"\`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}

DecimalBytes

Returns a human readable byte size under decimal standard (base 1000). The precision parameter specifies the number of digits after the decimal point, which is 4 for default.

Signature:

go
func DecimalBytes(size float64, precision ...int) string
func DecimalBytes(size float64, precision ...int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}

BinaryBytes

Returns a human readable byte size under binary standard (base 1024). The precision parameter specifies the number of digits after the decimal point, which is 4 for default.

Signature:

go
func BinaryBytes(size float64, precision ...int) string
func BinaryBytes(size float64, precision ...int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}

ParseDecimalBytes

Returns the human readable bytes size string into the amount it represents(base 1000).

Signature:

go
func ParseDecimalBytes(size string) (uint64, error)
func ParseDecimalBytes(size string) (uint64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}

ParseBinaryBytes

Returns the human readable bytes size string into the amount it represents(base 1024).

Signature:

go
func ParseBinaryBytes(size string) (uint64, error)
func ParseBinaryBytes(size string) (uint64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}
`,43),d=[t,r,c,y,F,i,u,A,E,B,m];function f(g,h,q,D,b,v){return p(),o("div",null,d)}const C=l(e,[["render",f]]);export{k as __pageData,C as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.lean.js b/docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.lean.js new file mode 100644 index 0000000..fdf3278 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_formatter.md.00b1f98e.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Formatter","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/formatter.md","filePath":"en/api/packages/formatter.md"}'),e={name:"en/api/packages/formatter.md"},t=s("h1",{id:"Formatter",tabindex:"-1"},[n("Formatter "),s("a",{class:"header-anchor",href:"#Formatter","aria-label":'Permalink to "Formatter"'},"​")],-1),r=s("p",null,"formatter contains some functions for data formatting.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/formatter.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/formatter/byte.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/formatter/byte.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=a("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),E=a("",2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),m=a("",43),d=[t,r,c,y,F,i,u,A,E,B,m];function f(g,h,q,D,b,v){return p(),o("div",null,d)}const C=l(e,[["render",f]]);export{k as __pageData,C as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.js b/docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.js new file mode 100644 index 0000000..cab65d1 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.js @@ -0,0 +1,447 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const q=JSON.parse('{"title":"Function","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/function.md","filePath":"en/api/packages/function.md"}'),e={name:"en/api/packages/function.md"},t=s("h1",{id:"Function",tabindex:"-1"},[a("Function "),s("a",{class:"header-anchor",href:"#Function","aria-label":'Permalink to "Function"'},"​")],-1),c=s("p",null,"Package function can control the flow of function execution and support part of functional programming.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/function.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/function.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/watcher.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/watcher.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/function"
+)
import (
+    "github.com/duke-git/lancet/v2/function"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

Index

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n(`

Documentation

After

Creates a function that invokes given func once it's called n or more times.

Signature:

go
func After(n int, fn any) func(args ...any) []reflect.Value
func After(n int, fn any) func(args ...any) []reflect.Value

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}

Before

creates a function that invokes func once it's called less than n times.

Signature:

go
func Before(n int, fn any) func(args ...any) []reflect.Value
func Before(n int, fn any) func(args ...any) []reflect.Value

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}

CurryFn

Make curry function.

Signature:

go
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}

Compose

Compose the function list from right to left, then return the composed function.

Signature:

go
func Compose[T any](fnList ...func(...T) T) func(...T) T
func Compose[T any](fnList ...func(...T) T) func(...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}

Debounced

Creates a debounced function that delays invoking fn until after wait duration have elapsed since the last time the debounced function was invoked.

Signature:

go
func Debounced(fn func(), duration time.Duration) func()
func Debounced(fn func(), duration time.Duration) func()

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}

Delay

Invoke function after delayed time.

Signature:

go
func Delay(delay time.Duration, fn any, args ...any)
func Delay(delay time.Duration, fn any, args ...any)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}

Schedule

Invoke function every duration time, until close the returned bool chan.

Signature:

go
func Schedule(d time.Duration, fn any, args ...any) chan bool
func Schedule(d time.Duration, fn any, args ...any) chan bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}

Pipeline

Pipeline takes a list of functions and returns a function whose param will be passed into the functions one by one.

Signature:

go
func Pipeline[T any](funcs ...func(T) T) func(T) T
func Pipeline[T any](funcs ...func(T) T) func(T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}

Watcher

Watcher is used for record code excution time. can start/stop/reset the watch timer. get the elapsed time of function execution.

Signature:

go
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start() //start the watcher
+func (w *Watcher) Stop() //stop the watcher
+func (w *Watcher) Reset() //reset the watcher
+func (w *Watcher) GetElapsedTime() time.Duration //get the elapsed time of function execution
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start() //start the watcher
+func (w *Watcher) Stop() //stop the watcher
+func (w *Watcher) Reset() //reset the watcher
+func (w *Watcher) GetElapsedTime() time.Duration //get the elapsed time of function execution

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}
`,55),h=[t,c,r,y,F,i,u,A,d,E,f];function g(m,B,C,b,v,k){return p(),o("div",null,h)}const _=l(e,[["render",g]]);export{q as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.lean.js b/docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.lean.js new file mode 100644 index 0000000..33ae6cc --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_function.md.0aff7e60.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const q=JSON.parse('{"title":"Function","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/function.md","filePath":"en/api/packages/function.md"}'),e={name:"en/api/packages/function.md"},t=s("h1",{id:"Function",tabindex:"-1"},[a("Function "),s("a",{class:"header-anchor",href:"#Function","aria-label":'Permalink to "Function"'},"​")],-1),c=s("p",null,"Package function can control the flow of function execution and support part of functional programming.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/function.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/function.go")]),s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/function/watcher.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/function/watcher.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),f=n("",55),h=[t,c,r,y,F,i,u,A,d,E,f];function g(m,B,C,b,v,k){return p(),o("div",null,h)}const _=l(e,[["render",g]]);export{q as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.js b/docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.js new file mode 100644 index 0000000..106a20c --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.js @@ -0,0 +1,1645 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Maputil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/maputil.md","filePath":"en/api/packages/maputil.md"}'),e={name:"en/api/packages/maputil.md"},t=s("h1",{id:"Maputil",tabindex:"-1"},[a("Maputil "),s("a",{class:"header-anchor",href:"#Maputil","aria-label":'Permalink to "Maputil"'},"​")],-1),c=s("p",null,"Package maputil includes some functions to manipulate map.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/maputil/map.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/maputil/map.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

Example:

go
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

Index

',2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

Documentation

MapTo

Rry to map any interface to struct or base type.

Signature:

go
func MapTo(src any, dst any) error
func MapTo(src any, dst any) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  \`json:"name"\`
+            Age   int     \`json:"age"\`
+            Phone string  \`json:"phone"\`
+            Addr  Address \`json:"address"\`
+        }
+
+        Address struct {
+            Street string \`json:"street"\`
+            Number int    \`json:"number"\`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  \`json:"name"\`
+            Age   int     \`json:"age"\`
+            Phone string  \`json:"phone"\`
+            Addr  Address \`json:"address"\`
+        }
+
+        Address struct {
+            Street string \`json:"street"\`
+            Number int    \`json:"number"\`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}

ForEach

Executes iteratee funcation for every key and value pair in map.

Signature:

go
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}

Filter

Iterates over map, return a new map contains all key and value pairs pass the predicate function.

Signature:

go
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := maputil.Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := maputil.Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}

FilterByKeys

Iterates over map, return a new map whose keys are all given keys.

Signature:

go
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}

FilterByValues

Iterates over map, return a new map whose values are all given values.

Signature:

go
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}

OmitBy

OmitBy is the opposite of Filter, removes all the map elements for which the predicate function returns true.

Signature:

go
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}

OmitByKeys

The opposite of FilterByKeys, extracts all the map elements which keys are not omitted.

Signature:

go
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}

OmitByValues

The opposite of FilterByValues. remov all elements whose value are in the give slice.

Signature:

go
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Intersect

Iterates over maps, return a new map of key and value pairs in all given maps.

Signature:

go
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}

Keys

Returns a slice of the map's keys.

Signature:

go
func Keys[K comparable, V any](m map[K]V) []K
func Keys[K comparable, V any](m map[K]V) []K

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Merge

Merge maps, next key will overwrite previous key.

Signature:

go
func Merge[K comparable, V any](maps ...map[K]V) map[K]V
func Merge[K comparable, V any](maps ...map[K]V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}

Minus

Creates an map of whose key in mapA but not in mapB.

Signature:

go
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}

Values

Returns a slice of the map's values.

Signature:

go
func Values[K comparable, V any](m map[K]V) []V
func Values[K comparable, V any](m map[K]V) []V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a a b c d]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a a b c d]
+}

KeysBy

Creates a slice whose element is the result of function mapper invoked by every map's key.

Signature:

go
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}

ValuesBy

Creates a slice whose element is the result of function mapper invoked by every map's value.

Signature:

go
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}

MapKeys

Transforms a map to other type map by manipulating it's keys.

Signature:

go
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}

MapValues

Transforms a map to other type map by manipulating it's values.

Signature:

go
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}

Entry

Transforms a map into array of key/value pairs.

Signature:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}

FromEntries

Creates a map based on a slice of key/value pairs.

Signature:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Transform

Transform a map to another type map.

Signature:

go
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2

Example:Run

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

IsDisjoint

Checks two maps are disjoint if they have no keys in common.

Signature:

go
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasKey

Checks if map has key or not. This function is used to replace the following boilerplate code:

go
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}

Signature:

go
func HasKey[K comparable, V any](m map[K]V, key K) bool
func HasKey[K comparable, V any](m map[K]V, key K) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NewConcurrentMap

ConcurrentMap is like map, but is safe for concurrent use by multiple goroutines.

Signature:

go
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}

ConcurrentMap_Set

Set the value for a key.

Signature:

go
func (cm *ConcurrentMap[K, V]) Set(key K, value V)
func (cm *ConcurrentMap[K, V]) Set(key K, value V)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_Get

Get the value stored in the map for a key, or nil if no.

Signature:

go
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_GetOrSet

Returns the existing value for the key if present. Otherwise, it sets and returns the given value.

Signature:

go
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}

ConcurrentMap_Delete

Delete the value for a key.

Signature:

go
func (cm *ConcurrentMap[K, V]) Delete(key K)
func (cm *ConcurrentMap[K, V]) Delete(key K)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}

ConcurrentMap_GetAndDelete

Returns the existing value for the key if present and then delete the value for the key. Otherwise, do nothing, just return false.

Signature:

go
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}

ConcurrentMap_Has

Checks if map has the value for a key.

Signature:

go
func (cm *ConcurrentMap[K, V]) Has(key K) bool
func (cm *ConcurrentMap[K, V]) Has(key K) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}

ConcurrentMap_Range

Calls iterator sequentially for each key and value present in each of the shards in the map. If iterator returns false, range stops the iteration.

Signature:

go
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}
`,182),B=[t,c,r,y,F,i,E,A,u,m,d];function g(q,f,h,v,D,C){return p(),o("div",null,B)}const K=l(e,[["render",g]]);export{k as __pageData,K as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.lean.js b/docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.lean.js new file mode 100644 index 0000000..8ac08fd --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_maputil.md.4fc65b0e.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Maputil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/maputil.md","filePath":"en/api/packages/maputil.md"}'),e={name:"en/api/packages/maputil.md"},t=s("h1",{id:"Maputil",tabindex:"-1"},[a("Maputil "),s("a",{class:"header-anchor",href:"#Maputil","aria-label":'Permalink to "Maputil"'},"​")],-1),c=s("p",null,"Package maputil includes some functions to manipulate map.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/maputil/map.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/maputil/map.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",182),B=[t,c,r,y,F,i,E,A,u,m,d];function g(q,f,h,v,D,C){return p(),o("div",null,B)}const K=l(e,[["render",g]]);export{k as __pageData,K as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.js b/docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.js new file mode 100644 index 0000000..ed30c51 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.js @@ -0,0 +1,1059 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Mathutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/mathutil.md","filePath":"en/api/packages/mathutil.md"}'),e={name:"en/api/packages/mathutil.md"},t=s("h1",{id:"Mathutil",tabindex:"-1"},[a("Mathutil "),s("a",{class:"header-anchor",href:"#Mathutil","aria-label":'Permalink to "Mathutil"'},"​")],-1),c=s("p",null,"Package mathutil implements some functions for math calculation.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Example:

go
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation

Average

Return average value of numbers. Maybe call RoundToFloat to round result.

Signature:

go
func Average[T constraints.Integer | constraints.Float](numbers ...T) T
func Average[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}

Exponent

Calculate x to the nth power.

Signature:

go
func Exponent(x, n int64) int64
func Exponent(x, n int64) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}

Fibonacci

Calculate the nth number of fibonacci sequence.

Signature:

go
func Fibonacci(first, second, n int) int
func Fibonacci(first, second, n int) int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}

Factorial

Calculate the factorial of x.

Signature:

go
func Factorial(x uint) uint
func Factorial(x uint) uint

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}

Max

Return max value of numbers.

Signature:

go
func Max[T constraints.Integer | constraints.Float](numbers ...T) T
func Max[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}

MaxBy

Return the maximum value of a slice using the given comparator function.

Signature:

go
func MaxBy[T any](slice []T, comparator func(T, T) bool) T
func MaxBy[T any](slice []T, comparator func(T, T) bool) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}

Min

Return the minimum value of numbers.

Signature:

go
func Min[T constraints.Integer | constraints.Float](numbers ...T) T
func Min[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}

MinBy

Return the minimum value of a slice using the given comparator function.

Signature:

go
func MinBy[T any](slice []T, comparator func(T, T) bool) T
func MinBy[T any](slice []T, comparator func(T, T) bool) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}

Percent

calculate the percentage of val to total, retain n decimal places.

Signature:

go
func Percent(val, total float64, n int) float64
func Percent(val, total float64, n int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}

RoundToFloat

Round float up to n decimal places.

Signature:

go
func RoundToFloat(x float64, n int) float64
func RoundToFloat(x float64, n int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

RoundToString

Round float up to n decimal places. will return string.

Signature:

go
func RoundToString(x float64, n int) string
func RoundToString(x float64, n int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

TruncRound

Round float off n decimal places.

Signature:

go
func TruncRound(x float64, n int) float64
func TruncRound(x float64, n int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}

Range

Creates a slice of numbers from start with specified count, element step is 1.

Signature:

go
func Range[T constraints.Integer | constraints.Float](start T, count int) []T
func Range[T constraints.Integer | constraints.Float](start T, count int) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}

RangeWithStep

Creates a slice of numbers from start to end with specified step.

Signature:

go
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}

AngleToRadian

Converts angle value to radian value.

Signature:

go
func AngleToRadian(angle float64) float64
func AngleToRadian(angle float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}

RadianToAngle

Converts radian value to angle value.

Signature:

go
func RadianToAngle(radian float64) float64
func RadianToAngle(radian float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}

PointDistance

Caculates two points distance.

Signature:

go
func PointDistance(x1, y1, x2, y2 float64) float64
func PointDistance(x1, y1, x2, y2 float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}

IsPrime

Checks if number is prime number.

Signature:

go
func IsPrime(n int) bool
func IsPrime(n int) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

GCD

Return greatest common divisor (GCD) of integers.

Signature:

go
func GCD[T constraints.Integer](integers ...T) T
func GCD[T constraints.Integer](integers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}

LCM

Return Least Common Multiple (LCM) of integers.

Signature:

go
func LCM[T constraints.Integer](integers ...T) T
func LCM[T constraints.Integer](integers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}

Cos

Returns the cosine of the radian argument.

Signature:

go
func Cos(radian float64, precision ...int) float64
func Cos(radian float64, precision ...int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}

Sin

Returns the sine of the radian argument.

Signature:

go
func Sin(radian float64, precision ...int) float64
func Sin(radian float64, precision ...int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}

Log

Returns the logarithm of base n.

Signature:

go
func Log(n, base float64) float64
func Log(n, base float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}

Sum

Returns sum of passed numbers.

Signature:

go
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}

Abs

Returns the absolute value of x.

Signature:

go
func Abs[T constraints.Integer | constraints.Float](x T) T
func Abs[T constraints.Integer | constraints.Float](x T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}
`,151),m=[t,c,r,y,F,i,A,u,E,d,g];function h(B,f,v,b,C,q){return p(),o("div",null,m)}const P=l(e,[["render",h]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.lean.js b/docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.lean.js new file mode 100644 index 0000000..c8e8636 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_mathutil.md.cd3e0e74.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Mathutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/mathutil.md","filePath":"en/api/packages/mathutil.md"}'),e={name:"en/api/packages/mathutil.md"},t=s("h1",{id:"Mathutil",tabindex:"-1"},[a("Mathutil "),s("a",{class:"header-anchor",href:"#Mathutil","aria-label":'Permalink to "Mathutil"'},"​")],-1),c=s("p",null,"Package mathutil implements some functions for math calculation.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/mathutil/mathutil.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",151),m=[t,c,r,y,F,i,A,u,E,d,g];function h(B,f,v,b,C,q){return p(),o("div",null,m)}const P=l(e,[["render",h]]);export{D as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.js b/docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.js new file mode 100644 index 0000000..5c2fa97 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.js @@ -0,0 +1,1169 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Netutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/netutil.md","filePath":"en/api/packages/netutil.md"}'),e={name:"en/api/packages/netutil.md"},t=s("h1",{id:"Netutil",tabindex:"-1"},[a("Netutil "),s("a",{class:"header-anchor",href:"#Netutil","aria-label":'Permalink to "Netutil"'},"​")],-1),c=s("p",null,"Package netutil contains functions to get net information and send http request.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/net.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/net.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/http.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/http.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation

ConvertMapToQueryString

Convert map to url query string.

Signature:

go
func ConvertMapToQueryString(param map[string]any) string
func ConvertMapToQueryString(param map[string]any) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    // Output:
+    // a=1&b=2&c=3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    // Output:
+    // a=1&b=2&c=3
+}

EncodeUrl

Encode url query string values.

Signature:

go
func EncodeUrl(urlStr string) (string, error)
func EncodeUrl(urlStr string) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}

GetInternalIp

Get internal ip information.

Signature:

go
func GetInternalIp() string
func GetInternalIp() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}

GetIps

Get all ipv4 list.

Signature:

go
func GetIps() []string
func GetIps() []string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}

GetMacAddrs

Get all mac addresses list.

Signature:

go
func GetMacAddrs() []string {
func GetMacAddrs() []string {

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}

GetPublicIpInfo

Get public ip information.

Signature:

go
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  \`json:"status"\`
+    Country     string  \`json:"country"\`
+    CountryCode string  \`json:"countryCode"\`
+    Region      string  \`json:"region"\`
+    RegionName  string  \`json:"regionName"\`
+    City        string  \`json:"city"\`
+    Lat         float64 \`json:"lat"\`
+    Lon         float64 \`json:"lon"\`
+    Isp         string  \`json:"isp"\`
+    Org         string  \`json:"org"\`
+    As          string  \`json:"as"\`
+    Ip          string  \`json:"query"\`
+}
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  \`json:"status"\`
+    Country     string  \`json:"country"\`
+    CountryCode string  \`json:"countryCode"\`
+    Region      string  \`json:"region"\`
+    RegionName  string  \`json:"regionName"\`
+    City        string  \`json:"city"\`
+    Lat         float64 \`json:"lat"\`
+    Lon         float64 \`json:"lon"\`
+    Isp         string  \`json:"isp"\`
+    Org         string  \`json:"org"\`
+    As          string  \`json:"as"\`
+    Ip          string  \`json:"query"\`
+}

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}

GetRequestPublicIp

Get http request public ip.

Signature:

go
func GetRequestPublicIp(req *http.Request) string
func GetRequestPublicIp(req *http.Request) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}

IsPublicIP

Checks if an ip is public or not.

Signature:

go
func IsPublicIP(IP net.IP) bool
func IsPublicIP(IP net.IP) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

IsInternalIP

Checks if an ip is intranet or not.

Signature:

go
func IsInternalIP(IP net.IP) bool
func IsInternalIP(IP net.IP) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HttpRequest

HttpRequest is a struct used to abstract HTTP request entity.

Signature:

go
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}

HttpClient

HttpClient is a struct used to send HTTP request. It can be instanced with some configurations or none config.

Signature:

go
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}

SendRequest

Use HttpClient to send HTTP request.

Signature:

go
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

DecodeResponse

Decode http response into target object.

Signature:

go
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    \`json:"userId"\`
+        Id        int    \`json:"id"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

StructToUrlValues

Convert struct to url values, only convert the field which is exported and has \`json\` tag.

Signature:

go
func StructToUrlValues(targetStruct any) url.Values
func StructToUrlValues(targetStruct any) url.Values

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Name   string \`json:"name,omitempty"\`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Name   string \`json:"name,omitempty"\`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}

HttpGet

Send http get request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpGet(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpGet(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPost

Send http post request.(Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPost(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPost(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPut

Send http put request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPut(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPut(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpDelete

Send http delete request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpDelete(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpDelete(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPatch

Send http patch request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPatch(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPatch(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    \`json:"id"\`
+        UserId int    \`json:"userId"\`
+        Title  string \`json:"title"\`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

ParseHttpResponse

Decode http response to specified interface.

Signature:

go
func ParseHttpResponse(resp *http.Response, obj any) error
func ParseHttpResponse(resp *http.Response, obj any) error

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    \`json:"id"\`
+        UserId    int    \`json:"userId"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    \`json:"id"\`
+        UserId    int    \`json:"userId"\`
+        Title     string \`json:"title"\`
+        Completed bool   \`json:"completed"\`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}

DownloadFile

Download the file exist in url to a local file.

Signature:

go
func DownloadFile(filepath string, url string) error
func DownloadFile(filepath string, url string) error

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}

UploadFile

Upload the file to a server.

Signature:

go
func UploadFile(filepath string, server string) (bool, error)
func UploadFile(filepath string, server string) (bool, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}

IsPingConnected

checks if can ping the specified host or not.

Signature:

go
func IsPingConnected(host string) bool
func IsPingConnected(host string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsTelnetConnected

Checks if can telnet the specified host or not.

Signature:

go
func IsTelnetConnected(host string, port string) bool
func IsTelnetConnected(host string, port string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
`,146),q=[t,c,r,y,F,i,u,E,A,d,g];function h(B,m,f,D,b,C){return p(),o("div",null,q)}const P=l(e,[["render",h]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.lean.js b/docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.lean.js new file mode 100644 index 0000000..e31ce14 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_netutil.md.4a71afe0.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Netutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/netutil.md","filePath":"en/api/packages/netutil.md"}'),e={name:"en/api/packages/netutil.md"},t=s("h1",{id:"Netutil",tabindex:"-1"},[a("Netutil "),s("a",{class:"header-anchor",href:"#Netutil","aria-label":'Permalink to "Netutil"'},"​")],-1),c=s("p",null,"Package netutil contains functions to get net information and send http request.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/net.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/net.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/netutil/http.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/netutil/http.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",146),q=[t,c,r,y,F,i,u,E,A,d,g];function h(B,m,f,D,b,C){return p(),o("div",null,q)}const P=l(e,[["render",h]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.js b/docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.js new file mode 100644 index 0000000..2d0c1d8 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.js @@ -0,0 +1,233 @@ +import{_ as p,o as l,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Pointer","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/pointer.md","filePath":"en/api/packages/pointer.md"}'),e={name:"en/api/packages/pointer.md"},t=s("h1",{id:"Pointer",tabindex:"-1"},[a("Pointer "),s("a",{class:"header-anchor",href:"#Pointer","aria-label":'Permalink to "Pointer"'},"​")],-1),c=s("p",null,"pointer contains some util functions to operate go pointer.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

Index

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation

Of

Returns a pointer to the pass value \`v\`.

Signature:

go
func Of[T any](v T) *T
func Of[T any](v T) *T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}

Unwrap

Returns the value from the pointer.

Signature:

go
func Unwrap[T any](p *T) T
func Unwrap[T any](p *T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}

UnwarpOr

Returns the value from the pointer or fallback if the pointer is nil.

Signature:

go
UnwarpOr[T any](p *T, fallback T) T
UnwarpOr[T any](p *T, fallback T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}

UnwarpOrDefault

Returns the value from the pointer or the default value if the pointer is nil.

Signature:

go
UnwarpOrDefault[T any](p *T) T
UnwarpOrDefault[T any](p *T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}

ExtractPointer

Returns the underlying value by the given interface type

Signature:

go
func ExtractPointer(value any) any
func ExtractPointer(value any) any

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}
`,31),h=[t,c,r,y,F,i,u,A,d,E,g];function f(m,b,B,v,D,C){return l(),o("div",null,h)}const _=p(e,[["render",f]]);export{k as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.lean.js b/docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.lean.js new file mode 100644 index 0000000..92d044b --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_pointer.md.51cdc76e.lean.js @@ -0,0 +1 @@ +import{_ as p,o as l,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Pointer","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/pointer.md","filePath":"en/api/packages/pointer.md"}'),e={name:"en/api/packages/pointer.md"},t=s("h1",{id:"Pointer",tabindex:"-1"},[a("Pointer "),s("a",{class:"header-anchor",href:"#Pointer","aria-label":'Permalink to "Pointer"'},"​")],-1),c=s("p",null,"pointer contains some util functions to operate go pointer.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/pointer/pointer.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",31),h=[t,c,r,y,F,i,u,A,d,E,g];function f(m,b,B,v,D,C){return l(),o("div",null,h)}const _=p(e,[["render",f]]);export{k as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.js b/docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.js new file mode 100644 index 0000000..e1b0a9a --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.js @@ -0,0 +1,191 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Random","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/random.md","filePath":"en/api/packages/random.md"}'),e={name:"en/api/packages/random.md"},t=s("h1",{id:"Random",tabindex:"-1"},[n("Random "),s("a",{class:"header-anchor",href:"#Random","aria-label":'Permalink to "Random"'},"​")],-1),c=s("p",null,"Package random implements some basic functions to generate random int and string.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/random/random.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/random/random.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/random"
+)
import (
+    "github.com/duke-git/lancet/v2/random"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=a('

Index

',2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),m=a(`

Documentation

RandBytes

Generate random byte slice.

Signature:

go
func RandBytes(length int) []byte
func RandBytes(length int) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}

RandInt

Generate random int between min and max, may contain min, not max.

Signature:

go
func RandInt(min, max int) int
func RandInt(min, max int) int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}

RandString

Generate random given length string. only contains letter (a-zA-Z)

Signature:

go
func RandString(length int) string
func RandString(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}

RandUpper

Generate a random upper case string

Signature:

go
func RandUpper(length int) string
func RandUpper(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}

RandLower

Generate a random lower case string

Signature:

go
func RandLower(length int) string
func RandLower(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}

RandNumeral

Generate a random numeral string

Signature:

go
func RandNumeral(length int) string
func RandNumeral(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}

RandNumeralOrLetter

generate a random numeral or letter string

Signature:

go
func RandNumeralOrLetter(length int) string
func RandNumeralOrLetter(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}

UUIdV4

Generate a random UUID of version 4 according to RFC 4122.

Signature:

go
func UUIdV4() (string, error)
func UUIdV4() (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}

RandUniqueIntSlice

Generate a slice of random int of length n that do not repeat.

Signature:

go
func RandUniqueIntSlice(n, min, max int) []int
func RandUniqueIntSlice(n, min, max int) []int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}
`,55),h=[t,c,r,y,i,F,d,u,g,E,m];function A(f,v,b,k,q,R){return p(),o("div",null,h)}const _=l(e,[["render",A]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.lean.js b/docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.lean.js new file mode 100644 index 0000000..52f48ca --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_random.md.09d4734b.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a as n,X as a}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Random","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/random.md","filePath":"en/api/packages/random.md"}'),e={name:"en/api/packages/random.md"},t=s("h1",{id:"Random",tabindex:"-1"},[n("Random "),s("a",{class:"header-anchor",href:"#Random","aria-label":'Permalink to "Random"'},"​")],-1),c=s("p",null,"Package random implements some basic functions to generate random int and string.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[n("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/random/random.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/random/random.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),d=a("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),g=a("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),m=a("",55),h=[t,c,r,y,i,F,d,u,g,E,m];function A(f,v,b,k,q,R){return p(),o("div",null,h)}const _=l(e,[["render",A]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.js b/docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.js new file mode 100644 index 0000000..1aacf36 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.js @@ -0,0 +1,301 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Retry","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/retry.md","filePath":"en/api/packages/retry.md"}'),e={name:"en/api/packages/retry.md"},t=s("h1",{id:"Retry",tabindex:"-1"},[a("Retry "),s("a",{class:"header-anchor",href:"#Retry","aria-label":'Permalink to "Retry"'},"​")],-1),r=s("p",null,"Package retry is for executing a function repeatedly until it was successful or canceled by the context.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/retry/retry.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/retry/retry.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/retry"
+)
import (
+    "github.com/duke-git/lancet/v2/retry"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

Documentation

Context

Set retry context config, can cancel the retry with context.

Signature:

go
func Context(ctx context.Context)
func Context(ctx context.Context)

Example:Run

go
import (
+    "context"
+    "errors"
+    "fmt"
+    "github.com/duke-git/lancet/v2/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}
import (
+    "context"
+    "errors"
+    "fmt"
+    "github.com/duke-git/lancet/v2/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}

RetryFunc

Function that retry executes.

Signature:

go
type RetryFunc func() error
type RetryFunc func() error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

RetryTimes

Set times of retry. Default times is 5.

Signature:

go
func RetryTimes(n uint)
func RetryTimes(n uint)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}

RetryDuration

Set duration of retries. Default duration is 3 second.

Signature:

go
func RetryDuration(d time.Duration)
func RetryDuration(d time.Duration)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

Retry

Executes the retryFunc repeatedly until it was successful or canceled by the context.

Signature:

go
func Retry(retryFunc RetryFunc, opts ...Option) error
func Retry(retryFunc RetryFunc, opts ...Option) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
`,31),g=[t,r,c,y,F,i,u,E,A,d,m];function h(b,f,B,q,C,D){return p(),o("div",null,g)}const R=l(e,[["render",h]]);export{k as __pageData,R as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.lean.js b/docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.lean.js new file mode 100644 index 0000000..645b87e --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_retry.md.9ae8caac.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Retry","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/retry.md","filePath":"en/api/packages/retry.md"}'),e={name:"en/api/packages/retry.md"},t=s("h1",{id:"Retry",tabindex:"-1"},[a("Retry "),s("a",{class:"header-anchor",href:"#Retry","aria-label":'Permalink to "Retry"'},"​")],-1),r=s("p",null,"Package retry is for executing a function repeatedly until it was successful or canceled by the context.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/retry/retry.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/retry/retry.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",31),g=[t,r,c,y,F,i,u,E,A,d,m];function h(b,f,B,q,C,D){return p(),o("div",null,g)}const R=l(e,[["render",h]]);export{k as __pageData,R as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.js b/docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.js new file mode 100644 index 0000000..ea17adf --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.js @@ -0,0 +1,2507 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Slice","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/slice.md","filePath":"en/api/packages/slice.md"}'),e={name:"en/api/packages/slice.md"},t=s("h1",{id:"Slice",tabindex:"-1"},[a("Slice "),s("a",{class:"header-anchor",href:"#Slice","aria-label":'Permalink to "Slice"'},"​")],-1),c=s("p",null,"Package slice implements some functions to manipulate slice.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/slice/slice.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/slice/slice.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/slice"
+)
import (
+    "github.com/duke-git/lancet/v2/slice"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n(`

Documentation

AppendIfAbsent

If slice doesn't contain the item, append it to the slice.

Signature:

go
func AppendIfAbsent[T comparable](slice []T, item T) []T
func AppendIfAbsent[T comparable](slice []T, item T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}

Contain

Check if the target value is in the slice or not.

Signature:

go
func Contain[T comparable](slice []T, target T) bool
func Contain[T comparable](slice []T, target T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainBy

returns true if predicate function return true.

Signature:

go
func ContainBy[T any](slice []T, predicate func(item T) bool) bool
func ContainBy[T any](slice []T, predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}

ContainSubSlice

Check if the slice contain subslice or not.

Signature:

go
func ContainSubSlice[T comparable](slice, subSlice []T) bool
func ContainSubSlice[T comparable](slice, subSlice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Chunk

Creates an slice of elements split into groups the length of \`size\`.

Signature:

go
func Chunk[T any](slice []T, size int) [][]T
func Chunk[T any](slice []T, size int) [][]T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}

Compact

Creates an slice with all falsey values removed. The values false, nil, 0, and "" are falsey.

Signature:

go
func Compact[T comparable](slice []T) []T
func Compact[T comparable](slice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}

Concat

Creates a new slice concatenating slice with any additional slices.

Signature:

go
func Concat[T any](slice []T, slices ...[]T) []T
func Concat[T any](slice []T, slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}

Count

Returns the number of occurrences of the given item in the slice.

Signature:

go
func Count[T comparable](slice []T, item T) int
func Count[T comparable](slice []T, item T) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}

CountBy

Iterates over elements of slice with predicate function, returns the number of all matched elements.

Signature:

go
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}

Difference

Creates an slice of whose element not included in the other given slice.

Signature:

go
func Difference[T comparable](slice, comparedSlice []T) []T
func Difference[T comparable](slice, comparedSlice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

DifferenceBy

DifferenceBy accepts iteratee func which is invoked for each element of slice and values to generate the criterion by which they're compared.

Signature:

go
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}

DifferenceWith

DifferenceWith accepts comparator which is invoked to compare elements of slice to values. The order and references of result values are determined by the first slice.

Signature:

go
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}

DeleteAt

Delete the element of slice from start index to end index - 1.

Signature:

go
func DeleteAt[T any](slice []T, start int, end ...int)
func DeleteAt[T any](slice []T, start int, end ...int)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+}

Drop

Drop n elements from the start of a slice.

Signature:

go
func Drop[T any](slice []T, n int) []T
func Drop[T any](slice []T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}

DropRight

Drop n elements from the end of a slice.

Signature:

go
func DropRight[T any](slice []T, n int) []T
func DropRight[T any](slice []T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}

DropWhile

Drop n elements from the start of a slice while predicate function returns true.

Signature:

go
func DropWhile[T any](slice []T, predicate func(item T) bool) []T
func DropWhile[T any](slice []T, predicate func(item T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}

DropRightWhile

Drop n elements from the end of a slice while predicate function returns true.

Signature:

go
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}

Equal

Check if two slices are equal: the same length and all elements' order and value are equal.

Signature:

go
func Equal[T comparable](slice1, slice2 []T) bool
func Equal[T comparable](slice1, slice2 []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

EqualWith

Check if two slices are equal with comparator func.

Signature:

go
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

Every

Return true if all of the values in the slice pass the predicate function.

Signature:

go
func Every[T any](slice []T, predicate func(index int, item T) bool) bool
func Every[T any](slice []T, predicate func(index int, item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}

Filter

Return all elements which match the function.

Signature:

go
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}

Find(deprecated: use FindBy)

Iterates over elements of slice, returning the first one that passes a truth test on function.

Signature:

go
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindBy

Iterates over elements of slice, returning the first one that passes a truth test on predicate function.If return T is nil or zero value then no items matched the predicate func. In contrast to Find or FindLast, its return value no longer requires dereferencing.

Signature:

go
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindLast(deprecated: use FindLastBy)

iterates over elements of slice from end to begin, returning the last one that passes a truth test on function.

Signature:

go
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

FindLastBy

FindLastBy iterates over elements of slice, returning the last one that passes a truth test on predicate function. If return T is nil or zero value then no items matched the predicate func. In contrast to Find or FindLast, its return value no longer requires dereferencing.

Signature:

go
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Flatten

Flatten slice with one level.

Signature:

go
func Flatten(slice any) any
func Flatten(slice any) any

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}

FlattenDeep

flattens slice recursive.

Signature:

go
func FlattenDeep(slice any) any
func FlattenDeep(slice any) any

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}

ForEach

Iterates over elements of slice and invokes function for each element.

Signature:

go
func ForEach[T any](slice []T, iteratee func(index int, item T))
func ForEach[T any](slice []T, iteratee func(index int, item T))

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

ForEachWithBreak

Iterates over elements of slice and invokes function for each element, when iteratee return false, will break the for each loop.

Signature:

go
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}

GroupBy

Iterates over elements of the slice, each element will be group by criteria, returns two slices.

Signature:

go
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}

GroupWith

Return a map composed of keys generated from the results of running each element of slice thru iteratee.

Signature:

go
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}

IntSlice (Deprecated: use generic feature of go1.18+ for replacement)

Convert interface slice to int slice.

Signature:

go
func IntSlice(slice any) []int
func IntSlice(slice any) []int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

InterfaceSlice (Deprecated: use generic feature of go1.18+ for replacement)

Convert value to interface slice.

Signature:

go
func InterfaceSlice(slice any) []any
func InterfaceSlice(slice any) []any

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

Intersection

Creates a slice of unique values that included by all slices.

Signature:

go
func Intersection[T comparable](slices ...[]T) []T
func Intersection[T comparable](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}

InsertAt

insert the element into slice at index.

Signature:

go
func InsertAt[T any](slice []T, index int, value any) []T
func InsertAt[T any](slice []T, index int, value any) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}

IndexOf

Returns the index at which the first occurrence of a item is found in a slice or return -1 if the item cannot be found.

Signature:

go
func IndexOf[T comparable](slice []T, item T) int
func IndexOf[T comparable](slice []T, item T) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LastIndexOf

Returns the index at which the last occurrence of a item is found in a slice or return -1 if the item cannot be found.

Signature:

go
func LastIndexOf[T comparable](slice []T, item T) int
func LastIndexOf[T comparable](slice []T, item T) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}

Map

Creates an slice of values by running each element in slice thru function.

Signature:

go
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

FilterMap

Returns a slice which apply both filtering and mapping to the given slice. iteratee callback function should returntwo values: 1, mapping result. 2, whether the result element should be included or not.

Signature:

go
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}

FlatMap

Manipulates a slice and transforms and flattens it to a slice of another type.

Signature:

go
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}

Merge

Merge all given slices into one slice.

Signature:

go
func Merge[T any](slices ...[]T) []T
func Merge[T any](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}

Reverse

Reverse the elements order in slice.

Signature:

go
func Reverse[T any](slice []T)
func Reverse[T any](slice []T)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}

Reduce

Reduce slice.(Deprecated: use ReduceBy)

Signature:

go
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

ReduceBy

Produces a value from slice by accumulating the result of each element as passed through the reducer function.

Signature:

go
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}

ReduceRight

ReduceRight is like ReduceBy, but it iterates over elements of slice from right to left.

Signature:

go
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}

Replace

Returns a copy of the slice with the first n non-overlapping instances of old replaced by new.

Signature:

go
func Replace[T comparable](slice []T, old T, new T, n int) []T
func Replace[T comparable](slice []T, old T, new T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}

ReplaceAll

Returns a copy of the slice with the first n non-overlapping instances of old replaced by new.

Signature:

go
func ReplaceAll[T comparable](slice []T, old T, new T) []T
func ReplaceAll[T comparable](slice []T, old T, new T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}

Repeat

Creates a slice with length n whose elements are passed param item.

Signature:

go
func Repeat[T any](item T, n int) []T
func Repeat[T any](item T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}

Shuffle

Creates an slice of shuffled values.

Signature:

go
func Shuffle[T any](slice []T) []T
func Shuffle[T any](slice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}

IsAscending

Checks if a slice is ascending order.

Signature:

go
func IsAscending[T constraints.Ordered](slice []T) bool
func IsAscending[T constraints.Ordered](slice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsDescending

Checks if a slice is descending order.

Signature:

go
func IsDescending[T constraints.Ordered](slice []T) bool
func IsDescending[T constraints.Ordered](slice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsSorted

Checks if a slice is sorted (ascending or descending).

Signature:

go
func IsSorted[T constraints.Ordered](slice []T) bool
func IsSorted[T constraints.Ordered](slice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsSortedByKey

Checks if a slice is sorted by iteratee function.

Signature:

go
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

Sort

Sorts a slice of any ordered type(number or string), use quick sort algrithm. Default sort order is ascending (asc), if want descending order, set param \`sortOrder\` to \`desc\`. Ordered type: number(all ints uints floats) or string.

Signature:

go
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}

SortBy

Sorts the slice in ascending order as determined by the less function. This sort is not guaranteed to be stable.

Signature:

go
func SortBy[T any](slice []T, less func(a, b T) bool)
func SortBy[T any](slice []T, less func(a, b T) bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}

SortByField (Deprecated: use Sort and SortBy for replacement)

Sort struct slice by field. Slice element should be struct, field type should be int, uint, string, or bool. Default sort type is ascending (asc), if descending order, set sortType to desc.

Signature:

go
func SortByField(slice any, field string, sortType ...string) error
func SortByField(slice any, field string, sortType ...string) error

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}

Some

Return true if any of the values in the list pass the predicate function.

Signature:

go
func Some[T any](slice []T, predicate func(index int, item T) bool) bool
func Some[T any](slice []T, predicate func(index int, item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

StringSlice (Deprecated: use generic feature of go1.18+ for replacement)

Convert interface slice to string slice.

Signature:

go
func StringSlice(slice any) []string
func StringSlice(slice any) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

SymmetricDifference

Create a slice whose element is in given slices, but not in both slices.

Signature:

go
func SymmetricDifference[T comparable](slices ...[]T) []T
func SymmetricDifference[T comparable](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

ToSlice

Creates a slice of give items.

Signature:

go
func ToSlice[T any](items ...T) []T
func ToSlice[T any](items ...T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

ToSlicePointer

Returns a pointer to the slices of a variable parameter transformation

Signature:

go
func ToSlicePointer[T any](items ...T) []*T
func ToSlicePointer[T any](items ...T) []*T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}

Unique

Remove duplicate elements in slice.

Signature:

go
func Unique[T comparable](slice []T) []T
func Unique[T comparable](slice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}

UniqueBy

Call iteratee func with every item of slice, then remove duplicated.

Signature:

go
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}

Union

Creates a slice of unique values, in order, from all given slices. using == for equality comparisons.

Signature:

go
func Union[T comparable](slices ...[]T) []T
func Union[T comparable](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}

UnionBy

UnionBy is like Union, what's more it accepts iteratee which is invoked for each element of each slice.

Signature:

go
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}

UpdateAt

Update the slice element at index. if param index < 0 or index <= len(slice), will return error.

Signature:

go
func UpdateAt[T any](slice []T, index int, value T) []T
func UpdateAt[T any](slice []T, index int, value T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}

Without

Creates a slice excluding all given items.

Signature:

go
func Without[T comparable](slice []T, items ...T) []T
func Without[T comparable](slice []T, items ...T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

KeyBy

Converts a slice to a map based on a callback function.

Signature:

go
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}

Join

Join the slice item with specify separator.

Signature:

go
func Join[T any](s []T, separator string) string
func Join[T any](s []T, separator string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}
`,415),g=[t,c,r,y,F,i,u,E,A,d,B];function f(h,q,m,b,v,D){return p(),o("div",null,g)}const T=l(e,[["render",f]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.lean.js b/docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.lean.js new file mode 100644 index 0000000..0b11880 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_slice.md.1a1b5495.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Slice","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/slice.md","filePath":"en/api/packages/slice.md"}'),e={name:"en/api/packages/slice.md"},t=s("h1",{id:"Slice",tabindex:"-1"},[a("Slice "),s("a",{class:"header-anchor",href:"#Slice","aria-label":'Permalink to "Slice"'},"​")],-1),c=s("p",null,"Package slice implements some functions to manipulate slice.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/slice/slice.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/slice/slice.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),B=n("",415),g=[t,c,r,y,F,i,u,E,A,d,B];function f(h,q,m,b,v,D){return p(),o("div",null,g)}const T=l(e,[["render",f]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.js b/docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.js new file mode 100644 index 0000000..9cabc63 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.js @@ -0,0 +1,945 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Stream","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/stream.md","filePath":"en/api/packages/stream.md"}'),e={name:"en/api/packages/stream.md"},t=s("h1",{id:"Stream",tabindex:"-1"},[a("Stream "),s("a",{class:"header-anchor",href:"#Stream","aria-label":'Permalink to "Stream"'},"​")],-1),c=s("p",null,"Package stream implements a sequence of elements supporting sequential and operations. This package is an experiment to explore if stream in go can work as the way java does. it's feature is very limited.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/stream/stream.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/stream/stream.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/stream"
+)
import (
+    "github.com/duke-git/lancet/v2/stream"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n(`

Documentation

Of

Creates a stream whose elements are the specified values.

Signature:

go
func Of[T any](elems ...T) stream[T]
func Of[T any](elems ...T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromSlice

Creates a stream from slice.

Signature:

go
func FromSlice[T any](source []T) stream[T]
func FromSlice[T any](source []T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromChannel

Creates a stream from channel.

Signature:

go
func FromChannel[T any](source <-chan T) stream[T]
func FromChannel[T any](source <-chan T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromRange

Creates a number stream from start to end. both start and end are included. [start, end]

Signature:

go
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Generate

Creates a stream where each element is generated by the provided generater function.

Signature:

go
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

Concat

Creates a lazily concatenated stream whose elements are all the elements of the first stream followed by all the elements of the second stream.

Signature:

go
func Concat[T any](a, b stream[T]) stream[T]
func Concat[T any](a, b stream[T]) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

Distinct

Creates returns a stream that removes the duplicated items. Support chainable operation

Signature:

go
func (s stream[T]) Distinct() stream[T]
func (s stream[T]) Distinct() stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}

Filter

Returns a stream consisting of the elements of this stream that match the given predicate. Support chainable operation

Signature:

go
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}

Map

Returns a stream consisting of the elements of this stream that apply the given function to elements of stream. Support chainable operation

Signature:

go
func (s stream[T]) Map(mapper func(item T) T) stream[T]
func (s stream[T]) Map(mapper func(item T) T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}

Peek

Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream. Support chainable operation

Signature:

go
func (s stream[T]) Peek(consumer func(item T)) stream[T]
func (s stream[T]) Peek(consumer func(item T)) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}

Skip

Returns a stream consisting of the remaining elements of this stream after discarding the first n elements of the stream. If this stream contains fewer than n elements then an empty stream will be returned. Support chainable operation

Signature:

go
func (s stream[T]) Skip(n int) stream[T]
func (s stream[T]) Skip(n int) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}

Limit

Returns a stream consisting of the elements of this stream, truncated to be no longer than maxSize in length. Support chainable operation

Signature:

go
func (s stream[T]) Limit(maxSize int) stream[T]
func (s stream[T]) Limit(maxSize int) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}

Reverse

Returns a stream whose elements are reverse order of given stream. Support chainable operation

Signature:

go
func (s stream[T]) Reverse() stream[T]
func (s stream[T]) Reverse() stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}

Range

Returns a stream whose elements are in the range from start(included) to end(excluded) original stream.Support chainable operation

Signature:

go
func (s stream[T]) Range(start, end int) stream[T]
func (s stream[T]) Range(start, end int) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}

Sorted

Returns a stream consisting of the elements of this stream, sorted according to the provided less function.Support chainable operation

Signature:

go
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}

ForEach

Performs an action for each element of this stream.

Signature:

go
func (s stream[T]) ForEach(action func(item T))
func (s stream[T]) ForEach(action func(item T))

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

Reduce

Performs a reduction on the elements of this stream, using an associative accumulation function, and returns an Optional describing the reduced value, if any.

Signature:

go
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

FindFirst

Returns the first element of this stream and true, or zero value and false if the stream is empty.

Signature:

go
func (s stream[T]) FindFirst() (T, bool)
func (s stream[T]) FindFirst() (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

FindLast

Returns the last element of this stream and true, or zero value and false if the stream is empty.

Signature:

go
func (s stream[T]) FindLast() (T, bool)
func (s stream[T]) FindLast() (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

Max

Returns the maximum element of this stream according to the provided less function. less fuction: a > b

Signature:

go
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Min

Returns the minimum element of this stream according to the provided less function. less fuction: a < b

Signature:

go
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

AllMatch

Returns whether all elements of this stream match the provided predicate.

Signature:

go
func (s stream[T]) AllMatch(predicate func(item T) bool) bool
func (s stream[T]) AllMatch(predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

AnyMatch

Returns whether any elements of this stream match the provided predicate.

Signature:

go
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NoneMatch

Returns whether no elements of this stream match the provided predicate.

Signature:

go
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Count

Returns the count of elements in the stream.

Signature:

go
func (s stream[T]) Count() int
func (s stream[T]) Count() int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}

ToSlice

Returns the elements in the stream.

Signature:

go
func (s stream[T]) ToSlice() []T
func (s stream[T]) ToSlice() []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
`,157),g=[t,c,r,y,F,i,A,u,E,d,m];function h(f,B,v,b,C,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{D as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.lean.js b/docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.lean.js new file mode 100644 index 0000000..5851305 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_stream.md.99e473e0.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const D=JSON.parse('{"title":"Stream","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/stream.md","filePath":"en/api/packages/stream.md"}'),e={name:"en/api/packages/stream.md"},t=s("h1",{id:"Stream",tabindex:"-1"},[a("Stream "),s("a",{class:"header-anchor",href:"#Stream","aria-label":'Permalink to "Stream"'},"​")],-1),c=s("p",null,"Package stream implements a sequence of elements supporting sequential and operations. This package is an experiment to explore if stream in go can work as the way java does. it's feature is very limited.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/stream/stream.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/stream/stream.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),m=n("",157),g=[t,c,r,y,F,i,A,u,E,d,m];function h(f,B,v,b,C,k){return p(),o("div",null,g)}const T=l(e,[["render",h]]);export{D as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.js b/docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.js new file mode 100644 index 0000000..742354e --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.js @@ -0,0 +1,561 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Structs","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/struct.md","filePath":"en/api/packages/struct.md"}'),e={name:"en/api/packages/struct.md"},t=s("h1",{id:"Structs",tabindex:"-1"},[a("Structs "),s("a",{class:"header-anchor",href:"#Structs","aria-label":'Permalink to "Structs"'},"​")],-1),c=s("p",null,"Struct is abstract struct for provide several high level functions",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/struct.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/struct.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/field.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/field.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/structs"
+)
import (
+    "github.com/duke-git/lancet/v2/structs"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n('

Index:

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation:

New

The constructor function of the \`Struct\`

Signature:

go
func New(value any, tagName ...string) *Struct
func New(value any, tagName ...string) *Struct

Example:

go
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}

ToMap

convert a valid struct to a map

Signature:

go
func (s *Struct) ToMap() (map[string]any, error)
func (s *Struct) ToMap() (map[string]any, error)

In addition, provided a convenient static function ToMap

go
func ToMap(v any) (map[string]any, error)
func ToMap(v any) (map[string]any, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    // use constructor function
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // use static function
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    // use constructor function
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // use static function
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}

Fields

Get all fields of a given struct, that the fields are abstract struct field

Signature:

go
func (s *Struct) Fields() []*Field
func (s *Struct) Fields() []*Field

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}

Field

Get an abstract field of a struct by given field name

Signature:

go
func (s *Struct) Field(name string) *Field
func (s *Struct) Field(name string) *Field

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}

IsStruct

Check if the struct is valid

Signature:

go
func (s *Struct) IsStruct() bool
func (s *Struct) IsStruct() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string \`json:"name"\`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}

Tag

Get a \`Tag\` of the \`Field\`, \`Tag\` is a abstract struct field tag

Signature:

go
func (f *Field) Tag() *Tag
func (f *Field) Tag() *Tag

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+
+    // Output:
+    // name
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+
+    // Output:
+    // name
+}

Value

Get the \`Field\` underlying value

Signature:

go
func (f *Field) Value() any
func (f *Field) Value() any

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+
+    fmt.Println(n.Value())
+
+    // Output:
+    // 111
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string \`json:"name,omitempty"\`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+
+    fmt.Println(n.Value())
+
+    // Output:
+    // 111
+}

IsEmbedded

Check if the field is an embedded field

Signature:

go
func (f *Field) IsEmbedded() bool
func (f *Field) IsEmbedded() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+
+    // Output:
+    // true
+    // false
+}

IsExported

Check if the field is exported

Signature:

go
func (f *Field) IsExported() bool
func (f *Field) IsExported() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+
+    // Output:
+    // true
+    // false
+}

IsZero

Check if the field is zero value

Signature:

go
func (f *Field) IsZero() bool
func (f *Field) IsZero() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+
+    // Output:
+    // true
+    // false
+}

Name

Get the field name

Signature:

go
func (f *Field) Name() string
func (f *Field) Name() string

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+
+    // Output:
+    // Name
+    // Age
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+
+    // Output:
+    // Name
+    // Age
+}

Kind

Get the field's kind

Signature:

go
func (f *Field) Kind() reflect.Kind
func (f *Field) Kind() reflect.Kind

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+
+    // Output:
+    // string
+    // int
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+
+    // Output:
+    // string
+    // int
+}

IsSlice

Check if the field is a slice

Signature:

go
func (f *Field) IsSlice() bool
func (f *Field) IsSlice() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+
+    fmt.Println(a.IsSlice())
+
+    // Output:
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+
+    fmt.Println(a.IsSlice())
+
+    // Output:
+    // true
+}
`,81),m=[t,c,r,y,F,i,A,u,E,d,g];function B(h,f,q,v,C,b){return p(),o("div",null,m)}const N=l(e,[["render",B]]);export{k as __pageData,N as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.lean.js b/docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.lean.js new file mode 100644 index 0000000..2ee3c5d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_struct.md.ebe3b9e2.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Structs","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/struct.md","filePath":"en/api/packages/struct.md"}'),e={name:"en/api/packages/struct.md"},t=s("h1",{id:"Structs",tabindex:"-1"},[a("Structs "),s("a",{class:"header-anchor",href:"#Structs","aria-label":'Permalink to "Structs"'},"​")],-1),c=s("p",null,"Struct is abstract struct for provide several high level functions",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/struct.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/struct.go")])]),s("li",null,[s("p",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/structs/field.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/structs/field.go")])])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",81),m=[t,c,r,y,F,i,A,u,E,d,g];function B(h,f,q,v,C,b){return p(),o("div",null,m)}const N=l(e,[["render",B]]);export{k as __pageData,N as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.js b/docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.js new file mode 100644 index 0000000..7dd3f3f --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.js @@ -0,0 +1,1541 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Strutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/strutil.md","filePath":"en/api/packages/strutil.md"}'),t={name:"en/api/packages/strutil.md"},e=s("h1",{id:"Strutil",tabindex:"-1"},[a("Strutil "),s("a",{class:"header-anchor",href:"#Strutil","aria-label":'Permalink to "Strutil"'},"​")],-1),c=s("p",null,"Package strutil contains some functions to manipulate string.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/strutil/string.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/strutil/string.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

',2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

Documentation

After

Returns the substring after the first occurrence of a specified string in the source string.

Signature:

go
func After(s, char string) string
func After(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}

AfterLast

Returns the substring after the last occurrence of a specified string in the source string.

Signature:

go
func AfterLast(s, char string) string
func AfterLast(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}

Before

Returns the substring of the source string up to the first occurrence of the specified string.

Signature:

go
func Before(s, char string) string
func Before(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}

BeforeLast

Returns the substring of the source string up to the last occurrence of the specified string.

Signature:

go
func BeforeLast(s, char string) string
func BeforeLast(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}

CamelCase

Coverts string to camelCase string, non letters and numbers will be ignored.

Signature:

go
func CamelCase(s string) string
func CamelCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}

KebabCase

KebabCase covert string to kebab-case, non letters and numbers will be ignored.

Signature:

go
func KebabCase(s string) string
func KebabCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}

UpperKebabCase

UpperKebabCase covert string to upper KEBAB-CASE, non letters and numbers will be ignored.

Signature:

go
func UpperKebabCase(s string) string
func UpperKebabCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}

Capitalize

Convert the first character of a string to upper case.

Signature:

go
func Capitalize(s string) string
func Capitalize(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}

IsString

Check if the value's data type is string.

Signature:

go
func IsString(v any) bool
func IsString(v any) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LowerFirst

Convert the first character of string to lower case.

Signature:

go
func LowerFirst(s string) string
func LowerFirst(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}

UpperFirst

Convert the first character of string to upper case.

Signature:

go
func UpperFirst(s string) string
func UpperFirst(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}

Pad

Pads string on the left and right side if it's shorter than size.

Signature:

go
func Pad(source string, size int, padStr string) string
func Pad(source string, size int, padStr string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}

PadEnd

Pads string on the right side if it's shorter than size.

Signature:

go
func PadEnd(source string, size int, padStr string) string
func PadEnd(source string, size int, padStr string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}

PadStart

Pads string on the left side if it's shorter than size.

Signature:

go
func PadStart(source string, size int, padStr string) string
func PadStart(source string, size int, padStr string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}

Reverse

Return string whose char order is reversed to the given string.

Signature:

go
func Reverse(s string) string
func Reverse(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}

SnakeCase

Coverts string to snake_case, non letters and numbers will be ignored.

Signature:

go
func SnakeCase(s string) string
func SnakeCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}

UpperSnakeCase

Coverts string to upper KEBAB-CASE, non letters and numbers will be ignored.

Signature:

go
func UpperSnakeCase(s string) string
func UpperSnakeCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}

SplitEx

Split a given string whether the result contains empty string.

Signature:

go
func SplitEx(s, sep string, removeEmptyString bool) []string
func SplitEx(s, sep string, removeEmptyString bool) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}

Substring

Returns a substring of the specified length starting at the specified offset position.

Signature:

go
func Substring(s string, offset int, length uint) string
func Substring(s string, offset int, length uint) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}

Wrap

Wrap a string with given string.

Signature:

go
func Wrap(str string, wrapWith string) string
func Wrap(str string, wrapWith string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}

Unwrap

Unwrap a given string from anther string. will change source string.

Signature:

go
func Unwrap(str string, wrapToken string) string
func Unwrap(str string, wrapToken string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}

SplitWords

Splits a string into words, word only contains alphabetic characters.

Signature:

go
func SplitWords(s string) []string
func SplitWords(s string) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}

WordCount

Return the number of meaningful word, word only contains alphabetic characters.

Signature:

go
func WordCount(s string) int
func WordCount(s string) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}

RemoveNonPrintable

Remove non-printable characters from a string.

Signature:

go
func RemoveNonPrintable(str string) string
func RemoveNonPrintable(str string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\\u00a0 \\u200bworld\\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\\u00a0 \\u200bworld\\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}

StringToBytes

Converts a string to byte slice without a memory allocation.

Signature:

go
func StringToBytes(str string) (b []byte)
func StringToBytes(str string) (b []byte)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [97 98 99]
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [97 98 99]
+    // true
+}

BytesToString

Converts a byte slice to string without a memory allocation.

Signature:

go
func BytesToString(bytes []byte) string
func BytesToString(bytes []byte) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

IsBlank

Checks if a string is whitespace or empty.

Signature:

go
func IsBlank(str string) bool
func IsBlank(str string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\\t\\v\\f\\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\\t\\v\\f\\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HasPrefixAny

Checks if a string starts with any of an array of specified strings.

Signature:

go
func HasPrefixAny(str string, prefixes []string) bool
func HasPrefixAny(str string, prefixes []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasSuffixAny

Checks if a string ends with any of an array of specified strings.

Signature:

go
func HasSuffixAny(str string, suffixes []string) bool
func HasSuffixAny(str string, suffixes []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IndexOffset

Returns the index of the first instance of substr in string after offsetting the string by \`idxFrom\`, or -1 if substr is not present in string.

Signature:

go
func IndexOffset(str string, substr string, idxFrom int) int
func IndexOffset(str string, substr string, idxFrom int) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}

ReplaceWithMap

Returns a copy of \`str\`, which is replaced by a map in unordered way, case-sensitively.

Signature:

go
func ReplaceWithMap(str string, replaces map[string]string) string
func ReplaceWithMap(str string, replaces map[string]string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}

Trim

Strips whitespace (or other characters) from the beginning and end of a string. The optional parameter \`characterMask\` specifies the additional stripped characters.

Signature:

go
func Trim(str string, characterMask ...string) string
func Trim(str string, characterMask ...string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}

SplitAndTrim

Splits string \`str\` by a string \`delimiter\` to a slice, and calls Trim to every element of slice. It ignores the elements which are empty after Trim.

Signature:

go
func SplitAndTrim(str, delimiter string, characterMask ...string) []string
func SplitAndTrim(str, delimiter string, characterMask ...string) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}

HideString

Hide some chars in source string with param \`replaceChar\`. replace range is origin[start : end]. [start, end).

Signature:

go
func HideString(origin string, start, end int, replaceChar string) string
func HideString(origin string, start, end int, replaceChar string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}

ContainsAll

Return true if target string contains all the substrings.

Signature:

go
func ContainsAll(str string, substrs []string) bool
func ContainsAll(str string, substrs []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainsAny

Return true if target string contains any one of the substrings.

Signature:

go
func ContainsAny(str string, substrs []string) bool
func ContainsAny(str string, substrs []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

RemoveWhiteSpace

Remove whitespace characters from a string. when set repalceAll is true removes all whitespace, false only replaces consecutive whitespace characters with one space.

Signature:

go
func RemoveWhiteSpace(str string, repalceAll bool) string
func RemoveWhiteSpace(str string, repalceAll bool) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \\r\\n    \\t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \\r\\n    \\t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}
`,223),f=[e,c,r,y,F,i,u,E,A,B,d];function q(g,h,b,D,m,v){return p(),o("div",null,f)}const P=l(t,[["render",q]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.lean.js b/docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.lean.js new file mode 100644 index 0000000..fe4c17d --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_strutil.md.2bfcfdc2.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Strutil","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/strutil.md","filePath":"en/api/packages/strutil.md"}'),t={name:"en/api/packages/strutil.md"},e=s("h1",{id:"Strutil",tabindex:"-1"},[a("Strutil "),s("a",{class:"header-anchor",href:"#Strutil","aria-label":'Permalink to "Strutil"'},"​")],-1),c=s("p",null,"Package strutil contains some functions to manipulate string.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/strutil/string.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/strutil/string.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",223),f=[e,c,r,y,F,i,u,E,A,B,d];function q(g,h,b,D,m,v){return p(),o("div",null,f)}const P=l(t,[["render",q]]);export{k as __pageData,P as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.js b/docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.js new file mode 100644 index 0000000..c9b8ed4 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.js @@ -0,0 +1,257 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"System","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/system.md","filePath":"en/api/packages/system.md"}'),e={name:"en/api/packages/system.md"},t=s("h1",{id:"System",tabindex:"-1"},[a("System "),s("a",{class:"header-anchor",href:"#System","aria-label":'Permalink to "System"'},"​")],-1),c=s("p",null,"Package system contains some functions about os, runtime, shell command.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/system/os.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/system/os.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/system"
+)
import (
+    "github.com/duke-git/lancet/v2/system"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n('

Index

',2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n(`

Documentation

IsWindows

Check if current os is windows.

Signature:

go
func IsWindows() bool
func IsWindows() bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}

IsLinux

Check if current os is linux.

Signature:

go
func IsLinux() bool
func IsLinux() bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}

IsMac

Check if current os is macos.

Signature:

go
func IsMac() bool
func IsMac() bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}

GetOsEnv

Gets the value of the environment variable named by the key.

Signature:

go
func GetOsEnv(key string) string
func GetOsEnv(key string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

SetOsEnv

Sets the value of the environment variable named by the key.

Signature:

go
func SetOsEnv(key, value string) error
func SetOsEnv(key, value string) error

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

RemoveOsEnv

Remove a single environment variable.

Signature:

go
func RemoveOsEnv(key string) error
func RemoveOsEnv(key string) error

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}

CompareOsEnv

Get env named by the key and compare it with comparedEnv.

Signature:

go
func CompareOsEnv(key, comparedEnv string) bool
func CompareOsEnv(key, comparedEnv string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

ExecCommand

Execute shell command, return the stdout and stderr string of command, and error if error occur. param \`command\` is a complete command string, like, ls -a (linux), dir(windows), ping 127.0.0.1. In linux, use /bin/bash -c to execute command, In windows, use powershell.exe to execute command.

Signature:

go
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}

GetOsBits

Get current os bits, 32bit or 64bit. return 32 or 64

Signature:

go
func GetOsBits() int
func GetOsBits() int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}
`,55),g=[t,c,r,y,i,F,u,E,d,m,A];function h(v,f,q,B,b,D){return p(),o("div",null,g)}const O=l(e,[["render",h]]);export{C as __pageData,O as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.lean.js b/docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.lean.js new file mode 100644 index 0000000..8e81cec --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_system.md.b89ed647.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"System","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/system.md","filePath":"en/api/packages/system.md"}'),e={name:"en/api/packages/system.md"},t=s("h1",{id:"System",tabindex:"-1"},[a("System "),s("a",{class:"header-anchor",href:"#System","aria-label":'Permalink to "System"'},"​")],-1),c=s("p",null,"Package system contains some functions about os, runtime, shell command.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),i=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/system/os.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/system/os.go")])],-1),F=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",2),m=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",55),g=[t,c,r,y,i,F,u,E,d,m,A];function h(v,f,q,B,b,D){return p(),o("div",null,g)}const O=l(e,[["render",h]]);export{C as __pageData,O as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.js b/docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.js new file mode 100644 index 0000000..f28b458 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.js @@ -0,0 +1,1111 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Tuple","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/tuple.md","filePath":"en/api/packages/tuple.md"}'),e={name:"en/api/packages/tuple.md"},t=s("h1",{id:"Tuple",tabindex:"-1"},[a("Tuple "),s("a",{class:"header-anchor",href:"#Tuple","aria-label":'Permalink to "Tuple"'},"​")],-1),c=s("p",null,"tuple package implements tuple data type and some operations on it.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
`,2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n('

Index

',2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n(`

Documentation

Tuple2

Tuple2 represents a 2 elemnets tuple.

Signature:

go
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}

Tuple2_Unbox

Tuple2 Unbox returns values in tuple.

Signature:

go
func (t Tuple2[A, B]) Unbox() (A, B)
func (t Tuple2[A, B]) Unbox() (A, B)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}

Zip2

Create a slice of Tuple2, whose elements are correspond to the given slice elements.

Signature:

go
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}

Unzip2

Create a group of slice from a slice of Tuple2.

Signature:

go
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}

Tuple3

Tuple3 represents a 3 elemnets tuple.

Signature:

go
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}

Tuple3_Unbox

Tuple3 Unbox returns values in tuple.

Signature:

go
func (t Tuple3[A, B, C]) Unbox() (A, B, C)
func (t Tuple3[A, B, C]) Unbox() (A, B, C)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}

Zip3

Create a slice of Tuple3, whose elements are correspond to the given slice elements.

Signature:

go
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}

Unzip3

Create a group of slice from a slice of Tuple3.

Signature:

go
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}

Tuple4

Tuple4 represents a 4 elemnets tuple.

Signature:

go
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}

Tuple4_Unbox

Tuple4 Unbox returns values in tuple.

Signature:

go
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}

Zip4

Create a slice of Tuple4, whose elements are correspond to the given slice elements.

Signature:

go
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}

Unzip4

Create a group of slice from a slice of Tuple4.

Signature:

go
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}

Tuple5

Tuple5 represents a 5 elemnets tuple.

Signature:

go
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}

Tuple5_Unbox

Tuple5 Unbox returns values in tuple.

Signature:

go
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}

Zip5

Create a slice of Tuple5, whose elements are correspond to the given slice elements.

Signature:

go
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}

Unzip5

Create a group of slice from a slice of Tuple5.

Signature:

go
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}

Tuple6

Tuple6 represents a 6 elemnets tuple.

Signature:

go
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Tuple6_Unbox

Tuple6 Unbox returns values in tuple.

Signature:

go
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Zip6

Create a slice of Tuple6, whose elements are correspond to the given slice elements.

Signature:

go
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}

Unzip6

Create a group of slice from a slice of Tuple6.

Signature:

go
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}

Tuple7

Tuple7 represents a 7 elemnets tuple.

Signature:

go
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Tuple7_Unbox

Tuple7 Unbox returns values in tuple.

Signature:

go
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Zip7

Create a slice of Tuple7, whose elements are correspond to the given slice elements.

Signature:

go
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}

Unzip7

Create a group of slice from a slice of Tuple7.

Signature:

go
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}

Tuple8

Tuple8 represents a 8 elemnets tuple.

Signature:

go
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Tuple8_Unbox

Tuple8 Unbox returns values in tuple.

Signature:

go
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Zip8

Create a slice of Tuple8, whose elements are correspond to the given slice elements.

Signature:

go
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}

Unzip8

Create a group of slice from a slice of Tuple8.

Signature:

go
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}

Tuple9

Tuple9 represents a 9 elemnets tuple.

Signature:

go
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Tuple9_Unbox

Tuple9 Unbox returns values in tuple.

Signature:

go
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Zip9

Create a slice of Tuple9, whose elements are correspond to the given slice elements.

Signature:

go
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}

Unzip9

Create a group of slice from a slice of Tuple9.

Signature:

go
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}

Tuple10

Tuple10 represents a 10 elemnets tuple.

Signature:

go
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Tuple10_Unbox

Tuple10 Unbox returns values in tuple.

Signature:

go
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Zip10

Create a slice of Tuple10, whose elements are correspond to the given slice elements.

Signature:

go
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}

Unzip10

Create a group of slice from a slice of Tuple10.

Signature:

go
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}
`,217),v=[t,c,r,y,F,i,E,A,u,B,d];function g(f,h,q,b,D,m){return p(),o("div",null,v)}const T=l(e,[["render",g]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.lean.js b/docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.lean.js new file mode 100644 index 0000000..ba31ca6 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_tuple.md.ce828c9e.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const k=JSON.parse('{"title":"Tuple","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/tuple.md","filePath":"en/api/packages/tuple.md"}'),e={name:"en/api/packages/tuple.md"},t=s("h1",{id:"Tuple",tabindex:"-1"},[a("Tuple "),s("a",{class:"header-anchor",href:"#Tuple","aria-label":'Permalink to "Tuple"'},"​")],-1),c=s("p",null,"tuple package implements tuple data type and some operations on it.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/tuple/tuple.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),A=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),B=s("div",{STYLE:"page-break-after: always;"},null,-1),d=n("",217),v=[t,c,r,y,F,i,E,A,u,B,d];function g(f,h,q,b,D,m){return p(),o("div",null,v)}const T=l(e,[["render",g]]);export{k as __pageData,T as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.js b/docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.js new file mode 100644 index 0000000..1f358a8 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.js @@ -0,0 +1,1201 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Validator","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/validator.md","filePath":"en/api/packages/validator.md"}'),e={name:"en/api/packages/validator.md"},t=s("h1",{id:"Validator",tabindex:"-1"},[a("Validator "),s("a",{class:"header-anchor",href:"#Validator","aria-label":'Permalink to "Validator"'},"​")],-1),c=s("p",null,"Package validator contains some functions for data validation.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/validator/validator.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/validator/validator.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/validator"
+)
import (
+    "github.com/duke-git/lancet/v2/validator"
+)
`,2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation

ContainChinese

Check if the string contain mandarin chinese.

Signature:

go
func ContainChinese(s string) bool
func ContainChinese(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainLetter

Check if the string contain at least one letter.

Signature:

go
func ContainLetter(str string) bool
func ContainLetter(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

ContainLower

Check if the string contain at least one lower case letter a-z.

Signature:

go
func ContainLower(str string) bool
func ContainLower(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainUpper

Check if the string contain at least one upper case letter A-Z.

Signature:

go
func ContainUpper(str string) bool
func ContainUpper(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsAlpha

Check if the string contains only letters (a-zA-Z).

Signature:

go
func IsAlpha(s string) bool
func IsAlpha(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllUpper

Check if string is all upper case letters A-Z.

Signature:

go
func IsAllUpper(str string) bool
func IsAllUpper(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllLower

Check if string is all lower case letters a-z.

Signature:

go
func IsAllLower(str string) bool
func IsAllLower(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsASCII

Checks if string is all ASCII char.

Signature:

go
func IsASCII(str string) bool
func IsASCII(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}

IsBase64

Check if the string is base64 string.

Signature:

go
func IsBase64(base64 string) bool
func IsBase64(base64 string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseMobile

Check if the string is valid chinese mobile number.

Signature:

go
func IsChineseMobile(mobileNum string) bool
func IsChineseMobile(mobileNum string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseIdNum

Check if the string is chinese id number.

Signature:

go
func IsChineseIdNum(id string) bool
func IsChineseIdNum(id string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChinesePhone

Check if the string is chinese phone number.

Signature:

go
func IsChinesePhone(phone string) bool
func IsChinesePhone(phone string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsCreditCard

Check if the string is credit card.

Signature:

go
func IsCreditCard(creditCart string) bool
func IsCreditCard(creditCart string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsDns

Check if the string is valid dns.

Signature:

go
func IsDns(dns string) bool
func IsDns(dns string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsEmail

Check if the string is email address.

Signature:

go
func IsEmail(email string) bool
func IsEmail(email string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsEmptyString

Check if the string is empty or not.

Signature:

go
func IsEmptyString(s string) bool
func IsEmptyString(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsInt

Check if the value is integer(int, unit) or not.

Signature:

go
func IsInt(v any) bool
func IsInt(v any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsFloat

Check if the value is float(float32, float34) or not.

Signature:

go
func IsFloat(v any) bool
func IsFloat(v any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsNumber

Check if the value is number(integer, float) or not.

Signature:

go
func IsNumber(v any) bool
func IsNumber(v any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}

IsIntStr

Check if the string can convert to a integer.

Signature:

go
func IsIntStr(s string) bool
func IsIntStr(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsFloatStr

Check if the string can convert to a float.

Signature:

go
func IsFloatStr(s string) bool
func IsFloatStr(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsNumberStr

Check if the string can convert to a number.

Signature:

go
func IsNumberStr(s string) bool
func IsNumberStr(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsJSON

Check if the string is valid JSON.

Signature:

go
func IsJSON(str string) bool
func IsJSON(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\\"name\\": \\"test\\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\\"name\\": \\"test\\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsRegexMatch

Check if the string match the regexp.

Signature:

go
func IsRegexMatch(s, regex string) bool
func IsRegexMatch(s, regex string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", \`^[a-zA-Z]+$\`)
+    result2 := validator.IsRegexMatch("ab1", \`^[a-zA-Z]+$\`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", \`^[a-zA-Z]+$\`)
+    result2 := validator.IsRegexMatch("ab1", \`^[a-zA-Z]+$\`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIp

Check if the string is a ip address.

Signature:

go
func IsIp(ipstr string) bool
func IsIp(ipstr string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsIpV4

Check if the string is a ipv4 address.

Signature:

go
func IsIpV4(ipstr string) bool
func IsIpV4(ipstr string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIpV6

Check if the string is a ipv6 address.

Signature:

go
func IsIpV6(ipstr string) bool
func IsIpV6(ipstr string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsStrongPassword

Check if the string is strong password (alpha(lower+upper) + number + special chars(!@#$%^&*()?gt<)).

Signature:

go
func IsStrongPassword(password string, length int) bool
func IsStrongPassword(password string, length int) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsUrl

Check if the string is url.

Signature:

go
func IsUrl(str string) bool
func IsUrl(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsWeakPassword

Checks if the string is weak password(only letter or only number or letter + number) .

Signature:

go
func IsWeakPassword(password string, length int) bool
func IsWeakPassword(password string, length int) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsZeroValue

Checks if passed value is a zero value.

Signature:

go
func IsZeroValue(value any) bool
func IsZeroValue(value any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsGBK

Checks if data encoding is gbk(Chinese character internal code extension specification). this function is implemented by whether double bytes fall within the encoding range of gbk,while each byte of utf-8 encoding format falls within the encoding range of gbk.Therefore, utf8.valid() should be called first to check whether it is not utf-8 encoding and then call IsGBK() to check gbk encoding. like the example.

Signature:

go
func IsGBK(data []byte) bool
func IsGBK(data []byte) bool

Example:运行

go
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

IsPrintable

Checks if string is all printable chars.

Signature:

go
func IsPrintable(str string) bool
func IsPrintable(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}
`,200),h=[t,c,r,y,F,i,u,E,A,d,g];function B(v,f,q,m,b,I){return p(),o("div",null,h)}const k=l(e,[["render",B]]);export{C as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.lean.js b/docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.lean.js new file mode 100644 index 0000000..cca2abf --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_validator.md.fa34c2f2.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Validator","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/validator.md","filePath":"en/api/packages/validator.md"}'),e={name:"en/api/packages/validator.md"},t=s("h1",{id:"Validator",tabindex:"-1"},[a("Validator "),s("a",{class:"header-anchor",href:"#Validator","aria-label":'Permalink to "Validator"'},"​")],-1),c=s("p",null,"Package validator contains some functions for data validation.",-1),r=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/validator/validator.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/validator/validator.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),u=n("",2),E=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",200),h=[t,c,r,y,F,i,u,E,A,d,g];function B(v,f,q,m,b,I){return p(),o("div",null,h)}const k=l(e,[["render",B]]);export{C as __pageData,k as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.js b/docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.js new file mode 100644 index 0000000..a0b1270 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.js @@ -0,0 +1,481 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Xerror","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/xerror.md","filePath":"en/api/packages/xerror.md"}'),e={name:"en/api/packages/xerror.md"},r=s("h1",{id:"Xerror",tabindex:"-1"},[a("Xerror "),s("a",{class:"header-anchor",href:"#Xerror","aria-label":'Permalink to "Xerror"'},"​")],-1),t=s("p",null,"Package xerror implements helpers for errors.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n(`

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)
`,2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n('

Index

',2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n(`

Documentation

New

Creates a new XError pointer instance with message.

Signature:

go
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

Wrap

Creates a new XError pointer instance based on error object, and add message.

Signature:

go
func Wrap(cause error, message ...any) *XError
func Wrap(cause error, message ...any) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}

Unwrap

Returns unwrapped XError from err by errors.As. If no XError, returns nil.

Signature:

go
func Unwrap(err error) *XError
func Unwrap(err error) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}

XError_Wrap

Creates a new XError and copy message and id to new one.

Signature:

go
func (e *XError) Wrap(cause error) *XError
func (e *XError) Wrap(cause error) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}

XError_Unwrap

Compatible with github.com/pkg/errors.

Signature:

go
func (e *XError) Unwrap() error
func (e *XError) Unwrap() error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}

XError_With

Adds key and value related to the XError object.

Signature:

go
func (e *XError) With(key string, value any) *XError
func (e *XError) With(key string, value any) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_Id

Sets XError object id to check equality in XError.Is.

Signature:

go
func (e *XError) Id(id string) *XError
func (e *XError) Id(id string) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Is

Checks if target error is XError and Error.id of two errors are matched.

Signature:

go
func (e *XError) Is(target error) bool
func (e *XError) Is(target error) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Values

Returns map of key and value that is set by With. All wrapped xerror.XError key and values will be merged. Key and values of wrapped error is overwritten by upper xerror.XError.

Signature:

go
func (e *XError) Values() map[string]any
func (e *XError) Values() map[string]any

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_StackTrace

Returns stack trace which is compatible with pkg/errors.

Signature:

go
func (e *XError) StackTrace() StackTrace
func (e *XError) StackTrace() StackTrace

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}

XError_Info

Returns information of xerror, which can be printed.

Signature:

go
func (e *XError) Info() *errInfo
func (e *XError) Info() *errInfo

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}

XError_Error

Error implements standard error interface.

Signature:

go
func (e *XError) Error() string
func (e *XError) Error() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

TryUnwrap

TryUnwrap if err is nil then it returns a valid value. If err is not nil, Unwrap panics with err.

Signature:

go
func TryUnwrap[T any](val T, err error) T
func TryUnwrap[T any](val T, err error) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}
`,79),h=[r,t,c,y,F,i,E,u,A,d,g];function q(B,v,f,m,D,k){return p(),o("div",null,h)}const _=l(e,[["render",q]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.lean.js b/docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.lean.js new file mode 100644 index 0000000..f88aa3c --- /dev/null +++ b/docs/.vitepress/dist/assets/en_api_packages_xerror.md.5cac58cd.lean.js @@ -0,0 +1 @@ +import{_ as l,o as p,c as o,k as s,a,X as n}from"./chunks/framework.6e839c56.js";const C=JSON.parse('{"title":"Xerror","description":"","frontmatter":{},"headers":[],"relativePath":"en/api/packages/xerror.md","filePath":"en/api/packages/xerror.md"}'),e={name:"en/api/packages/xerror.md"},r=s("h1",{id:"Xerror",tabindex:"-1"},[a("Xerror "),s("a",{class:"header-anchor",href:"#Xerror","aria-label":'Permalink to "Xerror"'},"​")],-1),t=s("p",null,"Package xerror implements helpers for errors.",-1),c=s("div",{STYLE:"page-break-after: always;"},null,-1),y=s("h2",{id:"Source-",tabindex:"-1"},[a("Source: "),s("a",{class:"header-anchor",href:"#Source-","aria-label":'Permalink to "Source:"'},"​")],-1),F=s("ul",null,[s("li",null,[s("a",{href:"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go",target:"_blank",rel:"noreferrer"},"https://github.com/duke-git/lancet/blob/main/xerror/xerror.go")])],-1),i=s("div",{STYLE:"page-break-after: always;"},null,-1),E=n("",2),u=s("div",{STYLE:"page-break-after: always;"},null,-1),A=n("",2),d=s("div",{STYLE:"page-break-after: always;"},null,-1),g=n("",79),h=[r,t,c,y,F,i,E,u,A,d,g];function q(B,v,f,m,D,k){return p(),o("div",null,h)}const _=l(e,[["render",q]]);export{C as __pageData,_ as default}; diff --git a/docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.js b/docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.js new file mode 100644 index 0000000..f5496a3 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.js @@ -0,0 +1,23 @@ +import{_ as s,o as a,c as n,X as l}from"./chunks/framework.6e839c56.js";const g=JSON.parse('{"title":"Installation","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/getting_started.md","filePath":"en/guide/getting_started.md"}'),o={name:"en/guide/getting_started.md"},e=l(`

Installation

  1. For users who use go1.18 and above, it is recommended to install lancet v2.x.x. Cause in v2.x.x all functions was rewriten with generics of go1.18.
go
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
  1. For users who use version below go1.18, you should install v1.x.x. The latest of v1.x.x is v1.4.1.
go
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x

Usage

Lancet organizes the code into package structure, and you need to import the corresponding package name when use it. For example, if you use string-related functions, just import the strutil package like below:

go
import "github.com/duke-git/lancet/v2/strutil"
import "github.com/duke-git/lancet/v2/strutil"

Example

Here takes the string function Reverse (reverse order string) as an example, and the strutil package needs to be imported.

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}

More

Check out the APIs for details.

`,13),p=[e];function t(c,r,i,y,d,F){return a(),n("div",null,p)}const h=s(o,[["render",t]]);export{g as __pageData,h as default}; diff --git a/docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.lean.js b/docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.lean.js new file mode 100644 index 0000000..f137603 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_guide_getting_started.md.fbd5d30c.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,X as l}from"./chunks/framework.6e839c56.js";const g=JSON.parse('{"title":"Installation","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/getting_started.md","filePath":"en/guide/getting_started.md"}'),o={name:"en/guide/getting_started.md"},e=l("",13),p=[e];function t(c,r,i,y,d,F){return a(),n("div",null,p)}const h=s(o,[["render",t]]);export{g as __pageData,h as default}; diff --git a/docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.js b/docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.js new file mode 100644 index 0000000..51db1c6 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,X as n}from"./chunks/framework.6e839c56.js";const m=JSON.parse('{"title":"What is lancet?","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/introduction.md","filePath":"en/guide/introduction.md"}'),i={name:"en/guide/introduction.md"},o=n('

What is lancet?

Lancet is a powerful, efficient, and reusable util function library of go. Inspired by the java apache common package and lodash.js.

Why lancet?

Lancet makes Go dev easier by taking the hassle out of working with concurrency, net, math, slice, string, etc. Lancet's utility methods are great for:

  • Iterating slice and array.
  • Manipulating strings.
  • Work with net and http.
  • Other tools, eg. random, crypto, stream, retry, etc.
',5),r=[o];function c(l,s,d,h,u,_){return e(),a("div",null,r)}const f=t(i,[["render",c]]);export{m as __pageData,f as default}; diff --git a/docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.lean.js b/docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.lean.js new file mode 100644 index 0000000..00318b9 --- /dev/null +++ b/docs/.vitepress/dist/assets/en_guide_introduction.md.d2712e12.lean.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,X as n}from"./chunks/framework.6e839c56.js";const m=JSON.parse('{"title":"What is lancet?","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/introduction.md","filePath":"en/guide/introduction.md"}'),i={name:"en/guide/introduction.md"},o=n("",5),r=[o];function c(l,s,d,h,u,_){return e(),a("div",null,r)}const f=t(i,[["render",c]]);export{m as __pageData,f as default}; diff --git a/docs/.vitepress/dist/assets/en_index.md.3bc9892c.js b/docs/.vitepress/dist/assets/en_index.md.3bc9892c.js new file mode 100644 index 0000000..48e55bf --- /dev/null +++ b/docs/.vitepress/dist/assets/en_index.md.3bc9892c.js @@ -0,0 +1 @@ +import{_ as t,o as i,c as n,k as e}from"./chunks/framework.6e839c56.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Lancet","text":"A powerful util function library of Go","tagline":"Simple, powerful, and efficient.","actions":[{"theme":"brand","text":"Get Started","link":"/en/guide/getting_started"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/duke-git/lancet"}],"image":{"src":"/lancet_logo.png","alt":"lancet"}},"features":[{"title":"Powerful","icon":"💪","details":"support 600+ go util functions. inclueds string, slice, datetime, net, crypto, concurrency, etc."},{"title":"Modular by design","icon":"🏗","details":"Each module is designed as a package with no coupling between modules."},{"title":"Pure","icon":"💅","details":"Only depends on two kinds of libraries, go standard library and golang.org/x."},{"title":"Simple","icon":"👏","details":"Well structure, test for every exported function."}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md"}'),o={name:"en/index.md"},a=e("p",{style:{position:"relative",top:"-316px",left:"560px"}},[e("img",{style:{display:"inline-block","margin-right":"10px"},src:"https://img.shields.io/github/stars/duke-git/lancet?style=social",alt:""}),e("img",{style:{display:"inline-block"},src:"https://img.shields.io/github/forks/duke-git/lancet?style=social",alt:""})],-1),l=[a];function s(r,c,d,p,u,g){return i(),n("div",null,l)}const h=t(o,[["render",s]]);export{f as __pageData,h as default}; diff --git a/docs/.vitepress/dist/assets/en_index.md.3bc9892c.lean.js b/docs/.vitepress/dist/assets/en_index.md.3bc9892c.lean.js new file mode 100644 index 0000000..48e55bf --- /dev/null +++ b/docs/.vitepress/dist/assets/en_index.md.3bc9892c.lean.js @@ -0,0 +1 @@ +import{_ as t,o as i,c as n,k as e}from"./chunks/framework.6e839c56.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Lancet","text":"A powerful util function library of Go","tagline":"Simple, powerful, and efficient.","actions":[{"theme":"brand","text":"Get Started","link":"/en/guide/getting_started"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/duke-git/lancet"}],"image":{"src":"/lancet_logo.png","alt":"lancet"}},"features":[{"title":"Powerful","icon":"💪","details":"support 600+ go util functions. inclueds string, slice, datetime, net, crypto, concurrency, etc."},{"title":"Modular by design","icon":"🏗","details":"Each module is designed as a package with no coupling between modules."},{"title":"Pure","icon":"💅","details":"Only depends on two kinds of libraries, go standard library and golang.org/x."},{"title":"Simple","icon":"👏","details":"Well structure, test for every exported function."}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md"}'),o={name:"en/index.md"},a=e("p",{style:{position:"relative",top:"-316px",left:"560px"}},[e("img",{style:{display:"inline-block","margin-right":"10px"},src:"https://img.shields.io/github/stars/duke-git/lancet?style=social",alt:""}),e("img",{style:{display:"inline-block"},src:"https://img.shields.io/github/forks/duke-git/lancet?style=social",alt:""})],-1),l=[a];function s(r,c,d,p,u,g){return i(),n("div",null,l)}const h=t(o,[["render",s]]);export{f as __pageData,h as default}; diff --git a/docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.js b/docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.js new file mode 100644 index 0000000..3a3d63b --- /dev/null +++ b/docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.js @@ -0,0 +1,23 @@ +import{_ as s,o as a,c as n,X as l}from"./chunks/framework.6e839c56.js";const g=JSON.parse('{"title":"安装","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"guide/getting_started.md","filePath":"guide/getting_started.md"}'),o={name:"guide/getting_started.md"},p=l(`

安装

  1. 使用 go1.18 及以上版本的用户,建议安装 v2.x.x。 因为 v2.x.x 应用 go1.18 的泛型重写了大部分函数。
go
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
  1. 使用 go1.18 以下版本的用户,必须安装 v1.x.x。目前最新的 v1 版本是 v1.4.1。
go
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x

用法

lancet 是以包的结构组织代码的,使用时需要导入相应的包名。例如:如果使用字符串相关函数,需要导入 strutil 包:

go
import "github.com/duke-git/lancet/v2/strutil"
import "github.com/duke-git/lancet/v2/strutil"

示例

此处以字符串工具函数 Reverse(逆序字符串)为例,需要导入 strutil 包:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}

More

其他特性请参考API.

`,13),e=[p];function t(c,r,i,y,F,d){return a(),n("div",null,e)}const h=s(o,[["render",t]]);export{g as __pageData,h as default}; diff --git a/docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.lean.js b/docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.lean.js new file mode 100644 index 0000000..8294d5a --- /dev/null +++ b/docs/.vitepress/dist/assets/guide_getting_started.md.acfc7802.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,X as l}from"./chunks/framework.6e839c56.js";const g=JSON.parse('{"title":"安装","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"guide/getting_started.md","filePath":"guide/getting_started.md"}'),o={name:"guide/getting_started.md"},p=l("",13),e=[p];function t(c,r,i,y,F,d){return a(),n("div",null,e)}const h=s(o,[["render",t]]);export{g as __pageData,h as default}; diff --git a/docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.js b/docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.js new file mode 100644 index 0000000..6ce5d4e --- /dev/null +++ b/docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,X as n}from"./chunks/framework.6e839c56.js";const m=JSON.parse('{"title":"lancet是什么?","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md"}'),o={name:"guide/introduction.md"},c=n('

lancet是什么?

lancet(柳叶刀)是一个功能强大、全面、高效、可复用的go语言工具函数库。lancet受到了java apache common包和lodash.js的启发。

为什么选择lancet?

Lancet 消除了处理并发、网络、数学、切片、字符串等的麻烦,使 Go 开发变得更容易。 Lancet 的实用方法非常适合:

  • 迭代切片和数组。
  • 操作字符串。
  • 处理网络和http请求。
  • 其他工具,例如。 随机、加密、流、重试等。
',5),i=[c];function l(r,d,s,_,h,u){return e(),a("div",null,i)}const f=t(o,[["render",l]]);export{m as __pageData,f as default}; diff --git a/docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.lean.js b/docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.lean.js new file mode 100644 index 0000000..cec1673 --- /dev/null +++ b/docs/.vitepress/dist/assets/guide_introduction.md.c4fdb40e.lean.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,X as n}from"./chunks/framework.6e839c56.js";const m=JSON.parse('{"title":"lancet是什么?","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md"}'),o={name:"guide/introduction.md"},c=n("",5),i=[c];function l(r,d,s,_,h,u){return e(),a("div",null,i)}const f=t(o,[["render",l]]);export{m as __pageData,f as default}; diff --git a/docs/.vitepress/dist/assets/index.md.3fde7444.js b/docs/.vitepress/dist/assets/index.md.3fde7444.js new file mode 100644 index 0000000..883beda --- /dev/null +++ b/docs/.vitepress/dist/assets/index.md.3fde7444.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as a,k as t}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Lancet","text":"一个强大的Go语言工具函数库","tagline":"简洁, 强大, 高效","actions":[{"theme":"brand","text":"开始使用","link":"/guide/getting_started"},{"theme":"alt","text":"在GitHub中查看","link":"https://github.com/duke-git/lancet"}],"image":{"src":"/lancet_logo.png","alt":"lancet"}},"features":[{"title":"全面","icon":"💪","details":"功能全面,支持600+ go util函数。字符串、切片、日期时间、网络、加密、并发..."},{"title":"模块化设计","icon":"🏗","details":"每个模块设计成一个包,模块之间无耦合。"},{"title":"纯净","icon":"💅","details":"只依赖go标准库和golang.org/x。"},{"title":"简洁","icon":"👏","details":"结构良好,测试每个导出的函数。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),l={name:"index.md"},s=t("p",{style:{position:"relative",display:"inline-block",top:"-316px",left:"32%"}},[t("img",{style:{display:"inline-block","margin-right":"10px"},src:"https://img.shields.io/github/stars/duke-git/lancet?style=social",alt:""}),t("img",{style:{display:"inline-block"},src:"https://img.shields.io/github/forks/duke-git/lancet?style=social",alt:""})],-1),n=[s];function o(c,d,r,g,p,m){return i(),a("div",null,n)}const u=e(l,[["render",o]]);export{_ as __pageData,u as default}; diff --git a/docs/.vitepress/dist/assets/index.md.3fde7444.lean.js b/docs/.vitepress/dist/assets/index.md.3fde7444.lean.js new file mode 100644 index 0000000..883beda --- /dev/null +++ b/docs/.vitepress/dist/assets/index.md.3fde7444.lean.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as a,k as t}from"./chunks/framework.6e839c56.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Lancet","text":"一个强大的Go语言工具函数库","tagline":"简洁, 强大, 高效","actions":[{"theme":"brand","text":"开始使用","link":"/guide/getting_started"},{"theme":"alt","text":"在GitHub中查看","link":"https://github.com/duke-git/lancet"}],"image":{"src":"/lancet_logo.png","alt":"lancet"}},"features":[{"title":"全面","icon":"💪","details":"功能全面,支持600+ go util函数。字符串、切片、日期时间、网络、加密、并发..."},{"title":"模块化设计","icon":"🏗","details":"每个模块设计成一个包,模块之间无耦合。"},{"title":"纯净","icon":"💅","details":"只依赖go标准库和golang.org/x。"},{"title":"简洁","icon":"👏","details":"结构良好,测试每个导出的函数。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),l={name:"index.md"},s=t("p",{style:{position:"relative",display:"inline-block",top:"-316px",left:"32%"}},[t("img",{style:{display:"inline-block","margin-right":"10px"},src:"https://img.shields.io/github/stars/duke-git/lancet?style=social",alt:""}),t("img",{style:{display:"inline-block"},src:"https://img.shields.io/github/forks/duke-git/lancet?style=social",alt:""})],-1),n=[s];function o(c,d,r,g,p,m){return i(),a("div",null,n)}const u=e(l,[["render",o]]);export{_ as __pageData,u as default}; diff --git a/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 b/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2a687296748f6b8bc8076cd11bde49cd27e4442b GIT binary patch literal 28332 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 HNCp4^t1hY; literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-italic-cyrillic.ea42a392.woff2 b/docs/.vitepress/dist/assets/inter-italic-cyrillic.ea42a392.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f64035158d7e4c01654e3f23dcd6e8299928a28c GIT binary patch literal 17824 zcmV(|K+(TGZYzoV0yihRy3;{L*Bm;yv3xXa1 z1Rw>42nQe=C3zL>7I?PUshK)MG!ta^L3b^d$O{#w!;WOi#caU z9epdi^~z}FXC1zMc;nw||B-~iJKZ7-`H(Kn3lKjZ5N5RqaHof~Lr#JsXW1jml58&> zQGi~|0cnL4zB|P8}0t5&U@c|JdMvNGlmzMw!d_sgsBSwh~ z<3uKERMdzOA;C{wc9u@*KWk~1ZrQFoOIvrA?XoRxnU;2`Lr2EaDbuDiOouv|*;F%- z#gKPJ>8fl=HUf*mFq&P*op#SRB5uMwrI5O=D|BV|t7*jYszMn6_y=vT5wbG)8zDBN(kmfH1b)al)=7_XtiK52#|ESncdAW0QK2HvRY`_;WiO>pz_-Xk zH!T)&YR`MAJa7J@pNA;Ve=XlUuY2Z4Y1bh`Bcza^p&9I}QLUiMj74g|4NyqjXq$hi zG1}j&v`P|}Bqr@5l@eV;qy>fq`v}SgHrfA#@*v!mV~$a+B6D&Jh-sRueXL+`%jr?vt30*Vq&Bs(79VL�!Z1%E;0yxE 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 literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-italic-latin-ext.bd8920cc.woff2 b/docs/.vitepress/dist/assets/inter-italic-latin-ext.bd8920cc.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9c1b9440ed419d4a71ba46b0db3951164f9e10df GIT binary patch literal 63552 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 literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-italic-latin.bd3b6f56.woff2 b/docs/.vitepress/dist/assets/inter-italic-latin.bd3b6f56.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..01fcf20724f915f68a974ef2fb85f86f3039b1d8 GIT binary patch literal 46048 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 literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-italic-vietnamese.6ce511fb.woff2 b/docs/.vitepress/dist/assets/inter-italic-vietnamese.6ce511fb.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e4f788ee02bb687bc1d5045483ff0d381e7654e0 GIT binary patch literal 8784 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 G0002QVTgqQ literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.e75737ce.woff2 b/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.e75737ce.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..28593ccb8a4d849a746f2b970678fe426cb136e8 GIT binary patch literal 26600 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 literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-roman-cyrillic.5f2c6c8c.woff2 b/docs/.vitepress/dist/assets/inter-roman-cyrillic.5f2c6c8c.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a20adc161f433a7c4e3d92306301b9228bcf9fb4 GIT binary patch literal 16780 zcmV(?K-a%_Pew8T0RR9106~lZ5dZ)H0DY_g06`%D0|eaw00000000000000000000 z0000Qf;JnTejI@~KS)+VQiTZyU_Vn-K~#Yn0D>GZYzoFWxhOFCMgcYgBm;yv3xXa1 z1Rw>38V4X7&~ydchCS#Gz^U?2)GLZ$;~)fx9VPq!mcYpnq1!@L^>;{*F0jecR$FUZ z6iO)D+m7xk=GG~2u%_f@f_0A}M3f5QA!I8ybSlL6sOEWg@rZ{%r-XO@6}qY6-9rwk z7S=XGl3Aagf2VfteNWPp^bim65V8@r49{4$60G9{g+&}2us@F-2(Lo2<%nmyfcXPAsEmOx;aaT-TYLA-g zgvewpb}BVR-ML%T9e1_+XSTRIu8ysxt~wvE#THu(7?>6s%t#g^w%AI*C@r+u&NSFS z!?YO379&Qd#efkr8h}DK?^}Y96T(bDG`ag0NywoDEJ20KvU^4sLVzaVq0LwZTv|C` z14y1JvebUtkK*Sjex9GxKPxfB0|W^&XiG7#GZLgqMUf&w#9A^4 zW+iy=)FGciT7s+#QV7M`LjC>~tH06w!e2Ax?^P|^{|Jdg?L}zEBROmDjx(eq_hRc1 zV(lsh-~$j6AyVM#mLRo3yaZC>4oHYziCX!nWJ|kyDQ1We#|#&!v`Om_QWZjOQ|_<7 zqO^Ag z|LxCM>gQohx?AS&cd2u!HPjGABuD`9BFByk0|5i0D0M-?X4I1etS^BES`g^zkt~9N z6bNJ~lV}D>P(cz{NrEb0f~~eA*hz!DjYD*TB-l$5xJZI}3Z&b9(r1+npvb#yl83Nl z2RnI^NS>jR=NyU`K_+AH?@ubOxrE?5zK?(a5HSEGfL9XQB!kX)2>@jCl1u;sGFnn> zj2C28OX#Vbi5JWktIZxrhYIpYTimo&U!G5i)?Q&yyoK6r2DWv;-31u6PL4a9i$7$)2F)vjovc;xwPK zkBm6fN#La>Q69B!-2$zOXy>J5lik8e zjvr!tgI)_mcek^UQnXpzqIehz`x2z^vtH%)_`!k3m2{<9hw^N84vueaRwueKS$3HK zVb)5CK*`%upy*Rb{-fw<4R%DoIZ>ilo*ZRa)D#}Tx)+(E&Z1l5xQ48UMoE>6C}TlH zzi*VptQV1_u#IZ4I$*gm@*C|gTAPwGntNMse;D@@02GLZEstc;mQ#|djM-gg+ZvER zs*0x>FbwEhF5>l%PyLvBaHKdMIm=jls)CofEk*ltCopWRZAp=ynu*F6+rJToloGhD zK$~G>vL-8w2Vjjj4qt;E)-no*zrxzjk;7tzvejc<`$O~munh-(`?5rjPvLp#Gx!03 zQlpT<(il36?a(U*@j5wBtwtSH=jYIE2f)zvu-AX$UG+dD!}anu^fqT3G1QWWK`>AT z`){B4jRWge!1`BdxMP#wk)vBR%!sa>ViO7q%y$S%s0cN|5n7^%Fc8IrK$H+Btz2Cs zD>zAuy<{a9xk14Gs1mf>8v&(?o;nb& z1P*8i74t2qRtys`mCQ;6We6lqC^V_2!A8isXLc@nFa|`jzFM)INiB@Dl`AG{3NIK? z5rn0wAPyMV4Uk-g<)=CFtJ&wbEPa48K2Y@a&VyXcm6N)nbSph9zY&D=zMFA)~&X^R$umKua zfIz9Wq(Y-07+_SAB+mqiCZPc*V^Z4i=ulZ5&?r!ZK(A1$vKm2g^UV7Jb~Zlndl9dG z{TXm*1!agOP7zcBSrT2not*}`8#^CBU{HJtb~S_-uBKN0VP%Tl>aaPAF-fwx4W+PT zC!&!JAZLJ(R%+2eCCg{s%XQqbgms+dUoGJ$TrEICQxG zMBnMk)3xV|Uaz`Pf60B_b<26H@|OEn%^mDc^*!5C*|O`A`&r3~`<3%u;cC&U>yzu7 zC1=eQ=W4&z|FGp<#frrx+Y}HGPyj^Xzv5jWpdbL|PebG^h-Z;G5}2DHbrY03fV~fd z`+#@|=!YQm5HOE{{y0RR0P;y7o(Abz2)+RLOF+K_p_d@^Ap}1I`70oPGKd}80|O`k zvX0Z}<`X2jxsD7fgkn)4F zs=LU?d=aObus|! z(Eb_0&jmb3w+NBZq5y*2@ssYZDSt(HCWd%C$xKd(XvIX0k&ID1=KIDy>8TE-BIPD( z_CQR^vqsx!#*H42Bi?w@T4REL_hSh^%I6vYB$N)oSV4~h;-2P&&Snj{J3XGHHnY1P z!)kVwqyjWG_X)t8NfYy)mlj(EU`PsfjNF5CwC&d3@(kPZEmIF9=~9&f@-qO`9~7&h zQMhF|zt-e8ee+2;*$yz;WQV=H%U4l>Mv@64=$4c=l$dKUW^X7h*&vo{D4X^M)4bA9 zzE;w_!@QYhj3&#RnI#+m-XN4>8N!}CKkQ%50E+FvCVM*iB5M2a8J`c%Iqv`f2QAuN zaIacLFhI~|&!&sYT-PiGvNU|lqD=TKD`V1VRVh8pqGIBP1e|c*!9E|h-#N5hj8j-m z?qg-+(C#FT%T-<6Al|6c##QM->NUMQy0C|rAL4sQVgVht+3q_oo3xulo%1wZz9(V7 zhb*u&+&};bCAPD}_K=6e&Cg$;KP{BC?g{T3ufjydYcL~iWrL=ww z?w*g2hcr<_9i%De_J+;$Qfr3MF%jYK3z18KVF%zLBg{$d5E$Z@g)0sk?J;F*&2o0$ z$J_b3BhpFugAWQxEPI50kn-`|*{|(zO2er~RJh3zmng58d0L6Cm7%JHf+g*001fN{ z3-$~`D@8K>bN>eLXqS%<0OV#-dhVPU)emx68yL4kx- zrDm#&DkbKFp$aIx?5tL?<(;+&Vte$~g{7==_hVK-NZ(+WjvK}=P-xy(y-(e#DSesh zgvL@m zlnl*)X!#s|9R64angj7!89*OraXhRl@tMbTw`)|l5AjPbA>Tkwp2E_AW`QZLv`t~) zuPkx$rjB(DUr=D$l0PgY3+>Vh&A%OQ90)BfZ-UqktPE)smD6*5a;nZw)cM(I$LHp| zVzj($J_}Yu?nec(4ni3eY^UedZ_!n{wx)z7ciGFXU-h{P&eqqItJx#hINP}-8R3?( z$L|Ii9_T@*;=(=cf*L7i*nyWG^DW4rC?m5sr;v2sL|W-eb>(&!UxjUp%7!YS`4sH5 z9se-U;oLr6;DZ^4KbhWh@y*{K*{D(!+J|1I zVZ?|v?oP|B*)?bG_VCDG-NjaY{w~+hcCM@GNqSVNqW@|T}FJT~!ZaixUWxJb{(L1$d2CAM7~mhwnq6&ZE}VtvAALfp={(9fMa zqZTYtpJQtsAGUgUG~$n?OB@@E_FWQVxlcoDElE2?!Wq-~#Oq(GWIy5dmNr!y3$)#3 z$E=P-aih9_1uG^+j!2JD;p3}A6XN&n z*!vI?6y%6ZtyunF<8_!dOq{{g(z@s+p)gcWHkx`mT*0*`>-s>B^s4j?Vsm2ZM*|qg zcm$9T%sa~vazY$p`60k-&gn9J9xhHfinHVZ?0pCK_46HUVN*+_9 z77^9n7&GJ;GH5o`6D=dt6P-3>Fl5NFF(#@*EnK3_ss8plqI9u|P`CB*Ih_s)K|)hW z)uHO&tF>7~h|fVB0fv6wLz1LdCQV~>Ht0ow1kk{_5S!z_FkYdIFYCRD&!|~#-aLPf zS?3-QS#$9?FZ-Pvm8a~^mC)_SIQHW~W@fp9ExmeB90g<3d@jW-jDds?KoCXa4whXa zNSQYcn+SqrH;7^&$piti>x73GgaxcNv(2ZAzR-AV=9foI9sV@%|7X)xz5VXpt2?cE zU&JVRZ8F|#G&9p{WGdzcABYmp=7VzG){Vi!hv(xO0%P*?1&5EQ&O3UN#}DzZBtNLU z-X(ju8AHxx_x_Q+0n!%>YoB;zlrQ__UXKfj&mQoMr2f_Xg|4wR-!%yP%Eu>cOZgkP zMj%}`LjC}V1w<)t3qgYf22y8~I*g3z&hl=lsu_rg>t)npIAi5mnid8PMGf|vD-R3Z~aoef`hldw!teQ! zsW1CCF;dGwTq6RdafQcOuWVW!@s13 zE>ZtZfB%E7{$9LzUS6&Tz5M^m-Wm=%G!6#?5->5@KIKK}-R93(IWX}E6ZQ{_ZY13c z2pcl}Q4lA9VT{YzS05c-X@ADZW7|#9N|Ks?_W3kRmh*e#FMt4yKE!5l4fJ(!QCt)L zb^g7*~>CJvyR$T$T7t_I%{@fX7%D^MaG~ zC=CaT*GmdT<`-I~+XIM=jRDfroh_Zv>1YVV`i})XKL{jwZBwVtCyN(YJGyh^8sqEc zwV>^zLiSIAepedEX5i|~3nq=R%h?m0AQ^5)Aa0_*wsNeJu?fkVORt-`mSkw0Im5pOZ>Q6pLJ=UEkDn3pq%U!As8g*NqaW#8&wy7?Q8 z7D^*}FG*uJ_$0^2z)J{bQeA&{nc-KbKgyPtW^6mgvS($1$J#z-S?7Uh8FNZQOTw7A zK&7noKlqM){%r*$`>htva9Vx#q(CA7hV}<$Y-*PNVZ9?}Zu)YDeu@4?AYHz7{9S$# zo%a|V*jpe+UkjL?iWG~dJ`0##+gh!@=B-y{Nb`F$i0L3aI;0qGAnKQxEo3=k+Vikh ziJgMWumgw|D{%Uz0VNSgrq({*m^j@e$JQt}pp%ze$Teo0&tl~`*-!AH_}$3p*6I*jbGEg1k zS?%Gy`!n*x1FjaPHP#XEZhh0Ghi3sH%+B`z1nKKjLEinDnO;32Kd$kT)w*>{wZ`4M z)!MclV*WmQ7)4L2ULW=fb>1`9MV-n*y+;GFe}0i^9YPD4$2jStf{8~F>DS?Y<;mB= zxuX3WziMHk@QMdA1vuF`k*Q~!bsuN#%o^;LDn%I0Gjkl%6KIhZ>$iU| zTZV7NKdy*ZRD3`_R-t;r>p$gw^z5@Ae_0(k-u#u+4QP)kXM@KCAQ9lDRUiNk5wk8}7v5*?m9_0>GnZ)b zHXOqh`8Hd>M|pon*q9(r&|1CbLE1S)5x0aw+D<9C&<)B~1+x;X%-X7;FgA9K$?0gS z)7Th0O|}|R3;rgCc14zyPbK9ZJCaaz@Dgc}RF z06O}VB*4oJcKzYlSQI*e9ILZq1U<1LIG(s{E|6kNOGwf#G!}wgjvUDFSh3HaIa_i4 zj~Ir%e1=i~VAUN9~-?l;whI>`rG3>&8GQ|<0?=~< z)P+(_zl`h{OONG9#6FsNPQRAO$V%H#de}xcc;sdP^Eew!7wL880=n>M&sf*G`}sGY zvfiu7nZ0pkA1>yuPM*-_8Ig11Lmu}dsj~Ko(L%lVjMH?zkI}-Dn|OB39}OSQ2iCUu zT!cIrx)$(9wo{J3WUw=H6tyAPo9mCv&}3_k59d?)BdOO*65ws)#m(7qG3A#pi&2WR z9GyN>R-Qe*9(^qh2w3X-3x2MP`P?&T6MZ6F8e~s+`iL92g?aLqK(7$J#lzBEn5+wjyJQypMRb0K*!G|hlhJ58~eWEefdUYAV|5i z&W*AO=3_2VGhs7*ne1oDNektL<%tVVldrNDlM_Ni{K7(V)g;o{nT2VI)oF27VP+Cr zRLEt9hsEt_P=nwLjMS?605o`%T$GBm_>Rh<(02}SCmT@N5>Oc*mOT(t?8#K2xY`v`svc_epS#Kb$SpGKe{!-zdGxpV z1tZ?cn}~-08tT2%LG^F@MF@Ze0KGCOKmgF#I3N$GN0Y5pOIz)n1ew}WV|S5kioyYm zv$aEg{3r-<3&;(ckd7$@NJXN1!DImw@wU4|)a^@$+I%~$Jmp;6$~2iOLj~w+*%Ssy zK1I0=FanxB{6B-_FiB$zwMelwN1_lwU2*no095^IK&Ml;&9G7-5<@>{S{B8t-J{f`tf$OU{=+D*a!LiM{-7GH`nMQBP9|58e^c9|HmbI&uA+WS zJw?4z{f7FeMzBVy#vP3h6dB5X%4N!ernY90<{PauS`W2Vw5zl`wfnWFb#!%3>iFus z)%m@08`VJFNZmoTp&q0jr}|Q(sZ44)l|${K4pK$FB4Fad6L{Ew;5Go{U~Gmx0LzJ{ z*ti`X-EqJIv=O_~r1M)!-N+%?DoG~NY$2o_C{l!JL_*RaFu7wRc8Vx6$9a@xmV49y z9%>M%0mSBjHtabhGz__LKU_0z55yN{&qtKPf5r1N*C*qJ<)Wm`)Q(=>ZI)!x)wk!q z2||HF!oFQ5$te&wU>bf9l3c{M6qy5Jeq#ZMS_4gM7gdtDHm_Rpfbh>- zhUIy5w*$OAhDGUt7rk+VVU9bu$Pls=cd9-RSDO2J=w#EiJuVI)EB7Y~mR0aQgH8I5Y#>!_I6m92^m{UA4HhaxN<*adsD5tu6= z5=u?O%c5n0SxVT)CK;Ea_SjX@-0fCKq}cORM?lW4fVkaWIO*t3nv2$zahx^UH``Ib$S&$Z3QBb*!#Qk?S3>H7r4d&#wvI$9LffbgyDcr^O}xMX{AA zuq1N7>U*eS^=gYXscv@gvi@$UA5`OrUK>YsJZ}E+O5S<_ma}H0d-L!nEZ^x^r@KAj zvx_uoy6o8WPeobJH#y{?UXZp>PYOypU9FrV=S~NxmR&`SqsZs0arU1Epr5hWh`}`` zi?NIS@jQIG#>6R3@abMJoHei??zUh8fz^JDc;K?c(DzSg7$)^_hqEiH{Un`C0&Cyy z(w&Yw+6D^EcVBwb(H6pM`{6jPvP)M065F>OyPcvqf5^!uYidQUh$I3TKO_*Z|V({}+&T+f2B%VBtXNSeU4aHVhqD9uBLG`<;y)Mt? zYCOlDQ(tXyDDG{XGilOvO8=%@4Pe9qhp2J*nNJKZj$hnTa|i!to~3d8OnfQLGUH!M zvdkap+l+_!uT^dP9X@{KZbyZ7;R9U73}fioj5trHLJ%RqIxPPKK@FokLZSzT9{i=l zU-pMDSciBn)0~5D%}*Tc1K3}+j>mNAOytbOhW$i<03nzPZUYyNT!xD;9Uq(D(R{q4 z@6?{MG6xS{QACv7Q_|==eWHEHelzwoF7LI;1a=ki+|;XXOFlCRi!%2|5%b2jP2CTd+zBfzwT*FdkA>H$+BOs>6f}9Q_A$6 zrzw9g9|G9eIYgY?EmU?N&28_9vAw-@TGmV!-Sq72zI6WFLp|N?JCS)Es|;N?@p+hI zqOX+*9C8(Y51w(H&pqwI1e#{sFr+wR`DTO|W9A{4lF}VS5zQRMA08|(U0t1dNv(m^!IQ>qz9KDfw*W`G5 z>!IB6Q_qMi;dXn9jNE#GkG^_R97>-RUUxJ#v-A+Ibi<3Gaq{^P6Cqw_%-Wa^Z@!E^iX^E|d!P4XU1A0G{G&q;fK?8VVM zGUh~P6d!JK6+_J`17`DIqDT6{v&@e~?-u;x$OCYwt@I09O5A1Dco(e-H&)42R=a*6 zclTmOvcI1YBV2Asb9b`kex9VfaED6=b+L}r8eF63dJb7qf@}EXa3>toEs2E9WkwwD zCYqWEq0-mrh7_eqi{+`OfH&0cX(7AerMGfjF%md#rmXNL(!Q)6nB!3@dMVBAS3JMU z0?$bBglDYgqEi0iR@pBfW2|afvnxcXUqHUeyb?8zPB|Ych*JDgQ6i0>}dwr1$)9qd99{?{F1&_$fE1(sddbQ zVviv?l<*>ioj5n+ohC%>fmDlv4l8VJ~a zLV?h*^T2uK;VWP+C4`cQIm4?ft?xA`51;WXIFbx^52_1{2Db0({0XY+t?K&w;Rtwe ztiUTLXf#YtE@Z3PbsDM)3k+9q5A^68Ge(O94-1o-x)AZ;rjkz!+mqFwB@<`ecae-d z0NI{hdV#(59g6h)Ix6VlvDPnBTBgzZD=ysQN* zZw*l&%ecSKN^z5LmK=H7N8lCQCRb3|Ordy-0#>bJy$})c=N;T9EspnnnzQARX@^IC z#F2?ZcDkVphOBKa*Vq_N-FzhRy`+pxOkA35#it$=bw)|9TU;xCiz>lnOnf+Sl|KxL55S%rNs95NXZ zd`jZ%ipjXsEBUmvgqOo4j94t}H9T`qR;YE{m`Uyy<9e%&{rm;b^I1Jlh~Y!OLTHfa zN_CLMC=+nBf+n4dgLT$I7sPt(NJ`@S>RG>YqIT6n(UHCbLWLtF0qsxR$Oh6kJ(`!~Njb0wXS`osNWTedIiRb^CG z)ELmr2?w^odi&RS{((^Xy~je1VwRchGH?a1*tIX?i zW>^<#`ARaaJ(%JGET&YFxA4nCWZ3w^zZC1uW{Jca_uBxkXg;(|l-fdk6hk3!~c%j1V^U`VPZd83cN93

KZ;k8ywA} z5k-SpDU(i8*gg^cv8>58r3@ub4OcK9&& znNhG_@GxqjVK3B&J%{D^HbH;deaX7Mp9Z32&^3D3f90mP=tF!fe9&>s;W0m~7?~A3 zux4`Z+_2B&&IRlyCT>ODZ`DXBg;?l>VcO7-v}Qn30>_G#L1tGZ60ycSW|dPuxCY~C z?DBUN4%cm!9{5w@zZ1rtvV6t&#meNl)pp}^FESGHmRz)CQKWID{e* zKl&Jl=Nczd7`2WWH@A)KYebMQNnqpHcr{eH5E61_)_fc#_p$9HX1N4TnjTJg-%wWH zoq3G1+6~rHwRoT!c1E-&qYs_3xi#$fI(6%GlvNp~MUmFlAu`Q+Aa;zrmahphCCG}z z0y;PaNCP>ruFkBkB;~qvNr}(}C+wTEUKCkk+*V_on5fG3DN%xiKzSk#3FGD1ut~Lt z^w~RQ$7Jwk)6g@$ICnR$+9l9SPld{*PkotiKI(+q(R~t;(U^h;-`ly|GZwjNukIR3 zZZy16I<`IW={p?5Hpoa7@rR}ZL~6p8EN_CWl6QP)wre$ha9MQ@W$csCm3+r!rzVG zx!T-w3Y0SrGE^(c^j=TXYZ)WoQ$z68k4d}y*m)BwN`KQ+4lR)8mFnO_%}^BGtC#DqKj zsiy#o)h5GqQwNXI^!m$bKqyP4dq^G;Stj9AG=8NZ;#|?4Tyy-|5bOl!Q)paeVE>yJ zuixF^`PGr0)8kVsCQkBj&{;$w2JFcfKBqLLz{vs59pkEXIBMN>!gZuKW`^>ZM5d!Z zdtW`z?~$Vc&(G7&wYjulSCXV=0YkS3u?AB8{)D=lld)i{-6PoSA09a9! zBKcMT7hg+|U}vzwa3?iA9NwU8YOxVlCk_EUe9%nIY1jhY6h-u&sQ zo~O3G8DUww5+pR$DZi4{K;GtL2NFf*uT7L}E3w=)T^1||9ej$q)%lDowBv7+?!~e_6 zcszLNdUHpKLJ3`bQG#^v^-~e2b!6fIi88l~FM9Lm6MHiTpLhCg92#G4-riia;MU$E zJu;x$YiIqmr)3SK38&$5IvWV2QiYy+r>tk?4QH!#k0}%H{}!~+`zY4HQ^z+>pj}d`krItpcjKIlWE>kp1b;D;pG(3ut>NJ1P>G>z#yH|x3;marSq~R zL;vRLF6aEH6Yn@{7TcvY7MpzJ-Io7Gux(NgfmvRle{GAcfM{0#20Dza>wY68gnB_y zkAgJ@M*v4GqN>XI4X)`m2=nD26)6BZiV(G@Ty$u}XRUVqTO3f; zl$&n1Z!3uto*%&!O~d~BSd8#e99SaHL-anSvoo>S@%fTGiR>b&6=bY_H6g4D_D(vTPN@jVlle&rLPv#80IFF* z6(&zPi4Ef`is03;Yl)>-TdbQu6{fX&xTKk{8((IxfidA)eHGUfHqattu}56Nj_t6&cOl)314;z(c99T~X^aD*%S* zT}i8&MW3qMgsm3k?@ylWz0=(o(r$nJHfzmqsBl=3E5FC z4}slCp-}ONBuqFbDJWZViA5Txy)XdJRI&3dZ^zI>%gR7!H{Ch#B|kKv1tW9IuOwfs za6?s=(L0Xzb!rQD!p#nX%lhLF!L)JY#CacD>5el$(S+Xh`_FjM8;{o%bTGXUAm?5J zp=8Oi>8P}3JtGAmtvOl#z7l{p#t{Vx!xCo=l~F=4&;)3r8iG@tBMd3+UAJpZQu%)g zArhsZ?&Q7|@WO#@wtt6>Y($LbGLGyvsHZ}`p>N4UqMH`F=tsCcmF5N|dR?DOePv{0 z`KYo(KCHjecqmmacJ0HU#`YWH{!v#xm%m* zFprO$_g|ZOr9KygX5Y?g$38Rr<;qK5O=6C-sIRVM-)RGSZONPRxml-iza!0QdpnTT zfM2X|3^FW`B2osEqRjcbQQCbzsWgdfpBD;g?$j1%Qo-e+orc`*Tj|W>Z*$k4d%T8Q zANqsEqL7)n4akzOv3qZ}ByFgsF|M@rKIf6Rg<2J(s)a@}+)k~ z+GLuI@rxP^LZx9umelc-Y?2q%{VJKCjkJP9M*PYb*gb(ZE0)QY7nPNA6s$4Q(GlPm zb%F-gFA3j(?}y-6HqwtT=0EIJ`2P0ZZLOW*cf^z#wpkY8hof$rK6igIs<<>eJ28?9 z-qO?9TZ@D}ATEX9#CmGYa7QRRJj1KW+!n9e8x_oiVdA+A%NDU}PPz5l+NLp%C`w0O zDvko#g-WKTBGbFwlg;I=drj1A41O;T@_=MnRML{GJHkn)Yr~}8-b;RT!(;QQ@QYkje2^bGk(Z{@u;X*SZSw6el@?CiO*z^T?N$*%{NIT z;UEinEsSGJOHMS9!>o^q%zL;qN@UB>YDmoQc*S8YQa zH`RVqR?x;E{-aRFmT2FiD?l0Wa>Des;w^AS)B;vBne6ug3N(qCu@!P2Xx|<2{ zUM#$xs*~qq7D3YW984#)(xQsV-wz&dkfb#npZXC|F!(&LySwe!``5&*_V54lR-Uk^ zZT-!MY_=$0J~jH`ArVf=TbRX69;!W(qZ5m95OYM#r)1uQ$9v8>eHk4No~1i|B5T4kL+W zv13|^R1ldoZGyFDfEvmz;Lh67dh zv-2Q;pa~9>tmyBok@aBWN4~2w`s~JM#;~;(8D#8j5PceKenmq>5?AsmT~^$Kv!5{36@B5>{_4lhVOmfC!f0 zHj*Pw29#JKbWF?v)I7{>xR902Ec%Latk!WInzIminxD);6Ob8@$OcDSC4;R(8-EIB z4RuI1z?7UKaYg+d5yKT+Er!pHND@NMNv=?YOAG!n`K@mg%XTn&`WixU#GqEKNlqPVPm1mtwo+zK@V zl)!WOhtx8RU-u&a!<`ad>{`3Z)*CivaJhQpKro@r#7Z_J%{d4=%t9<6n#1~B{b3n| zdV!&TI&CCmWfK~pSvQTR1B4=EH+OeMnES32!GCeJ%Gs~~oVtoZwb%o4-8sPv1QK}z z{AY^xOoE;BbHi8NjArzmxc{?dPcH(Piz#ARY;qViqR#Khd=Q}3nE`osNC3t7kz zj^#df!|oK!8e}*jZR(1_-3D7exio%B7NgSApN9W-eCcnyRHWvkNm#V^jTfR-*@$W& z+ei<-6Gqz*5w4&mCaIJbGq-zn6pEv%dvo67jcbvnJntZOkC9#BGmB8|IAXI6E|q$3 z+rWA*zZMX3;#308!i7C(_IleiulGTc%GOg;!%^xNze*KVl}ujh{_)pS#MR9zU9ei` zM2Oq2Af2;;7KdZIP>^cm?l&vpWxt3^(m5vy+(0vg^D4?VZ9~mAdCC<(HDoYLmzQLE zpEoOrPYT@KW2K)yVE%HxWb#&RuI)0f_xS+0>RETjKV01vwwMsB{ z&iv&IFI)Igd;Uc~29O~wn0;byhT(3e6qe$75`i;tS@O_}I!`d;!aFU0?}fo655vvH zu`jwkPLD0#`~JbKvJV#*dK@UBDZA%k+BM(5MjjvOWcvDo!9OD~>NCme_7$S~R@8S) z_k$)B8tKWkj*TykBG2eM9kJ-Ry{u+EZ8w*uHv9VHSSOs zK~9X{a{WUAsw;VKgKN*m?=cCoYP=6aa8}{)bWjur+x+Q7@WiAg>|XL|NwP~st>E@R z$|TlpYx?V~5cw+Tv+UJ`A91^fy(@4{_Ds?$XEGRcW;16-D>%Xe9SGKJN@8>~TfXhV z;+qp^wX7oXzqULse6t*Ml_8pXrn>7)GWoNs-^nx8x#_k$IgE$jr?M{rl}90+e!Y>6 zrj~tID_WI_6(nle5QztkplzgYRsH*zgihBs2#sbTYP>}l8gJ7TrgY+NCGQa9tjJh6 zX4K8|?%91X*ahz6jH}?f5PC* z70GZe#Jm#m#emauwCJ@3pHaxB^2Wxum|u-NYgW@zLnON*bzV;~)b~_V(Z+aag@egv zcpmN2_)zI|3Z1HS z7c(%Ww&mxHie+d{D-v1iQKHPsiTt&S0LP5?>nS&{<woNkCT~l)8Zv+lb zfB*#kGH^)+uN*`(ByF4|gv9QmgDBl$_UmZ^$q*v)9jbsiZnr#n=uf7K;nhnfZYh(` zwOSXZA7p6pU|P0T73E#=wO_%BFocO)TWvr@z#(lKC4?d~O8ukO38cx|aL+ z5YY_MP>*s!*^o4#en?VhW9}b+65N=o+z@AFH-)UENjn~AmjO#`=K1tMsvU#Omc6uf%G}Ks zSMpGQ4_z@blevfN1NEH<@1!k2reiTl3Lth`*}36rOF`92_pi4;x)r>Ant(7;+qS3# z;t-ao6r($~NucV}px&{}K%hPg4R>v=sL5A_OqYdhCnEzTdOuu49V$D(LT70&SOiy> zG%kUw=ODa9*NsaEuT3L{eq;tdo3cPm+FhL^WtssSAIY7a2v4nv7U@DqdanRcmZ7Er zWC5H0ZFF%v)WRDQO0-K*sx_mb)S;oJYRJR~;qI~I??v>Hd3dK30u&PaTsIj-=2+*1 zi_~kd0iUc?n**xP!tdH*)Rz<#s|1LppO)A(NHiykMA0n7f%S9sdB}*K<9|_Gkax3O zm^{CoZ+g45?L502drX3P@s$kV2Yy8EQ|1AYtjgY0i8o{rRtq33DRmR*5Oz}-aKg=C zm&jRVfi*tBInDl`i|gOt1}@+Eczrh=7(mTOD_53k@vWVy%7E z7M$Jj5)lC-AtH=nibx0}AOuFhNHA*Ry?^}3y@pc>JU>E`S@`eEeb$W#DWxwH;I6x8 zRAhSy&K>}lnf}$l14LB$4v4wkvxhyvws*sc6DKK6OlFj*Q&AcF85$ZYD%w(1R8&-) zm`h0+%()gBPRgZZOV`{Cm2xR56&WfmGFodbqog^N3Jnz%H{^+McfTZ{G|o#R5?|xi`GS-yUNeCYZql_zi;k+yUEO!rscdM#n{GH zMONwCymLS7e!{}>HEKQ(JM&e{nI)G%8FA|2>;C8e%bd>*A|2xRV^f>|ifN3uA!5v- zl#cz4Ffz!s%w2~<9{&C3L*N(z;Thv0Ody3IGYi7YUWPD-3c?~45SB4OsPqQPOpKF=PVxM=-@$r?2I2K_ECUChmCkZT708}K#zcor}O`hBR%i{4q#+%$yt-vbW!Km z`t^RpWzAJpNEuRxDmoS2CNaNFd|UBt&G#i?;>XgThK<<3jbwq#mKV{O4*T`o_%@z$R#mF||L#w?h=hxpT} zK0>@CgGMQ^No`6}OS`m&k~#y@KwJjnkVZqv?exh+n775jCJrb8r~t!185M&4IVfmc0iK zyj?#FXR=tnwsf6h-pcn%&pwh_s)e9)hOu=s4)oGyUK_@q*=k+m!Z{x%XGJX!8V+u< zy{oNVwZ`D6GuCK#*W@*;^_|TIgMOF29?))_*`Wg6!E^}VYsIGcF1|A7Py?W#qqzL7 zzx$lC0DK)r{NdG06%4QTR={2aKmr3`Hx>v87zn_6bb#$BPkf-xh~xmUR-xxiBs14i zYg9r2u+?b6-@Y{j`qrATZ=Kou)?1=)gRA>Cy0>pr@VuL&rWhO`sO${7-!{}y08ZjT z$==nCST$mU)YhA0u_a#hnm6rrT06gA{NaCzT~)#^BkG9NLK#O++4RO(&a95xS(kPD z)BRoll&-A*ox|S?{G@q3eTg1)AN=^Orw=TretelZo?^fMep~=#z~@CnL0ABG5@3&! zM&Wx_k{{@r<~^YnF%JEq{L)XOeLZ8gP^^=gFby`kig_Ty(T5XLT`s{bp zVYhtlwhB>x|MtY+*ipxfB~)yj=ZU=FMO}W??KeGscg-Jk z)>&@@y^S{6tj=2)Fkz8JzW>DBao7KveWJy2tqP4W#&gDtyD#C4c3*hptaGNBZU(8x zo)~b+Wmi1)rSk&5H_vzc4=bbwN^4Qw`P8~5;jv`LNKW1H;+!O|thmjiHT&>RQS3xE}m z0Mgf4cDtrDrw54lj;&R0BxZ@rNm(KH+X4%4VxMj7vUd3=Q_%3x?nV?$82s0x(;)TTZ(KfE_K^Ka&kf z&5B2W$fPXPLbJ3udqgc>**q@BNj$tAt-c*iPN=hsQ73Tl&b@LM_g)*qs~B}@md(HF z=UP}SI}|7vNypzR)zF^n;XOi}pUwE{HI6rR&$bHv#rJf-+bjq=2N%WW1Rs5Gnukc(BvbI?gQTaf?ZRm0irtPNOd0f_O5%w9A6u<{@rf zz&1f&&7EU{YZzl ztR?W>U`l{3w){G6*ZH3U1^PS&u)a^xqM2TtSLWn|IdIAEfA)7V_TdXW?$k2}elk>9 zFKsW~uwdEb{i}2he;t@tVEevR)s8ij6vMBS4lgdAPK@6^V%3|@HP6o~EF1Gu;n-ps zVHIlTF8FN0)a_-B&u%N%LJ|zRz8`LPhMk^R_}^X0ClmIcp{ElL7_k*FKyBE$2*huG zJ4n*fK@!V}`TYOO819Y23+KkN(5*g~nO>pRK1_zt}z8nq+NQb@~(2 zb=g~=b2c?y*)wh2o*i3z<(3(t(>-OCdO`KHeFwhBHk>|9TX*DgZhexo_QLMNN4~1r zplRNE+ymS)r!xjL==(E!g7J@ir=0)nss=waJO(sqfA0^U7~Ct?T!1VZ#1{32sWS>^ zX5EbRtjLwWbN;ix;K~(1RZ@uo2G&3yvZ?71go)k5se@2lPW6iT!I!%fT=R?&vpS>KgWllpmBoKLKRTKC zrdmga)@@&GcCj{mx^8=jtbWja;mMEwbXFGsKHhcLKa5(m`}QcFw(lHuQ;PucX$ZVJ z0OJD?e(CieeP8|c7+>h=TF2=c6t*NfsD+&oE z%L{YH(``40%CD=O{LbcW^Tw8U5c?&~xy%nvU96tGxagG^R7Ddf&sEPjljA&fuDX0l zQTYpViY8BhWB$Ub=x9+>Wfo~;%2EtOXvV-cO*!z}&=Gtxv5*Whp8Y)I9o8TQK#N&z5H~F2M#5b5v&C zz@*gaNyl%@o4Z)Ducszt>|>6K4~5#yeV$rT|86Vp%eiEK!O{`lYb9Gs8aX_9o(w`<+CTN^x6BXd?2L? zL<7AhrGWPDPe=&TgPsh*7at<#W{zgAlZPOeuRNd7055y$SH(bI2na_*Ov`uu#mQQ! zTtui%FcP*3?ma*8S&n2R7ku==br+?|`ky^wkqSWqVwa2~o_U;w21v~)(TW$51f*&- z`EAjTKKQ*jtpES!{+Wk&JT0M^D#eQkA_TL(n2}WBxzPxD;*0y57n-<$4<`>F@M0w= z@L~xs@IpN|@Zr|U59C%q&~1??J(bw%LWA0~M$#j3xK%=BIa!A+ChG94mgH3I4g#oW zn;a)`5?D>C80xUmvuJ?ZVr#!&N@I0)Lqa9%&n6>ms?>d`Y!@V1vnVZYdD+*Vc^DV z4+?dGLXf~Dm8?SjmJ5R0M`Gh8~t zHuiP#AAc_VuSc%gV?meOb{D# zOm*Q5YT{_X#ChNGpyHo{#5TKk>!cva;z1&UTppw&$ml>)56@dBFQH4t7aIznuehGt z!fi@vn~_0nvl`SktBu-b5^I~)q_&x~+Gdh!o000=Ho%PpiEXY{r)!AT=kMy{|Id43 zrs>HSAi;QHud@}$xdxBXq00hFw4V^TkmwTP+X2I^*MJDXQS=VN^MBXsG)=TVe^~N3UK9EfR zJ|fy6!At8^yVK-uJ=Qnh8W{Lyn-h8cM`WpP)&;%$V+slYTmm`)R&=I6?Z-&bMj+Wz z&lH_#@-7$v8AA?rNiBn#{Lr4wWiH#P4^TdIigkcke%Qc$1nV>+AL z1ia?oJ*USU5Qw0UfrJiT#=@{ehGq<(dr2>(L=bb3t)V^)NP`+2&}|aZb)W=XH(VGwbZTD-PCuehpD%zk7y%l zFVYCwBH9|->$Do0gZ4=#BXelx=*$V3<(aBXZDwWW07l1#U`5z3ST7dGNcu|p2zoJH zLRZk2($~}9px4nG=_lyt7%wtP8Lu#2V{BxY7&gWsMl0hi<1*t{Mjzu5lg8vQM>8if z38sp(q?VVs>yO> zHD`IUzRwD0#j*ynv$Kb17iUYd71{4(f0%tT`>X6=b~yXL?13C+&aj-ZIg@i{8@Z42Sa}6`#d*{6lzG~`gLxP7zR&wD?^fO;HpHk3*&BG6X%_e*7x$-*F&x?DX&f<$z686IUFO@Sm`7p)ml z0}8FQVj@V;OdvI7_0==Ng&T&Il7xt9c3=S=5TFB)En#U}HsKY=kvbSWA}(|Up_G!Q z+5n*$nn_6ZyD?jIWB0rZ5oonAXH5$4_KOmQT`rD{l%#aU(5ldl__(E-g*RDR_qf7n z7?z7+gjkZ>g%uH48~h%vF@-`s(P)p$^=YfWJ#gCXZj%eN6mFrXAoBHIAP#0lYCPzs z0pO>Vk{a(pza~BX714jMJ5nqTha-`{ z{!6o18F8+CnVaD#&FX7D+?rueA14sHm%wqBC%1ri?~O?HoxhGEP_mw$NLh&ySrOUD zB{@u&mI0}g8%0xD_|}GEP{t$%!;JeA#qMje8={z81B?_)q~bJ&5zBK0EQ#?t_(zi2 z21LuF*927S=85bl25#O1EQE6stf{;b{oSB=n>8{(9^&lkXb5FFk0$p#`TbA+c+YT+ zahh8(lGXz9>q0-ZKN;YR;KNIAc9@cTzOnAS8;MdVg}mzV9Sk|%~#9* z6vJ?T`1(jBgR52L31s6+VxkYD6l%;vKY}CI)J^G*+Y@M1XW!$st{wwmN=)?Z32%-i zgU4l|PU3+kpEzngIv6b0J?K2=~} z-wk|lGZ+fC&`Ftra1=sc6jA|HOeIDjrX`XGeie2!KTi##!^`;6hl?3 zV$OnL6(J-+K-D%Tv}`;fKe);@VNz*9O5<^yN@6-Ow0-u}8b4LwYk&q=+FAT^$2CpN zUkYXt<|OfRJ#g^oxvNzt5INT|ttmN=gG)*%3jQgjAWRD(VNMjzch)unC`7l0p(IW> zDq%nkJdC02Y)JHH?*T5*FF%V1(Aw>nEk%G@`ip$ETM-w^&{$Zt<%ME_2 zrI{#Z;8rQ43P~tJNttq!HU8lhWzrL|h}y-9T#V3BIyw%ne}o-kn0#F5>AMDs5xhK) z1hTMu6epKF42GwmN<`)6g?&OeOHHrPca*lZb2C=c=*p<$>WE>eW(mtanfdEA>4YFOzOe*UZ1rTTmEvr zR8;t&%P-=CLXlK21Dm9hh8;xrA|PZu6hbI8BCzMKMn+Sz-MwdN9>gJcl_eu57f#J< znou;E=BHr(JbXtg)A#RU{xsmhSP-5Z!czlF&l3m7bvQ7n^B*9M62@%s)F;2ZDkbii*i7-r)=Cmu9$Bs+&rkl-q zlxg)R(Wa(9-<*iml72g3e=_beU70slG-M|-EI5k>i;c~8$J?%yfh}vE zDxMd!*}=C6DJ01TE9~u1DZVq#ASu>(^84H0nbX#NK9S_i4eM#&KlkD&FJE;rj(sIi z3r%tmo`s@PHjkvjeQy2%k*wfOXR~3*Dk&BURZB5fEvG~;SP9svQ^Z6FpM{h}0;I-y zK{1&el_;0dy~k0$Qe$3E`c@4Njwc+e&ypamoIF@kNUJ8tQ6k>^$P}0z{`%cPKRkR4#4G5L$6-*p``~=1P%ZUDY;)H*)KtrFnAaXOXWTV3VUQ?P#uAXc^)@3FmK-!EstS9$WIm z$8+%JJYo^?dP_+|O7{-0n*4?dq-*7{2M4@fBFJ%)z_7?$GE&hXYX24J2nZUQHHRyW zK`sYnF_%GKcCO#YMlnCjf@TgDh&PtO_m`b>ks%xeg)f{)c?ois0C}_An<8erFJUOc zsp;2(Y#u~EO(XzuTnt|WoWn?e&!%csyWtpBgT z*(3J4y1g=TVU4Hbth%~zIK`h-GI_+Ez)^zSq9symu{QX7?d_%HL{0SCmKJHcgW1y3 z^7mb#dfBpNaJKdHbIzk=l9E(wF<(gWC-cQgD>EK%ZVtq)8BI{P!w04QvRz6dZWA~xTp4kY{_aj_ZnV$h%(;#E8kNdQCJ*~2v^ zuHF|X!3ZDD9wPRENgVqIQ9oRLK2}PL3NuDShtclZ42`mIAD{XnaCQ~GRf*vQyV_z` zZH8K2xQ=`?=D_+G95iw6CJaF_oDX3q(U-e2Io?2}V~as^o&Yc)Ygs+ZVoyJzK ztbNdwvh-k@IP6q5GMgh9IfAE4TR4m}-Bf{NeoZOZFt-&Gxt!<`+3NlO9=^e`I(f562tVFbPU_n&7DeM} zzFZ0+LS8{ftog}DksvSTUw5M4{t?7Xy7oYz>z=S;S23|w)6R%+UTDKV!}gn})=@CntBn#wXJp9Oc7T64LcCfo@q zt2&F1@@YT}8R5yD;=?Eu#JvdT66dNDiuur6sv$8o9KmeCHc`lKaYhTGUZdRdMwF}R zggW@(4XBKkmdl=ZWC_=D7{iWVYqyq? zn^f66S9t&0DH*v#ReHT?yW9fZ1uH0+ZKoF_J;!CFu4vi*fTC0?#gaolj1CeC3UKyA zY5g=ln`%MngK%6c0|#c?<-)|*D6m4}B2N4QYB|gmek91%W~~tMI%Uwz=X^L+y{4V^ z@RI*hEH7UQ&LQy(@7}k*Z|_gnRm$KPK3t9S97#N>9InyBHBO?%nZZ;rp!U<>9wpu? zgC?|Y=O>f@{hP4lq@JQhq7fL5v!y;oa2&Is1NWlQFJ)u}W?M%ORf5&5y@3A&bfd;7 zCf{`EuG*|8IvnI6EOd%=f4Neq!&D-d)cw2yU_xfv{cc&Nab<_RyC-RaNie4c$7U-j zaX9MgjyW0}DnDCjz9!l8;UhLe1@u$z)*~(cB)g;C)~J) zUwK5FBqTyMLG`PIB{!CWk2v?mEBL3BVDMiH<-aIe4Ndb}CboLnRO%CedBR8T@i3U4 z&$!akGv2N(nAtn#8p(p9oLF@v(mf zVDo~|>ta?g>VgnEw>-fVhkQfC($By-ewfnr5iwv&IS$dl@Gan0m;M(s>}Yt{^^ho^ z$XR0+5exZDV4)}_xJ2kScfNYD&jgswdeRsvN2oA873~Jfadl2}X|9_gVGoBv*%1sV zfobWGI#jqIgY??HZLO6d)t~(EL+J=o8B4iP>{6Z7C;QKn!eR*vk?f5!C4L9vAUKi> z*GU>39vC11-{Ux~LEMjn)X)!$XyrS6>R$UCSK`q7t56i3sItBk1a4{!Lex<4i3T7f zBP1{?O7bSkb&b|cDYWy-%09{B4ajI#v5Z&bqAV0=Q8;2HYa%3|gFPl+L&+QW|M~gL6KDDD zZ(UuNLP?AL>~GOtR@pLZt9O#;@MF!z2R> zd#PF3+11slo4ups20C<72{5XwDeIAAZ zvZ{raOu=6Fu||iE(b&XsH0G#kyo6vYM z-I@MBok~AUC(;kdsag~7`ZQBc62*L_*2$FKJ?28`v1{{5w&()H_N9dqsZ15pp`*sG z0m;=&txSzydOYs0Kw4eZ)##Mj&lUVAd$i|@q;nCQO~hkb&`dfE%Bx261_3?OLSyno zx#`Hc1{bGw+%9--_7rO+oVR_*r^sofDL<+L$%bwkJ5Ae4jTA$Q8+^uo9K63b8W$c! zK1bS-b1+wrb6kkix9T+a$+sX=5FD=3dafUEBugps>S~me)lbvOVtJ?SDk;q`uJ6)| zEa>g--hXJ-DD9u#?%NiMNWV+J+e&toHT=;z+`L5V&*E5n&;ZG)t{_rFk&6Qpa`jYK z6}uGC9pS+&EmuK|JnFe|L_w5x?cGjDmSM++D0oC24T^)0dA5&14^UqMz>-+(33G>& zH&51{18~=B6pGxf0UG%oswM0>LE076$})XjmGkJt)C>%gSIc_M(j} z1zRy^N`zuY5DFzVj2eW@&5jT4J3uPV<8K`Kxfh6i=|LK2rV5^Fpx4Bi4~Onm?mqy= z^i=M68t1x?isXDM-GX`Y5fk0q@S6)@4yx~;)FP)t?)43KR?{@!uB6rX%BR654 z%~+;rH2REW@ncVo`^6G|6vL)hY?px>CvLV^Ovg&f!D;Q68`nmqR=cqj%$S!6mPM0h zsnxSeUTc$mK2CBFAmhJ!1HZ&}&w>#N79;NgxgS5JxFB6%}pdx*ZD& zcm-x%`XRl|hrSGkI)D19^WxX-_fvh{fBw}S?D)Osk-)irkF7ht&5!m_dFBM+SAXrk>c9ANsEkyt^4{!fu15R#-h*owUj;$}YE)a>tJW@6FEbc894@zD^c1;# zhEUC|&v5wh`&ok&8>#z4WO7uC!2~Eym)BqlkX%VlRx6CbC?n^uThY{93^71jyQ_0L zH`ZP>Fe$>iawTFb-Q#)li(mZa#l@WGw0l&3Eu{BaD^f`c1y7|cL<%jERYXAVS6D!7 z30)=qDIm7QC#x!>PzZANkEfEUIUk@v)mcM^-|uz3{{2sW@=Z70_)>d8ovOUy-ELSV zFhLqUDVcjeubs2^QQM)fYlaXPuRBU}^H^IB-tD;(u``w+XQ4G3HGD-mK}aOi#)u8O z5&DC#e=bs;5lN3CoUkf$K`$on(RwkjSEi`k~L$-s;q`!bVM zw?d;)tCy53VOu;&U=F)0jvAKVk3=XcDI&uIpL-zAPLotxp`X+u zV=0)iZjq*pktnr>zEmnfXO}?u?T9jHAz)#V_4k)){pveZwZjs+*`GK}Rl1wmR-w>o zbY+`;k&SmvapXi<%Z`@{ch~iyE%j;~Fr(gr-7t7PAP7RCtc}x=)p?bXOXaB1`fpsv zu&^RcK}SFmx8yilJKKL;&W6? z$F|t^Tf2ghIunbx<|go4z8E-`S&6BVO%I}EAQs}mUJScFkMo^$eX4sMp<1K$_3PSS zkIYlXiBnbX!FvHPd`tZD7yfB7^*ym(Pd{XilmGmPLGcz0>;3 z#5g!=sfod$)2&;+M5Ej~B6P#G0s|n>KMy}~|9tr>$wO=y69D-BUoULeM@5H-CDv`v_uK^}!< zV^Erk$<#;?0T(IM)`aSU9wmD+O-+ogoroIKKx>~Q;}bP#m+|&P20IxTgh>UJiLuSz z1?H53WUq#rP6_fp35ucF1}!TA`C#nol=tgN2`DC9&?h_CGs9K=1gQG}8JGw_GQ`cS z0~k@WI_ZK4A}W%Zoqy?$1$Olew5fl|WPqM5=rIU^57|}HVb+}i2frBscp(9;U;rJc z2Xsjefu(Yf`oBmAf=wKnm9UTb!<_J$#Y)08lVWQKDgFj*&`1MP7=>io;W4rXb{tYL zp=Y*6%*;k4ok=mF3jTXOl6`&%V@gSLUMpbNQH4Q!r?*W>kH??px@4O!w_b}GBiAx+~DDSFdG>j0z1!L z84e7aPMOUN-cV_swRDVl+SdLTi84H@46M$~vMKPcR#~W2X|wgCwW@KZ)V6&_XET>? zZDh{hnrri4sJB98o||HknT$IyUpQ_OSz$s(Wa5w!Ss7ZZEoIi(To>|;H;#z8$);MH z`EW+X252$&f>94$XOnVO-byRR6~cnw=A73}ZJpa@qXlQ!_?A2}o9StPatorKc~!K^ O1{o}0SRMEP0000Yp_Hru literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-roman-greek.d5a6d92a.woff2 b/docs/.vitepress/dist/assets/inter-roman-greek.d5a6d92a.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f790e047daa346583880da2be470431e35aa6054 GIT binary patch literal 21776 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 De!(H( literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-roman-latin-ext.0030eebd.woff2 b/docs/.vitepress/dist/assets/inter-roman-latin-ext.0030eebd.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..715bd903b9b14d22a056f10e6d13b8d7e0acce57 GIT binary patch literal 59608 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

Skip to content
On this page

API Overview

Lancet (Lancet) is a powerful, comprehensive, efficient and reusable go language tool function library. Contains 25 packages, more than 600 utility functions. Functions cover string processing, slice processing, network, concurrency, encryption and decryption, file processing, time/date, stream processing, iterators, and more.

lancet function module

algorithm
compare
concurrency
condition
convertor
cryptor
datastructure
datetime
fileutil
formatter
function
iterator
maputil
mathutil
netutil
pointer
random
retry
slice
stream
structs
strutil
system
tuple
validator
xerror

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/algorithm.html b/docs/.vitepress/dist/en/api/packages/algorithm.html new file mode 100644 index 0000000..2362701 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/algorithm.html @@ -0,0 +1,836 @@ + + + + + + Algorithm | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Algorithm

Package algorithm implements some basic algorithm. eg. sort, search.

Source

Usage

go
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)
import (
+    "github.com/duke-git/lancet/v2/algorithm"
+)

Index

Documentation

BubbleSort

Sort slice with bubble sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)
func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.BubbleSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

InsertionSort

Sort slice with insertion sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type people struct {
+    Name string
+    Age  int
+}
+
+// PeopleAageComparator sort people slice by age field
+type peopleAgeComparator struct{}
+
+// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator
+func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int {
+    p1, _ := v1.(people)
+    p2, _ := v2.(people)
+
+    //ascending order
+    if p1.Age < p2.Age {
+        return -1
+    } else if p1.Age > p2.Age {
+        return 1
+    }
+
+    return 0
+}
+
+func main() {
+    peoples := []people{
+        {Name: "a", Age: 20},
+        {Name: "b", Age: 10},
+        {Name: "c", Age: 17},
+        {Name: "d", Age: 8},
+        {Name: "e", Age: 28},
+    }
+
+    comparator := &peopleAgeComparator{}
+
+    algorithm.InsertionSort(peoples, comparator)
+
+    fmt.Println(peoples)
+
+    // Output:
+    // [{d 8} {b 10} {c 17} {a 20} {e 28}]
+}

SelectionSort

Sort slice with selection sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)
func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.SelectionSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

ShellSort

Sort slice with shell sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)
func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.ShellSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

QuickSort

Sort slice with quick sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)
func QuickSort[T any](slice []T comparator lancetconstraints.Comparator)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.QuickSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

HeapSort

Sort slice with heap sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)
func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.HeapSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

MergeSort

Sort slice with merge sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)
func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator)

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    algorithm.MergeSort(numbers, comparator)
+
+    fmt.Println(numbers)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

CountSort

Sort slice with count sort algorithm. Param comparator should implements lancetconstraints.Comparator.

Signature:

go
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T
func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{2, 1, 5, 3, 6, 4}
+    comparator := &intComparator{}
+
+    sortedNums := algorithm.CountSort(numbers, comparator)
+
+    fmt.Println(sortedNums)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

BinarySearch

BinarySearch search for target within a sorted slice, recursive call itself. If a target is found, the index of the target is returned. Else the function return -1.

Signature:

go
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

BinaryIterativeSearch

BinaryIterativeSearch search for target within a sorted slice, recursive call itself. If a target is found, the index of the target is returned. Else the function return -1.

Signature:

go
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int
func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1 any, v2 any) int {
+    val1, _ := v1.(int)
+    val2, _ := v2.(int)
+
+    //ascending order
+    if val1 < val2 {
+        return -1
+    } else if val1 > val2 {
+        return 1
+    }
+    return 0
+}
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8}
+    comparator := &intComparator{}
+
+    result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator)
+    result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 4
+    // -1
+}

LinearSearch

return the index of target in slice base on equal function.If a target is found, the index of the target is returned. Else the function return -1.

Signature:

go
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int
func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    numbers := []int{3, 4, 5, 3, 2, 1}
+
+    equalFunc := func(a, b int) bool {
+        return a == b
+    }
+
+    result1 := algorithm.LinearSearch(numbers, 3, equalFunc)
+    result2 := algorithm.LinearSearch(numbers, 6, equalFunc)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LRUCache

LRUCache implements mem cache with lru.

Signature:

go
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int
func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V]
+func (l *LRUCache[K, V]) Get(key K) (V, bool)
+func (l *LRUCache[K, V]) Put(key K, value V)
+func (l *LRUCache[K, V]) Delete(key K) bool
+func (l *LRUCache[K, V]) Len() int

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/algorithm"
+)
+
+func main() {
+    cache := algorithm.NewLRUCache[int, int](2)
+
+    cache.Put(1, 1)
+    cache.Put(2, 2)
+
+    result1, ok1 := cache.Get(1)
+    result2, ok2 := cache.Get(2)
+    result3, ok3 := cache.Get(3)
+
+    fmt.Println(result1, ok1)
+    fmt.Println(result2, ok2)
+    fmt.Println(result3, ok3)
+
+    fmt.Println(cache.Len())
+
+    ok := cache.Delete(2)
+    fmt.Println(ok)
+
+
+    // Output:
+    // 1 true
+    // 2 true
+    // 0 false
+    // 2
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/compare.html b/docs/.vitepress/dist/en/api/packages/compare.html new file mode 100644 index 0000000..f6453d4 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/compare.html @@ -0,0 +1,482 @@ + + + + + + Compare | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Compare

Package compare provides a lightweight comparison function on any type.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)

Index

Documentation

Equal

Checks if two values are equal or not. (check both type and value)

Signature: Run

go
func Equal(left, right any) bool
func Equal(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.Equal(1, 1)
+    result2 := compare.Equal("1", "1")
+    result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3})
+    result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"})
+
+    result5 := compare.Equal(1, "1")
+    result6 := compare.Equal(1, int64(1))
+    result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

EqualValue

Checks if two values are equal or not. (check value only)

Signature: Run

go
func EqualValue(left, right any) bool
func EqualValue(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.EqualValue(1, 1)
+    result2 := compare.EqualValue(int(1), int64(1))
+    result3 := compare.EqualValue(1, "1")
+    result4 := compare.EqualValue(1, "2")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

LessThan

Checks if value `left` less than value `right`.

Signature: Run

go
func LessThan(left, right any) bool
func LessThan(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessThan(1, 2)
+    result2 := compare.LessThan(1.1, 2.2)
+    result3 := compare.LessThan("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessThan(time1, time2)
+
+    result5 := compare.LessThan(2, 1)
+    result6 := compare.LessThan(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterThan

Checks if value `left` greater than value `right`.

Signature:

go
func GreaterThan(left, right any) bool
func GreaterThan(left, right any) bool

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterThan(2, 1)
+    result2 := compare.GreaterThan(2.2, 1.1)
+    result3 := compare.GreaterThan("b", "a")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterThan(time2, time1)
+
+    result5 := compare.GreaterThan(1, 2)
+    result6 := compare.GreaterThan(int64(2), 1)
+    result7 := compare.GreaterThan("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LessOrEqual

Checks if value `left` less than or equal than value `right`.

Signature:

go
func LessOrEqual(left, right any) bool
func LessOrEqual(left, right any) bool

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.LessOrEqual(1, 1)
+    result2 := compare.LessOrEqual(1.1, 2.2)
+    result3 := compare.LessOrEqual("a", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.LessOrEqual(time1, time2)
+
+    result5 := compare.LessOrEqual(2, 1)
+    result6 := compare.LessOrEqual(1, int64(2))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+}

GreaterOrEqual

Checks if value `left` less greater or equal than value `right`.

Signature: Run

go
func GreaterOrEqual(left, right any) bool
func GreaterOrEqual(left, right any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := compare.GreaterOrEqual(1, 1)
+    result2 := compare.GreaterOrEqual(2.2, 1.1)
+    result3 := compare.GreaterOrEqual("b", "b")
+
+    time1 := time.Now()
+    time2 := time1.Add(time.Second)
+    result4 := compare.GreaterOrEqual(time2, time1)
+
+    result5 := compare.GreaterOrEqual(1, 2)
+    result6 := compare.GreaterOrEqual(int64(2), 1)
+    result7 := compare.GreaterOrEqual("b", "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+}

InDelta

Checks if two values are equal or not within a delta.

Signature: Run

go
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool
func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/compare"
+)
+
+func main() {
+    result1 := InDelta(1, 1, 0)
+    result2 := InDelta(1, 2, 0)
+
+    result3 := InDelta(2.0/3.0, 0.66667, 0.001)
+    result4 := InDelta(2.0/3.0, 0.0, 0.001)
+
+    result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0)
+    result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+    // false
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/concurrency.html b/docs/.vitepress/dist/en/api/packages/concurrency.html new file mode 100644 index 0000000..e7cfc05 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/concurrency.html @@ -0,0 +1,540 @@ + + + + + + Concurrency | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Concurrency

Package concurrency contain some functions to support concurrent programming. eg, goroutine, channel.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)
import (
+    "github.com/duke-git/lancet/v2/concurrency"
+)

Index

Channel

Documentation

Channel

NewChannel

Create a Channel pointer instance.

Signature:

go
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]
type Channel[T any] struct
+func NewChannel[T any]() *Channel[T]

Example: Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    c := concurrency.NewChannel[int]()
+}

Bridge

Link multiple channels into one channel until cancel the context.

Signature:

go
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T
func (c *Channel[T]) Bridge(ctx context.Context, chanStream <-chan <-chan T) <-chan T

Example: Run

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    genVals := func() <-chan <-chan int {
+        out := make(chan (<-chan int))
+        go func() {
+            defer close(out)
+            for i := 1; i <= 5; i++ {
+                stream := make(chan int, 1)
+                stream <- i
+                close(stream)
+                out <- stream
+            }
+        }()
+        return out
+    }
+
+    for v := range c.Bridge(ctx, genVals()) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+    // 4
+    // 5
+}

FanIn

Merge multiple channels into one channel until cancel the context.

Signature:

go
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T
func (c *Channel[T]) FanIn(ctx context.Context, channels ...<-chan T) <-chan T

Example: Run

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    channels := make([]<-chan int, 2)
+
+    for i := 0; i < 2; i++ {
+        channels[i] = c.Take(ctx, c.Repeat(ctx, i), 2)
+    }
+
+    chs := c.FanIn(ctx, channels...)
+
+    for v := range chs {
+        fmt.Println(v) //1 1 0 0 or 0 0 1 1
+    }
+}

Repeat

Create channel, put values into the channel repeatly until cancel the context.

Signature: Run

go
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Repeat(ctx context.Context, values ...T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1, 2), 4)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 1
+    // 2
+}

Generate

Creates a channel, then put values into the channel.

Signature:

go
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T
func (c *Channel[T]) Generate(ctx context.Context, values ...T) <-chan T

Example: Run

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Generate(ctx, 1, 2, 3)
+
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+    fmt.Println(<-intStream)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

RepeatFn

Create a channel, excutes fn repeatly, and put the result into the channel, until close context.

Signature: Run

go
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T
func (c *Channel[T]) RepeatFn(ctx context.Context, fn func() T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // hello
+    // hello
+    // hello
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    fn := func() string {
+        return "hello"
+    }
+
+    c := concurrency.NewChannel[string]()
+    intStream := c.Take(ctx, c.RepeatFn(ctx, fn), 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // hello
+    // hello
+    // hello
+}

Or

Read one or more channels into one channel, will close when any readin channel is closed.

Signature: Run

go
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T
func (c *Channel[T]) Or(channels ...<-chan T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    sig := func(after time.Duration) <-chan any {
+        c := make(chan any)
+        go func() {
+            defer close(c)
+            time.Sleep(after)
+        }()
+        return c
+    }
+
+    start := time.Now()
+
+    c := concurrency.NewChannel[any]()
+    <-c.Or(
+        sig(1*time.Second),
+        sig(2*time.Second),
+        sig(3*time.Second),
+    )
+
+    fmt.Println("done after %v", time.Since(start)) //1.003s
+}

OrDone

Read a channel into another channel, will close until cancel context.

Signature: Run

go
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T
func (c *Channel[T]) OrDone(ctx context.Context, channel <-chan T) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 3)
+
+    for v := range c.OrDone(ctx, intStream) {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 1
+    // 1
+}

Take

Create a channel whose values are taken from another channel with limit number.

Signature: Run

go
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T
func (c *Channel[T]) Take(ctx context.Context, valueStream <-chan T, number int) <-chan T

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    numbers := make(chan int, 5)
+    numbers <- 1
+    numbers <- 2
+    numbers <- 3
+    numbers <- 4
+    numbers <- 5
+    defer close(numbers)
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, numbers, 3)
+
+    for v := range intStream {
+        fmt.Println(v)
+    }
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

Tee

Split one chanel into two channels, until cancel the context.

Signature: Run

go
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)
func (c *Channel[T]) Tee(ctx context.Context, in <-chan T) (<-chan T, <-chan T)

Example:

go
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}
package main
+
+import (
+    "context"
+    "fmt"
+    "github.com/duke-git/lancet/v2/concurrency"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.Background())
+    defer cancel()
+
+    c := concurrency.NewChannel[int]()
+    intStream := c.Take(ctx, c.Repeat(ctx, 1), 2)
+
+    ch1, ch2 := c.Tee(ctx, intStream)
+
+    for v := range ch1 {
+        fmt.Println(v)
+        fmt.Println(<-ch2)
+    }
+    
+    // Output:
+    // 1
+    // 1
+    // 1
+    // 1
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/condition.html b/docs/.vitepress/dist/en/api/packages/condition.html new file mode 100644 index 0000000..37676ef --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/condition.html @@ -0,0 +1,316 @@ + + + + + + Condition | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Condition

Package condition contains some functions for conditional judgment. eg. And, Or, TernaryOperator... The implementation of this package refers to the implementation of carlmjohnson's truthy package, you may find more useful information in truthy, thanks carlmjohnson.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/condition"
+)
import (
+    "github.com/duke-git/lancet/v2/condition"
+)

Index

Documentation

Bool

Returns the truthy value of anything.
If the value's type has a Bool() bool method, the method is called and returned.
If the type has an IsZero() bool method, the opposite value is returned.
Slices and maps are truthy if they have a length greater than zero.
All other types are truthy if they are not their zero value.

Signature:

go
func Bool[T any](value T) bool
func Bool[T any](value T) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    // bool
+    result1 := condition.Bool(false)
+    result2 := condition.Bool(true)
+    fmt.Println(result1) // false
+    fmt.Println(result2) // true
+
+    // integer
+    result3 := condition.Bool(0) 
+    result4 := condition.Bool(1)
+    fmt.Println(result3) // false
+    fmt.Println(result4) // true
+
+    // string
+    result5 := condition.Bool("")
+    result6 := condition.Bool(" ")
+    fmt.Println(result5) // false
+    fmt.Println(result6) // true
+
+    // slice
+    nums := []int{}
+    result7 := condition.Bool(nums)
+
+    nums = append(nums, 1, 2)
+    result8 := condition.Bool(nums)
+    fmt.Println(result7) // false
+    fmt.Println(result8) // true
+
+    // struct
+    result9 = condition.Bool(struct{}{})
+    fmt.Println(result8) // false
+
+
+    // Output:
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+    // true
+    // false
+}

And

Returns true if both a and b are truthy.

Signature:

go
func And[T, U any](a T, b U) bool
func And[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.And(0, 1)) // false
+    fmt.Println(condition.And(0, "")) // false
+    fmt.Println(condition.And(0, "0")) // false
+    fmt.Println(condition.And(1, "0")) // true
+}

Or

Returns false if neither a nor b is truthy.

Signature:

go
func Or[T, U any](a T, b U) bool
func Or[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Or(0, "")) // false
+    fmt.Println(condition.Or(0, 1)) // true
+    fmt.Println(condition.Or(0, "0")) // true
+    fmt.Println(condition.Or(1, "0")) // true
+}

Xor

Returns true if a or b but not both is truthy.

Signature:

go
func Xor[T, U any](a T, b U) bool
func Xor[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xor(0, 0)) // false
+    fmt.Println(condition.Xor(0, 1)) // true
+    fmt.Println(condition.Xor(1, 0)) // true
+    fmt.Println(condition.Xor(1, 1)) // false
+}

Nor

Returns true if neither a nor b is truthy.

Signature:

go
func Nor[T, U any](a T, b U) bool
func Nor[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nor(0, 0)) // true
+    fmt.Println(condition.Nor(0, 1)) // false
+    fmt.Println(condition.Nor(1, 0)) // false
+    fmt.Println(condition.Nor(1, 1)) // false
+}

Xnor

Returns true if both a and b or neither a nor b are truthy.

Signature:

go
func Xnor[T, U any](a T, b U) bool
func Xnor[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Xnor(0, 0)) // true
+    fmt.Println(condition.Xnor(0, 1)) // false
+    fmt.Println(condition.Xnor(1, 0)) // false
+    fmt.Println(condition.Xnor(1, 1)) // true
+}

Nand

Returns false if both a and b are truthy

Signature:

go
func Nand[T, U any](a T, b U) bool
func Nand[T, U any](a T, b U) bool

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    fmt.Println(condition.Nand(0, 0)) // true
+    fmt.Println(condition.Nand(0, 1)) // true
+    fmt.Println(condition.Nand(1, 0)) // true
+    fmt.Println(condition.Nand(1, 1)) // false
+}

TernaryOperator

Checks the value of param `isTrue`, if true return ifValue else return elseValue

Signature:

go
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U
func TernaryOperator[T, U any](isTrue T, ifValue U, elseValue U) U

Example:运行

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/condition"
+)
+
+func main() {
+    conditionTrue := 2 > 1
+    result1 := condition.TernaryOperator(conditionTrue, 0, 1)
+
+    conditionFalse := 2 > 3
+    result2 := condition.TernaryOperator(conditionFalse, 0, 1)
+    
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // 1
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/convertor.html b/docs/.vitepress/dist/en/api/packages/convertor.html new file mode 100644 index 0000000..acf17a8 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/convertor.html @@ -0,0 +1,1018 @@ + + + + + + Convertor | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Convertor

Package convertor contains some functions for data type convertion.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)
import (
+    "github.com/duke-git/lancet/v2/convertor"
+)

Index

Documentation

ColorHexToRGB

Convert color hex to color rgb.

Signature:

go
func ColorHexToRGB(colorHex string) (red, green, blue int)
func ColorHexToRGB(colorHex string) (red, green, blue int)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    colorHex := "#003366"
+    r, g, b := convertor.ColorHexToRGB(colorHex)
+
+    fmt.Println(r, g, b)
+
+    // Output:
+    // 0 51 102
+}

ColorRGBToHex

Convert color rgb to color hex.

Signature:

go
func ColorRGBToHex(red, green, blue int) string
func ColorRGBToHex(red, green, blue int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    r := 0
+    g := 51
+    b := 102
+    colorHex := ColorRGBToHex(r, g, b)
+
+    fmt.Println(colorHex)
+
+    // Output:
+    // #003366
+}

ToBool

Convert string to bool. Use strconv.ParseBool.

Signature:

go
func ToBool(s string) (bool, error)
func ToBool(s string) (bool, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    cases := []string{"1", "true", "True", "false", "False", "0", "123", "0.0", "abc"}
+
+    for i := 0; i < len(cases); i++ {
+        result, _ := convertor.ToBool(cases[i])
+        fmt.Println(result)
+    }
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+    // false
+    // false
+    // false
+    // false
+}

ToBytes

Convert value to byte slice.

Signature:

go
func ToBytes(data any) ([]byte, error)
func ToBytes(data any) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    bytesData, err := convertor.ToBytes("abc")
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(bytesData)
+
+    // Output:
+    // [97 98 99]
+}

ToChar

Convert string to char slice.

Signature:

go
func ToChar(s string) []string
func ToChar(s string) []string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToChar("")
+    result2 := convertor.ToChar("abc")
+    result3 := convertor.ToChar("1 2#3")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // []
+    // [a b c]
+    // [1   2 # 3]
+}

ToChannel

Convert a collection of elements to a read-only channel.

Signature:

go
func ToChannel[T any](array []T) <-chan T
func ToChannel[T any](array []T) <-chan T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    ch := convertor.ToChannel([]int{1, 2, 3})
+    result1 := <-ch
+    result2 := <-ch
+    result3 := <-ch
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 3
+}

ToFloat

Convert value to a float64 value. If param is a invalid floatable, will return 0.0 and error.

Signature:

go
func ToFloat(value any) (float64, error)
func ToFloat(value any) (float64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToFloat("")
+    result2, err := convertor.ToFloat("abc")
+    result3, _ := convertor.ToFloat("-1")
+    result4, _ := convertor.ToFloat("-.11")
+    result5, _ := convertor.ToFloat("1.23e3")
+    result6, _ := convertor.ToFloat(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2, err)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 0
+    // 0 strconv.ParseFloat: parsing "": invalid syntax
+    // -1
+    // -0.11
+    // 1230
+    // 0
+}

ToInt

Convert value to a int64 value. If param is a invalid intable, will return 0 and error.

Signature:

go
func ToInt(value any) (int64, error)
func ToInt(value any) (int64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1, _ := convertor.ToInt("123")
+    result2, _ := convertor.ToInt("-123")
+    result3, _ := convertor.ToInt(float64(12.3))
+    result4, err := convertor.ToInt("abc")
+    result5, _ := convertor.ToInt(true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4, err)
+    fmt.Println(result5)
+
+    // Output:
+    // 123
+    // -123
+    // 12
+    // 0 strconv.ParseInt: parsing "": invalid syntax
+    // 0
+}

ToJson

Convert interface to json string. If param can't be converted, will return "" and error.

Signature:

go
func ToJson(value any) (string, error)
func ToJson(value any) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result, err := ToJson(aMap)
+
+    if err != nil {
+        fmt.Printf("%v", err)
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // {"a":1,"b":2,"c":3}
+}

ToMap

Convert a slice of structs to a map based on iteratee function.

Signature:

go
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V
func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Message struct {
+        name string
+        code int
+    }
+    messages := []Message{
+        {name: "Hello", code: 100},
+        {name: "Hi", code: 101},
+    }
+
+    result := convertor.ToMap(messages, func(msg Message) (int, string) {
+        return msg.code, msg.name
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[100:Hello 101:Hi]
+}

ToPointer

Returns a pointer to passed value.

Signature:

go
func ToPointer[T any](value T) *T
func ToPointer[T any](value T) *T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result := convertor.ToPointer(123)
+    fmt.Println(*result)
+
+    // Output:
+    // 123
+}

ToString

ToString convert value to string, for number, string, []byte, will convert to string. For other type (slice, map, array, struct) will call json.Marshal

Signature:

go
func ToString(value any) string
func ToString(value any) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    result1 := convertor.ToString("")
+    result2 := convertor.ToString(nil)
+    result3 := convertor.ToString(0)
+    result4 := convertor.ToString(1.23)
+    result5 := convertor.ToString(true)
+    result6 := convertor.ToString(false)
+    result7 := convertor.ToString([]int{1, 2, 3})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    //
+    //
+    // 0
+    // 1.23
+    // true
+    // false
+    // [1,2,3]
+}

StructToMap

Convert struct to map, only convert exported field, struct field tag `json` should be set.

Signature:

go
func StructToMap(value any) (map[string]any, error)
func StructToMap(value any) (map[string]any, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+        age  int
+    }
+    p := People{
+        "test",
+        100,
+    }
+    pm, _ := convertor.StructToMap(p)
+
+    fmt.Println(pm)
+
+    // Output:
+    // map[name:test]
+}

MapToSlice

Convert a map to a slice based on iteratee function.

Signature:

go
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T
func MapToSlice[T any, K comparable, V any](aMap map[K]V, iteratee func(K, V) T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    aMap := map[string]int{"a": 1, "b": 2, "c": 3}
+    result := MapToSlice(aMap, func(key string, value int) string {
+        return key + ":" + strconv.Itoa(value)
+    })
+
+    fmt.Println(result) //[]string{"a:1", "b:2", "c:3"}
+}

EncodeByte

Encode data to byte slice.

Signature:

go
func EncodeByte(data any) ([]byte, error)
func EncodeByte(data any) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    byteData, _ := convertor.EncodeByte("abc")
+    fmt.Println(byteData)
+
+    // Output:
+    // [6 12 0 3 97 98 99]
+}

DecodeByte

Decode byte data to target object. target should be a pointer instance.

Signature:

go
func DecodeByte(data []byte, target any) error
func DecodeByte(data []byte, target any) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    var result string
+    byteData := []byte{6, 12, 0, 3, 97, 98, 99}
+
+    err := convertor.DecodeByte(byteData, &result)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

DeepClone

Creates a deep copy of passed item, can't clone unexported field of struct.

Signature:

go
func DeepClone[T any](src T) T
func DeepClone[T any](src T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Struct struct {
+        Str        string
+        Int        int
+        Float      float64
+        Bool       bool
+        Nil        interface{}
+        unexported string
+    }
+
+    cases := []interface{}{
+        true,
+        1,
+        0.1,
+        map[string]int{
+            "a": 1,
+            "b": 2,
+        },
+        &Struct{
+            Str:   "test",
+            Int:   1,
+            Float: 0.1,
+            Bool:  true,
+            Nil:   nil,
+            // unexported: "can't be cloned",
+        },
+    }
+
+    for _, item := range cases {
+        cloned := convertor.DeepClone(item)
+
+        isPointerEqual := &cloned == &item
+        fmt.Println(cloned, isPointerEqual)
+    }
+
+    // Output:
+    // true false
+    // 1 false
+    // 0.1 false
+    // map[a:1 b:2] false
+    // &{test 1 0.1 true <nil> } false
+}

CopyProperties

Copies each field from the source struct into the destination struct. Use json.Marshal/Unmarshal, so json tag should be set for fields of dst and src struct.

Signature:

go
func CopyProperties[T, U any](dst T, src U) (err error)
func CopyProperties[T, U any](dst T, src U) (err error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type DiskVO struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type Indicator struct {
+        Id      string    `json:"id"`
+        Ip      string    `json:"ip"`
+        UpTime  string    `json:"upTime"`
+        LoadAvg string    `json:"loadAvg"`
+        Cpu     int       `json:"cpu"`
+        Disk    []Disk    `json:"disk"`
+        Stop    chan bool `json:"-"`
+    }
+
+    type IndicatorVO struct {
+        Id      string   `json:"id"`
+        Ip      string   `json:"ip"`
+        UpTime  string   `json:"upTime"`
+        LoadAvg string   `json:"loadAvg"`
+        Cpu     int64    `json:"cpu"`
+        Disk    []DiskVO `json:"disk"`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    type Disk struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type DiskVO struct {
+        Name    string  `json:"name"`
+        Total   string  `json:"total"`
+        Used    string  `json:"used"`
+        Percent float64 `json:"percent"`
+    }
+
+    type Indicator struct {
+        Id      string    `json:"id"`
+        Ip      string    `json:"ip"`
+        UpTime  string    `json:"upTime"`
+        LoadAvg string    `json:"loadAvg"`
+        Cpu     int       `json:"cpu"`
+        Disk    []Disk    `json:"disk"`
+        Stop    chan bool `json:"-"`
+    }
+
+    type IndicatorVO struct {
+        Id      string   `json:"id"`
+        Ip      string   `json:"ip"`
+        UpTime  string   `json:"upTime"`
+        LoadAvg string   `json:"loadAvg"`
+        Cpu     int64    `json:"cpu"`
+        Disk    []DiskVO `json:"disk"`
+    }
+
+    indicator := &Indicator{Id: "001", Ip: "127.0.0.1", Cpu: 1, Disk: []Disk{
+        {Name: "disk-001", Total: "100", Used: "1", Percent: 10},
+        {Name: "disk-002", Total: "200", Used: "1", Percent: 20},
+        {Name: "disk-003", Total: "300", Used: "1", Percent: 30},
+    }}
+
+    indicatorVO := IndicatorVO{}
+
+    err := convertor.CopyProperties(&indicatorVO, indicator)
+
+    if err != nil {
+        return
+    }
+
+    fmt.Println(indicatorVO.Id)
+    fmt.Println(indicatorVO.Ip)
+    fmt.Println(len(indicatorVO.Disk))
+
+    // Output:
+    // 001
+    // 127.0.0.1
+    // 3
+}

ToInterface

Converts reflect value to its interface type.

Signature:

go
func ToInterface(v reflect.Value) (value interface{}, ok bool)
func ToInterface(v reflect.Value) (value interface{}, ok bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\n", iVal)
+    fmt.Printf("%v\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true    
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    val := reflect.ValueOf("abc")
+    iVal, ok := convertor.ToInterface(val)
+
+    fmt.Printf("%T\n", iVal)
+    fmt.Printf("%v\n", iVal)
+    fmt.Println(ok)
+
+    // Output:
+    // string
+    // abc
+    // true    
+}

Utf8ToGbk

Converts utf8 encoding data to GBK encoding data.

Signature:

go
func Utf8ToGbk(bs []byte) ([]byte, error)
func Utf8ToGbk(bs []byte) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true   
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    utf8Data := []byte("hello")
+    gbkData, _ := convertor.Utf8ToGbk(utf8Data)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(validator.IsGBK(gbkData))
+
+    // Output:
+    // true
+    // true   
+}

GbkToUtf8

Converts GBK encoding data to utf8 encoding data.

Signature:

go
func GbkToUtf8(bs []byte) ([]byte, error)
func GbkToUtf8(bs []byte) ([]byte, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello   
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/convertor"
+)
+
+func main() {
+    gbkData, _ := convertor.Utf8ToGbk([]byte("hello"))
+    utf8Data, _ := convertor.GbkToUtf8(gbkData)
+
+    fmt.Println(utf8.Valid(utf8Data))
+    fmt.Println(string(utf8Data))
+
+    // Output:
+    // true
+    // hello   
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/cryptor.html b/docs/.vitepress/dist/en/api/packages/cryptor.html new file mode 100644 index 0000000..e59f4a7 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/cryptor.html @@ -0,0 +1,1396 @@ + + + + + + Cryptor | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Cryptor

Package cryptor contains some functions for data encryption and decryption. Support base64, md5, hmac, aes, des, rsa.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)
import (
+    "github.com/duke-git/lancet/v2/cryptor"
+)

Index

Documentation

AesEcbEncrypt

Encrypt data with key use AES ECB algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesEcbEncrypt(data, key []byte) []byte
func AesEcbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesEcbDecrypt

Decrypt data with key use AES ECB algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesEcbDecrypt(encrypted, key []byte) []byte
func AesEcbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesEcbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcEncrypt

Encrypt data with key use AES CBC algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesCbcEncrypt(data, key []byte) []byte
func AesCbcEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCbcDecrypt

Decrypt data with key use AES CBC algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesCbcDecrypt(encrypted, key []byte) []byte
func AesCbcDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCtrCrypt

Encrypt or decrypt data with key use AES CTR algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesCtrCrypt(data, key []byte) []byte
func AesCtrCrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbEncrypt

Encrypt data with key use AES CFB algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesCfbEncrypt(data, key []byte) []byte
func AesCfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesCfbDecrypt

Decrypt data with key use AES CBC algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesCfbDecrypt(encrypted, key []byte) []byte
func AesCfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbEncrypt

Enecrypt data with key use AES OFB algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesOfbEncrypt(data, key []byte) []byte
func AesOfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

AesOfbDecrypt

Decrypt data with key use AES OFB algorithm. Length of `key` param should be 16, 24 or 32.

Signature:

go
func AesOfbDecrypt(encrypted, key []byte) []byte
func AesOfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefghijklmnop"
+
+    encrypted := cryptor.AesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.AesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

Base64StdEncode

Encode string with base64 encoding.

Signature:

go
func Base64StdEncode(s string) string
func Base64StdEncode(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    base64Str := cryptor.Base64StdEncode("hello")
+    fmt.Println(base64Str)
+
+    // Output:
+    // aGVsbG8=
+}

Base64StdDecode

Decode a base64 encoded string.

Signature:

go
func Base64StdDecode(s string) string
func Base64StdDecode(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := cryptor.Base64StdDecode("aGVsbG8=")
+    fmt.Println(str)
+
+    // Output:
+    // hello
+}

DesEcbEncrypt

Encrypt data with key use DES ECB algorithm. Length of `key` param should be 8.

Signature:

go
func DesEcbEncrypt(data, key []byte) []byte
func DesEcbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesEcbDecrypt

Decrypt data with key use DES ECB algorithm. Length of `key` param should be 8.

Signature:

go
func DesEcbDecrypt(encrypted, key []byte) []byte
func DesEcbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesEcbEncrypt([]byte(data), []byte(key))
+
+    decrypted := cryptor.DesEcbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcEncrypt

Encrypt data with key use DES CBC algorithm. Length of `key` param should be 8.

Signature:

go
func DesCbcEncrypt(data, key []byte) []byte
func DesCbcEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCbcDecrypt

Decrypt data with key use DES CBC algorithm. Length of `key` param should be 8.

Signature:

go
func DesCbcDecrypt(encrypted, key []byte) []byte
func DesCbcDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCbcEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCbcDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCtrCrypt

Encrypt or decrypt data with key use DES CTR algorithm. Length of `key` param should be 8.

Signature:

go
func DesCtrCrypt(data, key []byte) []byte
func DesCtrCrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCtrCrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCtrCrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbEncrypt

Encrypt data with key use DES CFB algorithm. Length of `key` param should be 8.

Signature:

go
func DesCfbEncrypt(data, key []byte) []byte
func DesCfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesCfbDecrypt

Decrypt data with key use DES CBC algorithm. Length of `key` param should be 8.

Signature:

go
func DesCfbDecrypt(encrypted, key []byte) []byte
func DesCfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesCfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesCfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbEncrypt

Enecrypt data with key use DES OFB algorithm. Length of `key` param should be 8.

Signature:

go
func DesOfbEncrypt(data, key []byte) []byte
func DesOfbEncrypt(data, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

DesOfbDecrypt

Decrypt data with key use DES OFB algorithm. Length of `key` param should be 8.

Signature:

go
func DesOfbDecrypt(encrypted, key []byte) []byte
func DesOfbDecrypt(encrypted, key []byte) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    data := "hello"
+    key := "abcdefgh"
+
+    encrypted := cryptor.DesOfbEncrypt([]byte(data), []byte(key))
+    decrypted := cryptor.DesOfbDecrypt(encrypted, []byte(key))
+
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

HmacMd5

Get the md5 hmac hash of string.

Signature:

go
func HmacMd5(str, key string) string
func HmacMd5(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // e834306eab892d872525d4918a7a639a
+}

HmacMd5WithBase64

Get the md5 hmac hash of base64 string.

Signature:

go
func HmacMd5WithBase64(str, key string) string
func HmacMd5WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacMd5WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 6DQwbquJLYclJdSRinpjmg==
+}

HmacSha1

Get the sha1 hmac hash of string.

Signature:

go
func HmacSha1(str, key string) string
func HmacSha1(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 5c6a9db0cccb92e36ed0323fd09b7f936de9ace0
+}

HmacSha1WithBase64

Return the hmac hash of string use sha1 with base64.

Signature:

go
func HmacSha1WithBase64(str, key string) string
func HmacSha1WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha1WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // XGqdsMzLkuNu0DI/0Jt/k23prOA=
+}

HmacSha256

Get the sha256 hmac hash of string

Signature:

go
func HmacSha256(str, key string) string
func HmacSha256(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // 315bb93c4e989862ba09cb62e05d73a5f376cb36f0d786edab0c320d059fde75
+}

HmacSha256WithBase64

Return the hmac hash of string use sha256 with base64.

Signature:

go
func HmacSha256WithBase64(str, key string) string
func HmacSha256WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha256WithBase64(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // MVu5PE6YmGK6Ccti4F1zpfN2yzbw14btqwwyDQWf3nU=
+}

HmacSha512

Get the sha512 hmac hash of string.

Signature:

go
func HmacSha512(str, key string) string
func HmacSha512(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+    key := "12345"
+
+    hms := cryptor.HmacSha512(str, key)
+    fmt.Println(hms)
+
+    // Output:
+    // dd8f1290a9dd23d354e2526d9a2e9ce8cffffdd37cb320800d1c6c13d2efc363288376a196c5458daf53f8e1aa6b45a6d856303d5c0a2064bff9785861d48cfc
+}

HmacSha512WithBase64

Return the hmac hash of string use sha512 with base64.

Signature:

go
func HmacSha512WithBase64(str, key string) string
func HmacSha512WithBase64(str, key string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+	key := "12345"
+
+	hms := cryptor.HmacSha512WithBase64(str, key)
+	fmt.Println(hms)
+
+	// Output:
+	// 3Y8SkKndI9NU4lJtmi6c6M///dN8syCADRxsE9Lvw2Mog3ahlsVFja9T+OGqa0Wm2FYwPVwKIGS/+XhYYdSM/A==
+}

Md5String

Get the md5 value of string.

Signature:

go
func Md5String(s string) string
func Md5String(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    md5Str := cryptor.Md5String(str)
+    fmt.Println(md5Str)
+
+    // Output:
+    // 5d41402abc4b2a76b9719d911017c592
+}

Md5StringWithBase64

Return the md5 value of string with base64.

Signature:

go
func Md5StringWithBase64(s string) string
func Md5StringWithBase64(s string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5StringWithBase64("hello")
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5Byte

Return the md5 string of byte slice.

Signature:

go
func Md5Byte(data []byte) string
func Md5Byte(data []byte) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5Byte([]byte{'a'})
+	fmt.Println(md5Str)
+
+	// Output:
+	// 0cc175b9c0f1b6a831c399e269772661
+}

Md5ByteWithBase64

Return the md5 string of byte slice with base64.

Signature:

go
func Md5ByteWithBase64(data []byte) string
func Md5ByteWithBase64(data []byte) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    md5Str := cryptor.Md5ByteWithBase64([]byte("hello"))
+	fmt.Println(md5Str)
+
+	// Output:
+	// XUFAKrxLKna5cZ2REBfFkg==
+}

Md5File

Get the md5 value of file.

Signature:

go
func Md5File(filepath string) (string, error)
func Md5File(filepath string) (string, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    s := cryptor.Md5File("./main.go"))
+    fmt.Println(s)
+}

Sha1

Get the sha1 value of string.

Signature:

go
func Sha1(str string) string
func Sha1(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha1(str)
+    fmt.Println(result)
+
+    // Output:
+    // aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
+}

Sha1WithBase64

Return the sha1 value (SHA-1 hash algorithm) of base64 string.

Signature:

go
func Sha1WithBase64(str string) string
func Sha1WithBase64(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha1WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// qvTGHdzF6KLavt4PO0gs2a6pQ00=
+}

Sha256

Get the sha256 value of string.

Signature:

go
func Sha256(str string) string
func Sha256(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha256(str)
+    fmt.Println(result)
+
+    // Output:
+    // 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
+}

Sha256WithBase64

Return the sha256 value (SHA256 hash algorithm) of base64 string.

Signature:

go
func Sha256WithBase64(str string) string
func Sha256WithBase64(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha256WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
+}

Sha512

Get the sha512 value of string.

Signature:

go
func Sha512(str string) string
func Sha512(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    str := "hello"
+
+    result := cryptor.Sha512(str)
+    fmt.Println(result)
+
+    // Output:
+    // 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
+}

Sha512WithBase64

Get the sha512 value of string with base64.

Signature:

go
func Sha512WithBase64(str string) string
func Sha512WithBase64(str string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    result := cryptor.Sha512WithBase64("hello")
+	fmt.Println(result)
+
+	// Output:
+	// m3HSJL1i83hdltRq0+o9czGb+8KJDKra4t/3JRlnPKcjI8PZm6XBHXx6zG4UuMXaDEZjR1wuXDre9G9zvN7AQw==
+}

GenerateRsaKey

Create the rsa public and private key file in current directory.

Signature:

go
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error
func GenerateRsaKey(keySize int, priKeyFile, pubKeyFile string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

RsaEncrypt

Encrypt data with public key file useing ras algorithm.

Signature:

go
func RsaEncrypt(data []byte, pubKeyFileName string) []byte
func RsaEncrypt(data []byte, pubKeyFileName string) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

RsaDecrypt

Decrypt data with private key file useing ras algorithm.

Signature:

go
func RsaDecrypt(data []byte, privateKeyFileName string) []byte
func RsaDecrypt(data []byte, privateKeyFileName string) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/cryptor"
+)
+
+func main() {
+    err := cryptor.GenerateRsaKey(4096, "rsa_private.pem", "rsa_public.pem")
+    if err != nil {
+        return
+    }
+      
+    data := []byte("hello")
+    encrypted := cryptor.RsaEncrypt(data, "rsa_public.pem")
+    decrypted := cryptor.RsaDecrypt(encrypted, "rsa_private.pem")
+      
+    fmt.Println(string(decrypted))
+
+    // Output:
+    // hello
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/copyonwritelist.html b/docs/.vitepress/dist/en/api/packages/datastructure/copyonwritelist.html new file mode 100644 index 0000000..0396551 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/copyonwritelist.html @@ -0,0 +1,386 @@ + + + + + + CopyOnWriteList | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

CopyOnWriteList

CopyOnWriteList is a thread-safe list implementation that uses go slicing as its base. When writing, a new slice is copied and assigned to the original slice when writing is complete. When reading, the original slice is read directly.

源码

用法

go
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)
import (
+    "github.com/duke-git/lancet/datastructure/list"
+)

目录

Documentation

NewCopyOnWriteList

Returns a CopyOnWriteList with empty slices.

go
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList
type CopyOnWriteList[T any] struct {
+    data []T
+    lock sync.
+}
+
+func NewCopyOnWriteList() *CopyOnWriteList

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l)
+}

Size

Returns the length of the CopyOnWriteList.

go
func (l *CopyOnWriteList[T]) Size() int
func (l *CopyOnWriteList[T]) Size() int

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Size())
+}

Get

Returns the element at the specified position in the list

go
func (c *CopyOnWriteList[T]) Get(index int) *T
func (c *CopyOnWriteList[T]) Get(index int) *T

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Get(2))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Get(2))
+}

Set

Replaces the element at the specified position in this list with the specified element.

go
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) Set(index int, e T) (oldValue *T, ok bool)

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.Set(2, 4))
+}

Remove

IndexOf

Returns the index of the value in the list, or -1 if not found.

go
func (c *CopyOnWriteList[T]) IndexOf(e T) int
func (c *CopyOnWriteList[T]) IndexOf(e T) int

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.IndexOf(1))
+}

LastIndexOf

Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not contain that element.

go
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int
func (c *CopyOnWriteList[T]) LastIndexOf(e T) int

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,1})
+    fmt.Println(l.LastIndexOf(1))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,1})
+    fmt.Println(l.LastIndexOf(1))
+}

IsEmpty

Returns true if this list does not contain any elements.

go
func (c *CopyOnWriteList[T]) IsEmpty() bool
func (c *CopyOnWriteList[T]) IsEmpty() bool

Example

go
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{})
+    fmt.Println(l.IsEmpty())
+}
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{})
+    fmt.Println(l.IsEmpty())
+}

Contain

Determines if a CopyOnWriteList contains an element.

go
func (c *CopyOnWriteList[T]) Contain(e T) bool
func (c *CopyOnWriteList[T]) Contain(e T) bool

Example

go
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+l := list.NewCopyOnWriteList([]int{1,2,3})
+fmt.Println(l.Contain(1))
+}
package main
+
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+l := list.NewCopyOnWriteList([]int{1,2,3})
+fmt.Println(l.Contain(1))
+}

ValueOf

Returns a pointer to the value at the index in the list

go
func (c *CopyOnWriteList[T]) ValueOf(index int) []T
func (c *CopyOnWriteList[T]) ValueOf(index int) []T

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    fmt.Println(l.ValueOf(2))
+}

Add

Appends the specified element to the end of the list.

go
func (c *CopyOnWriteList[T]) Add(e T) bool
func (c *CopyOnWriteList[T]) Add(e T) bool

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+	l.Add(4)
+	fmt.Println(l.getList())
+}

AddAll

Appends all the elements of the specified collection to the end of this list

go
func (c *CopyOnWriteList[T]) AddAll(e []T) bool
func (c *CopyOnWriteList[T]) AddAll(e []T) bool

Example

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    l.AddAll([]int{4,5,6})
+    fmt.Println(l.getList())
+}

AddByIndex

Inserts the specified element into the list at the specified position.

go
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool
func (c *CopyOnWriteList[T]) AddByIndex(index int, e T) bool

Example

go
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.AddByIndex(2, 6)
+    fmt.Println(l.getList())
+}
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.AddByIndex(2, 6)
+    fmt.Println(l.getList())
+}

DeleteAt

Removes the element at the specified position in this list.

go
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteAt(index int) (oldValue *T, ok bool)

Example

go
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteAt(2)
+    fmt.Println(l.getList())
+}
package main
+import (
+    "fmt"
+    "github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteAt(2)
+    fmt.Println(l.getList())
+}

DeleteIf

Removes the first occurrence of the specified element from this list (if it exists).

go
func (c *CopyOnWriteList[T]) DeleteIf(func(T) bool) (oldValue *T, ok bool)
func (c *CopyOnWriteList[T]) DeleteIf(func(T) bool) (oldValue *T, ok bool)

Example

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteIf(func(i int) bool {
+        return i == 2
+    })
+    fmt.Println(l.getList())
+}

DeleteBy

Deletes the first occurrence of the specified element from this list (if it exists).

go
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)
func (c *CopyOnWriteList[T]) DeleteBy(e T) (*T bool)

Example

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+	l := list.NewCopyOnWriteList([]int{1,2,3})
+    list.DeleteBy(2)
+    fmt.Println(l.getList())
+}

DeleteRange

Deletes all elements from this list with indexes between fromIndex (included) and toIndex (not included). (leftCloseRightOpen)

go
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)
func (c *CopyOnWriteList[T]) DeleteRange(start int, end int)

Example

go
package main
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}
package main
+import (
+"fmt"
+"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    list.DeleteRange(2, 5)
+    fmt.Println(l.getList())
+}

Equal

Returns true if the specified object is equal to this list

go
func (c *CopyOnWriteList[T]) Equal(e []T) bool
func (c *CopyOnWriteList[T]) Equal(e []T) bool

Example

go
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}
package main
+import (
+	"fmt"
+	"github.com/duke-git/lancet/datastructure/list"
+)
+
+func main() {
+    l := list.NewCopyOnWriteList([]int{1,2,3,4,5,6,7,8,9})
+    fmt.Println(l.Equal([]int{1,2,3,4,5,6,7,8,9}))
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/hashmap.html b/docs/.vitepress/dist/en/api/packages/datastructure/hashmap.html new file mode 100644 index 0000000..355c9ee --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/hashmap.html @@ -0,0 +1,274 @@ + + + + + + HashMap | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

HashMap

HashMap is a key value map data structure.

Source

Usage

go
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
import (
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)

Index

Documentation

NewHashMap

Make a HashMap instance with default capacity is 1 << 10.

Signature:

go
func NewHashMap() *HashMap
func NewHashMap() *HashMap

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    fmt.Println(hm)
+}

NewHashMap

Make a HashMap instance with given size and capacity.

Signature:

go
func NewHashMapWithCapacity(size, capacity uint64) *HashMap
func NewHashMapWithCapacity(size, capacity uint64) *HashMap

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMapWithCapacity(uint64(100), uint64(1000))
+    fmt.Println(hm)
+}

Get

Get the value of given key in hashmap

Signature:

go
func (hm *HashMap) Get(key any) any
func (hm *HashMap) Get(key any) any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    val := hm.Get("a")
+
+    fmt.Println(val) //nil
+}

Put

Put new key value in hashmap, then return value

Signature:

go
func (hm *HashMap) Put(key any, value any) any
func (hm *HashMap) Put(key any, value any) any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    val := hm.Get("a")
+    fmt.Println(val) //1
+}

Delete

Delete key-value item by given key in hashmap.

Signature:

go
func (hm *HashMap) Delete(key any)
func (hm *HashMap) Delete(key any)

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    val := hm.Get("a")
+    fmt.Println(val) //1
+
+    hm.Delete("a")
+    val = hm.Get("a")
+    fmt.Println(val) //nil
+}

Contains

Checks if given key is in hashmap or not.

Signature:

go
func (hm *HashMap) Contains(key any) bool
func (hm *HashMap) Contains(key any) bool

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+
+    fmt.Println(hm.Contains("a")) //true
+    fmt.Println(hm.Contains("b")) //false
+}

Iterate

Executes iteratee funcation for every key and value pair of hashmap.

Signature:

go
func (hm *HashMap) Iterate(iteratee func(key, value any))
func (hm *HashMap) Iterate(iteratee func(key, value any))

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    hm.Iterate(func(key, value any) {
+        fmt.Println(key)
+        fmt.Println(value)
+    })
+}

Keys

Return a slice of the hashmap's keys (random order).

Signature:

go
func (hm *HashMap) Keys() []any
func (hm *HashMap) Keys() []any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    keys := hm.Keys()
+    fmt.Println(keys) //[]interface{"a", "b", "c"}
+}

Values

Return a slice of the hashmap's values (random order).

Signature:

go
func (hm *HashMap) Values() []any
func (hm *HashMap) Values() []any

Example:

go
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}
package main
+
+import (
+    "fmt"
+    hashmap "github.com/duke-git/lancet/v2/datastructure/hashmap"
+)
+
+func main() {
+    hm := heap.NewHashMap()
+    hm.Put("a", 1)
+    hm.Put("b", 2)
+    hm.Put("c", 3)
+
+    values := hm.Values()
+    fmt.Println(values) //[]interface{2, 1, 3}
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/heap.html b/docs/.vitepress/dist/en/api/packages/datastructure/heap.html new file mode 100644 index 0000000..eed7e6b --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/heap.html @@ -0,0 +1,464 @@ + + + + + + Heap | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Heap

Heap is a binary heap tree implemented by slice.

Source

Usage

go
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
import (
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)

Index

Documentation

1. MaxHeap

MaxHeap is a binary heap tree implemented by slice, The key of the root node is both greater than or equal to the key value of the left subtree and greater than or equal to the key value of the right subtree.

NewMaxHeap

Return a NewMaxHeap pointer instance.

Signature:

go
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]
type MaxHeap[T any] struct {
+	data       []T
+	comparator lancetconstraints.Comparator
+}
+func NewMaxHeap[T any](comparator lancetconstraints.Comparator) *MaxHeap[T]

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    fmt.Println(maxHeap)
+}

Push

Push value into the heap

Signature:

go
func (h *MaxHeap[T]) Push(value T)
func (h *MaxHeap[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Pop

Pop return the largest value, and remove it from the heap if heap is empty, return zero value and fasle

Signature:

go
func (h *MaxHeap[T]) Pop() (T, bool)
func (h *MaxHeap[T]) Pop() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Pop()
+
+    fmt.Println(val) //12
+    fmt.Println(ok) //true
+}

Peek

Return the largest element from the heap without removing it, if heap is empty, it returns zero value and false.

Signature:

go
func (h *MaxHeap[T]) Peek() (T, bool)
func (h *MaxHeap[T]) Peek() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+    val, ok := maxHeap.Peek()
+
+    fmt.Println(val) //12
+    fmt.Println(maxHeap.Size()) //12
+}

Data

Return all element of the heap

Signature:

go
func (h *MaxHeap[T]) Data() []T
func (h *MaxHeap[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Data()) //[]int{12, 9, 11, 4, 8, 10, 7, 1, 3, 5, 6, 2}
+}

Size

Return the number of elements in the heap

Signature:

go
func (h *MaxHeap[T]) Size() int
func (h *MaxHeap[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.Size()) //3
+}

PrintStructure

Print the tree structure of the heap

Signature:

go
func (h *MaxHeap[T]) PrintStructure()
func (h *MaxHeap[T]) PrintStructure()

Example:

go
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}
package main
+
+import (
+    "fmt"
+    heap "github.com/duke-git/lancet/v2/datastructure/heap"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    maxHeap := heap.NewMaxHeap[int](&intComparator{})
+    values := []int{6, 5, 2, 4, 7, 10, 12, 1, 3, 8, 9, 11}
+
+	for _, v := range values {
+		maxHeap.Push(v)
+	}
+
+    fmt.Println(maxHeap.PrintStructure())
+//        12
+//    9       11
+//  4   8   10   7
+// 1 3 5 6 2
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/link.html b/docs/.vitepress/dist/en/api/packages/datastructure/link.html new file mode 100644 index 0000000..f5fd138 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/link.html @@ -0,0 +1,986 @@ + + + + + + Linklist | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/list.html b/docs/.vitepress/dist/en/api/packages/datastructure/list.html new file mode 100644 index 0000000..b3abe8e --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/list.html @@ -0,0 +1,1022 @@ + + + + + + List | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

List

List is a linear table, implemented with slice.

Source

Usage

go
import (
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
import (
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)

Index

Documentation

NewList

List is a linear table, implemented with slice. NewList function return a list pointer

Signature:

go
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]
type List[T any] struct {
+    data []T
+}
+func NewList[T any](data []T) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    fmt.Println(li)
+}

Contain

Check if the value in the list or not

Signature:

go
func (l *List[T]) Contain(value T) bool
func (l *List[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.Contain(1)) //true
+    fmt.Println(li.Contain(0)) //false
+}

Data

Return slice of list data

Signature:

go
func (l *List[T]) Data() []T
func (l *List[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    data := li.Data()
+
+    fmt.Println(data) //[]int{1, 2, 3}
+}

ValueOf

Return the value pointer at index in list

Signature:

go
func (l *List[T]) ValueOf(index int) (*T, bool)
func (l *List[T]) ValueOf(index int) (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.ValueOf(0)
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+}

IndexOf

Returns the index of value in the list. if not found return -1

Signature:

go
func (l *List[T]) IndexOf(value T) int
func (l *List[T]) IndexOf(value T) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOf(1)) //0
+    fmt.Println(li.IndexOf(0)) //-1
+}

LastIndexOf

Returns the index of the last occurrence of the value in this list if not found return -1

Signature:

go
func (l *List[T]) LastIndexOf(value T) int
func (l *List[T]) LastIndexOf(value T) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOf(1)) // 3
+    fmt.Println(li.LastIndexOf(0)) //-1
+}

IndexOfFunc

IndexOfFunc returns the first index satisfying f(v). if not found return -1

Signature:

go
func (l *List[T]) IndexOfFunc(f func(T) bool) int
func (l *List[T]) IndexOfFunc(f func(T) bool) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 1 })) //0
+    fmt.Println(li.IndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

LastIndexOfFunc

LastIndexOfFunc returns the index of the last occurrence of the value in this list satisfying f(data[i]). if not found return -1

Signature:

go
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int
func (l *List[T]) LastIndexOfFunc(f func(T) bool) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 1})
+
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 1 })) // 3
+    fmt.Println(li.LastIndexOfFunc(func(a int) bool { return a == 0 })) //-1
+}

Push

Append value to the list

Signature:

go
func (l *List[T]) Push(value T)
func (l *List[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Push(4)
+
+    fmt.Println(li.Data()) //[]int{1, 2, 3, 4}
+}

PopFirst

Delete the first value of list and return it

Signature:

go
func (l *List[T]) PopFirst() (*T, bool)
func (l *List[T]) PopFirst() (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopFirst()
+
+    fmt.Println(*v) //1
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //2, 3
+}

PopFirst

Delete the last value of list and return it

Signature:

go
func (l *List[T]) PopLast() (*T, bool)
func (l *List[T]) PopLast() (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    v, ok := li.PopLast()
+
+    fmt.Println(*v) //3
+    fmt.Println(ok) //true
+    fmt.Println(li.Data()) //1, 2
+}

DeleteAt

Delete the value of list at index, if index is not between 0 and length of list data, do nothing

Signature:

go
func (l *List[T]) DeleteAt(index int)
func (l *List[T]) DeleteAt(index int)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    li.DeleteAt(-1)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    li.DeleteAt(0)
+    fmt.Println(li.Data()) //2,3,4
+
+    li.DeleteAt(2)
+    fmt.Println(li.Data()) //2,3
+}

InsertAt

Insert value into list at index, if index is not between 0 and length of list data, do nothing

Signature:

go
func (l *List[T]) InsertAt(index int, value T)
func (l *List[T]) InsertAt(index int, value T)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.InsertAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(4, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.InsertAt(3, 4)
+    fmt.Println(li.Data()) //1,2,3,4
+
+    // li.InsertAt(2, 4)
+    // fmt.Println(li.Data()) //1,2,4,3
+}

UpdateAt

Update value of list at index, index shoud between 0 and list size - 1

Signature:

go
func (l *List[T]) UpdateAt(index int, value T)
func (l *List[T]) UpdateAt(index int, value T)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+
+    li.UpdateAt(-1, 0)
+    fmt.Println(li.Data()) //1,2,3
+
+    li.UpdateAt(2, 4)
+    fmt.Println(li.Data()) //1,2,4
+
+    li.UpdateAt(3, 5)
+    fmt.Println(li.Data()) //1,2,4
+}

Equal

Compare a list to another list, use reflect.DeepEqual on every element

Signature:

go
func (l *List[T]) Equal(other *List[T]) bool
func (l *List[T]) Equal(other *List[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{1, 2, 3, 4})
+    li3 := list.NewList([]int{1, 2, 3})
+
+    fmt.Println(li1.Equal(li2)) //true
+    fmt.Println(li1.Equal(li3)) //false
+}

IsEmpty

Check if a list is empty or not

Signature:

go
func (l *List[T]) IsEmpty() bool
func (l *List[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3})
+    li2 := list.NewList([]int{})
+
+    fmt.Println(li1.IsEmpty()) //false
+    fmt.Println(li2.IsEmpty()) //true
+}

Clear

Clear the data of list

Signature:

go
func (l *List[T]) Clear()
func (l *List[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    li.Clear()
+
+    fmt.Println(li.Data()) // empty
+}

Clone

Return a copy of list

Signature:

go
func (l *List[T]) Clone() *List[T]
func (l *List[T]) Clone() *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3})
+    cloneList := li.Clone()
+
+    fmt.Println(cloneList.Data()) // 1,2,3
+}

Merge

Merge two list, return new list, don't change original list

Signature:

go
func (l *List[T]) Merge(other *List[T]) *List[T]
func (l *List[T]) Merge(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Merge(li2)
+
+    fmt.Println(li3.Data()) //1, 2, 3, 4, 4, 5, 6
+}

Size

Return number of list data items

Signature:

go
func (l *List[T]) Size() int
func (l *List[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+
+    fmt.Println(li.Size()) //4
+}

Cap

Cap return cap of the inner data

Signature:

go
func (l *List[T]) Cap() int
func (l *List[T]) Cap() int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    data := make([]int, 0, 100)
+    
+    li := list.NewList(data)
+
+    fmt.Println(li.Cap()) // 100
+}

Swap

Swap the value at two index in list

Signature:

go
func (l *List[T]) Swap(i, j int)
func (l *List[T]) Swap(i, j int)

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Swap(0, 3)
+
+    fmt.Println(li.Data()) //4, 2, 3, 1
+}

Reverse

Reverse the data item order of list

Signature:

go
func (l *List[T]) Reverse()
func (l *List[T]) Reverse()

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 3, 4})
+    li.Reverse()
+
+    fmt.Println(li.Data()) //4, 3, 2, 1
+}

Unique

Remove duplicate items in list

Signature:

go
func (l *List[T]) Unique()
func (l *List[T]) Unique()

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li := list.NewList([]int{1, 2, 2, 3, 4})
+    li.Unique()
+
+    fmt.Println(li.Data()) //1,2,3,4
+}

Union

Creates a new list contain all elements in list l and other, remove duplicate element

Signature:

go
func (l *List[T]) Union(other *List[T]) *List[T]
func (l *List[T]) Union(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Union(li2)
+
+    fmt.Println(li3.Data()) //1,2,3,4,5,6
+}

Intersection

Creates a new list whose element both be contained in list l and other

Signature:

go
func (l *List[T]) Intersection(other *List[T]) *List[T]
func (l *List[T]) Intersection(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    li1 := list.NewList([]int{1, 2, 3, 4})
+    li2 := list.NewList([]int{4, 5, 6})
+    li3 := li1.Intersection(li2)
+
+    fmt.Println(li3.Data()) //4
+}

Difference

Return a list whose element in the original list, not in the given list.

Signature:

go
func (l *List[T]) Difference(other *List[T]) *List[T]
func (l *List[T]) Difference(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3
+}

SymmetricDifference

Oppoiste operation of intersection function.

Signature:

go
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]
func (l *List[T]) SymmetricDifference(other *List[T]) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list1 := NewList([]int{1, 2, 3})
+    list2 := NewList([]int{1, 2, 4})
+
+    list3 := list1.Intersection(list2)
+
+    fmt.Println(list3.Data()) //3, 4
+}

RetainAll

Retains only the elements in this list that are contained in the given list.

Signature:

go
func (l *List[T]) RetainAll(list *List[T]) bool
func (l *List[T]) RetainAll(list *List[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    retain := NewList([]int{1, 2})
+    retain1 := NewList([]int{2, 3})
+    retain2 := NewList([]int{1, 2, 5})
+
+    list.RetainAll(retain)
+    list1.RetainAll(retain1)
+    list2.RetainAll(retain2)
+
+    fmt.Println(list.Data()) //1, 2
+    fmt.Println(list1.Data()) //2, 3
+    fmt.Println(list2.Data()) //1, 2
+}

DeleteAll

Removes from this list all of its elements that are contained in the given list.

Signature:

go
func (l *List[T]) DeleteAll(list *List[T]) bool
func (l *List[T]) DeleteAll(list *List[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+    list1 := NewList([]int{1, 2, 3, 4})
+    list2 := NewList([]int{1, 2, 3, 4})
+
+    del := NewList([]int{1})
+    del1 := NewList([]int{2, 3})
+    del2 := NewList([]int{1, 2, 5})
+
+    list.DeleteAll(del)
+    list1.DeleteAll(del1)
+    list2.DeleteAll(del2)
+
+    fmt.Println(list.Data()) //2,3,4
+    fmt.Println(list1.Data()) //1,4
+    fmt.Println(list2.Data()) //3,4
+}

ForEach

Performs the given action for each element of the list.

Signature:

go
func (l *List[T]) ForEach(consumer func(T))
func (l *List[T]) ForEach(consumer func(T))

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := make([]int, 0)
+    list.ForEach(func(i int) {
+        result = append(result, i)
+    })
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

Iterator

Returns an iterator over the elements in this list in proper sequence.

Signature:

go
func (l *List[T]) Iterator() iterator.Iterator[T]
func (l *List[T]) Iterator() iterator.Iterator[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    iterator := list.Iterator()
+
+    result := make([]int, 0)
+    for iterator.HasNext() {
+        item, _ := iterator.Next()
+        result = append(result, item)
+    }
+
+    fmt.Println(result.Data()) //1,2,3,4
+}

ListToMap

Converts a list to a map based on iteratee function.

Signature:

go
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V
func ListToMap[T any, K comparable, V any](list *List[T], iteratee func(T) (K, V)) map[K]V

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    list := NewList([]int{1, 2, 3, 4})
+
+    result := ListToMap(list, func(n int) (int, bool) {
+        return n, n > 1
+    })
+
+    fmt.Println(result) //map[int]bool{1: false, 2: true, 3: true, 4: true}
+}

SubList

SubList returns a sub list of the original list between the specified fromIndex, inclusive, and toIndex, exclusive.

Signature:

go
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]
func (l *List[T]) SubList(fromIndex, toIndex int) *List[T]

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 2, 3, 4, 5, 6})
+   
+    fmt.Println(l.SubList(2, 5)) // []int{3, 4, 5}
+}

DeleteIf

DeleteIf delete all satisfying f(data[i]), returns count of removed elements

Signature:

go
func (l *List[T]) DeleteIf(f func(T) bool) int
func (l *List[T]) DeleteIf(f func(T) bool) int

Example:

go
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}
package main
+
+import (
+    "fmt"
+    list "github.com/duke-git/lancet/v2/datastructure/list"
+)
+
+func main() {
+    l := list.NewList([]int{1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1})
+
+    fmt.Println(l.DeleteIf(func(a int) bool { return a == 1 })) // 12 
+    fmt.Println(l.Data()) // []int{2, 3, 4}
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/queue.html b/docs/.vitepress/dist/en/api/packages/datastructure/queue.html new file mode 100644 index 0000000..345271d --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/queue.html @@ -0,0 +1,1334 @@ + + + + + + Queue | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Queue

A queue is a kind of linear table. It only allows delete operations at the front of the table and insert operations at the rear of the table. This package includes ArrayQueue, LinkedQueue, CircularQueue, and PriorityQueue.

Source

Usage

go
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
import (
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)

Index

1. ArrayQueue

2. LinkedQueue

3. CircularQueue

4. PriorityQueue

Documentation

1. ArrayQueue

Common queue implemented by slice.

NewArrayQueue

Return a ArrayQueue pointer with specific capacity

Signature:

go
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}
func NewArrayQueue[T any](capacity int) *ArrayQueue[T]
+
+type ArrayQueue[T any] struct {
+	items    []T
+	head     int
+	tail     int
+	capacity int
+	size     int
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *ArrayQueue[T]) Data() []T
func (q *ArrayQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue, if queue is full, return false

Signature:

go
func (q *ArrayQueue[T]) Enqueue(item T) bool
func (q *ArrayQueue[T]) Enqueue(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *ArrayQueue[T]) Dequeue() (T, bool)
func (q *ArrayQueue[T]) Dequeue() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

Just get the head element of queue

Signature:

go
func (q *ArrayQueue[T]) Front() T
func (q *ArrayQueue[T]) Front() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

Just get the tail element of queue

Signature:

go
func (q *ArrayQueue[T]) Back() T
func (q *ArrayQueue[T]) Back() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

Get the number of elements in queue

Signature:

go
func (q *ArrayQueue[T]) Size() int
func (q *ArrayQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *ArrayQueue[T]) IsEmpty() bool
func (q *ArrayQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

Check if queue is full or not

Signature:

go
func (q *ArrayQueue[T]) IsFull() bool
func (q *ArrayQueue[T]) IsFull() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

Clean all data in queue

Signature:

go
func (q *ArrayQueue[T]) Clear()
func (q *ArrayQueue[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

Check if the value is in queue or not

Signature:

go
func (q *ArrayQueue[T]) Contain(value T) bool
func (q *ArrayQueue[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewArrayQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

2. LinkedQueue

Common queue implemented by link.

NewLinkedQueue

Return a LinkedQueue pointer

Signature:

go
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}
func NewLinkedQueue[T any]() *LinkedQueue[T]
+
+type LinkedQueue[T any] struct {
+	head   *datastructure.QueueNode[T]
+	tail   *datastructure.QueueNode[T]
+	length int
+}
+type QueueNode[T any] struct {
+	Value T
+	Next  *QueueNode[T]
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *LinkedQueue[T]) Data() []T
func (q *LinkedQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int]()
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue

Signature:

go
func (q *LinkedQueue[T]) Enqueue(value T)
func (q *LinkedQueue[T]) Enqueue(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *LinkedQueue[T]) Dequeue() (T, error)
func (q *LinkedQueue[T]) Dequeue() (T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Dequeue()) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

Just get the head element of queue

Signature:

go
func (q *LinkedQueue[T]) Front() (*T, error)
func (q *LinkedQueue[T]) Front() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

Just get the tail element of queue

Signature:

go
func (q *LinkedQueue[T]) Back() (*T, error)
func (q *LinkedQueue[T]) Back() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

Get the number of elements in queue

Signature:

go
func (q *LinkedQueue[T]) Size() int
func (q *LinkedQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *LinkedQueue[T]) IsEmpty() bool
func (q *LinkedQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

Clear

Clean all data in queue

Signature:

go
func (q *LinkedQueue[T]) Clear()
func (q *LinkedQueue[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

Check if the value is in queue or not

Signature:

go
func (q *LinkedQueue[T]) Contain(value T) bool
func (q *LinkedQueue[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewLinkedQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

3. CircularQueue

Circular queue implemented by slice.

NewCircularQueue

Return a CircularQueue pointer with specific capacity

Signature:

go
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}
func NewCircularQueue[T any](capacity int) *CircularQueue[T]
+
+type CircularQueue[T any] struct {
+	data  []T
+	front int
+	rear  int
+	capacity  int
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *CircularQueue[T]) Data() []T
func (q *CircularQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue, if queue is full, return error

Signature:

go
func (q *CircularQueue[T]) Enqueue(value T) error
func (q *CircularQueue[T]) Enqueue(value T) error

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Data()) // 1,2,3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *CircularQueue[T]) Dequeue() (*T, bool)
func (q *CircularQueue[T]) Dequeue() (*T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    val := q.Dequeue()
+    fmt.Println(*val) // 1
+    fmt.Println(q.Data()) // 2,3
+}

Front

Just get head element of queue

Signature:

go
func (q *CircularQueue[T]) Front() T
func (q *CircularQueue[T]) Front() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Front()) // 1
+    fmt.Println(q.Data()) // 1,2,3
+}

Back

Just get tail element of queue

Signature:

go
func (q *CircularQueue[T]) Back() T
func (q *CircularQueue[T]) Back() T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Back()) // 3
+    fmt.Println(q.Data()) // 1,2,3
+}

Size

Get the number of elements in queue

Signature:

go
func (q *CircularQueue[T]) Size() int
func (q *CircularQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Size()) // 3
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *CircularQueue[T]) IsEmpty() bool
func (q *CircularQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    fmt.Println(q.IsEmpty()) // true
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

Check if queue is full or not

Signature:

go
func (q *CircularQueue[T]) IsFull() bool
func (q *CircularQueue[T]) IsFull() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](3)
+    fmt.Println(q.IsFull()) // false
+
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.IsFull()) // true
+}

Clear

Clean all data in queue

Signature:

go
func (q *CircularQueue[T]) Clear()
func (q *CircularQueue[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+    q.Clear()
+
+    fmt.Println(q.IsEmpty()) // true
+}

Contain

Check if the value is in queue or not

Signature:

go
func (q *CircularQueue[T]) Contain(value T) bool
func (q *CircularQueue[T]) Contain(value T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewCircularQueue[int](5)
+    q.Enqueue(1)
+    q.Enqueue(2)
+    q.Enqueue(3)
+
+    fmt.Println(q.Contain(1)) // true
+    fmt.Println(q.Contain(4)) // false
+}

4. PriorityQueue

Common queue implemented by slice.

NewPriorityQueue

Return a PriorityQueue pointer with specific capacity, param `comparator` is used to compare values of type T in the queue.

Signature:

go
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}
func NewPriorityQueue[T any](capacity int, comparator lancetconstraints.Comparator) *PriorityQueue[T]
+
+type PriorityQueue[T any] struct {
+	items      []T
+	size       int
+	comparator lancetconstraints.Comparator
+}

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Data

Get all queue data

Signature:

go
func (q *PriorityQueue[T]) Data() []T
func (q *PriorityQueue[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+func main() {
+    q := queue.NewPriorityQueue[int](3)
+    fmt.Println(q.Data()) // []
+}

Enqueue

Put element into queue, if queue is full, return false

Signature:

go
func (q *PriorityQueue[T]) Enqueue(item T) bool
func (q *PriorityQueue[T]) Enqueue(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+
+    fmt.Println(q.Data()) // 10, 9, 6, 7, 8, 2, 5, 1, 4, 3
+}

Dequeue

Remove head element of queue and return it

Signature:

go
func (q *PriorityQueue[T]) Dequeue() (T, bool)
func (q *PriorityQueue[T]) Dequeue() (T, bool)

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    val, ok := pq.Dequeue()
+    fmt.Println(val) // 10
+    fmt.Println(q.Data()) // 9, 8, 6, 7, 3, 2, 5, 1, 4
+}

IsEmpty

Check if queue is empty or not

Signature:

go
func (q *PriorityQueue[T]) IsEmpty() bool
func (q *PriorityQueue[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsEmpty()) // true
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsEmpty()) // false
+}

IsFull

Check if queue is full or not

Signature:

go
func (q *PriorityQueue[T]) IsFull() bool
func (q *PriorityQueue[T]) IsFull() bool

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 11; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.IsFull()) // true
+}

Size

Get nubmers of elements in queue

Signature:

go
func (q *PriorityQueue[T]) Size() int
func (q *PriorityQueue[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}
package main
+
+import (
+    "fmt"
+    queue "github.com/duke-git/lancet/v2/datastructure/queue"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    comparator := &intComparator{}
+    q := queue.NewPriorityQueue[int](10, comparator)
+    fmt.Println(q.IsFull()) // false
+
+    for i := 1; i < 5; i++ {
+		q.Enqueue(i)
+	}
+    fmt.Println(q.Size()) // 4
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/set.html b/docs/.vitepress/dist/en/api/packages/datastructure/set.html new file mode 100644 index 0000000..c307bc9 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/set.html @@ -0,0 +1,598 @@ + + + + + + Set | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Set

Set is a data container, like list, but elements of set is not duplicate.

Source

Usage

go
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
import (
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)

Index

Documentation

NewSet

Create a set instance

Signature:

go
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]
type Set[T comparable] map[T]bool
+func NewSet[T comparable](items ...T) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

NewSetFromSlice

Create a set from slice

Signature:

go
func NewSetFromSlice[T comparable](items []T) Set[T]
func NewSetFromSlice[T comparable](items []T) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSetFromSlice([]int{1, 2, 2, 3})
+    fmt.Println(st.Values()) //1,2,3
+}

Values

Return slice of all set data

Signature:

go
func (s Set[T]) Values() []T
func (s Set[T]) Values() []T

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int](1,2,2,3)
+    fmt.Println(st.Values()) //1,2,3
+}

Add

Add items to set

Signature:

go
func (s Set[T]) Add(items ...T)
func (s Set[T]) Add(items ...T)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Values()) //1,2,3
+}

AddIfNotExist

AddIfNotExist checks if item exists in the set, it adds the item to set and returns true if it does not exist in the set, or else it does nothing and returns false.

Signature:

go
func (s Set[T]) AddIfNotExist(item T) bool
func (s Set[T]) AddIfNotExist(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    r1 := st.AddIfNotExist(1)
+    r2 := st.AddIfNotExist(4)
+
+    fmt.Println(r1) // false
+    fmt.Println(r2) // true
+    fmt.Println(st.Values()) // 1,2,3,4
+}

AddIfNotExistBy

AddIfNotExistBy checks if item exists in the set and pass the `checker` function it adds the item to set and returns true if it does not exists in the set and function `checker` returns true, or else it does nothing and returns false.

Signature:

go
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool
func (s Set[T]) AddIfNotExistBy(item T, checker func(element T) bool) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2)
+
+    ok := st.AddIfNotExistBy(3, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(ok) // true
+
+
+    notOk := st.AddIfNotExistBy(4, func(val int) bool {
+        return val%2 != 0
+    })
+    fmt.Println(notOk) // false
+
+    fmt.Println(st.Values()) // 1, 2, 3
+}

Delete

Delete item in set

Signature:

go
func (s Set[T]) Delete(items ...T)
func (s Set[T]) Delete(items ...T)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    set.Delete(3)
+    fmt.Println(st.Values()) //1,2
+}

Contain

Check if item is in set or not

Signature:

go
func (s Set[T]) Contain(item T) bool
func (s Set[T]) Contain(item T) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    st := set.NewSet[int]()
+    st.Add(1, 2, 3)
+
+    fmt.Println(st.Contain(1)) //true
+    fmt.Println(st.Contain(4)) //false
+}

ContainAll

Checks if set contains another set

Signature:

go
func (s Set[T]) ContainAll(other Set[T]) bool
func (s Set[T]) ContainAll(other Set[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.ContainAll(set2)) //true
+    fmt.Println(set1.ContainAll(set3)) //false
+}

Size

Get the number of elements in set

Signature:

go
func (s Set[T]) Size() int
func (s Set[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+
+    fmt.Println(set1.Size()) //3
+}

Clone

Make a copy of set

Signature:

go
func (s Set[T]) Clone() Set[T]
func (s Set[T]) Clone() Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set1.Clone()
+
+    fmt.Println(set1.Size() == set2.Size()) //true
+    fmt.Println(set1.ContainAll(set2)) //true
+}

Equal

Check if two sets has same elements or not

Signature:

go
func (s Set[T]) Equal(other Set[T]) bool
func (s Set[T]) Equal(other Set[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(1, 2, 3)
+    set3 := set.NewSet(1, 2, 3, 4)
+
+    fmt.Println(set1.Equal(set2)) //true
+    fmt.Println(set1.Equal(set3)) //false
+}

Iterate

Call function by every element of set

Signature:

go
func (s Set[T]) Iterate(fn func(item T))
func (s Set[T]) Iterate(fn func(item T))

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    arr := []int{}
+    set.Iterate(func(item int) {
+        arr = append(arr, item)
+    })
+
+    fmt.Println(arr) //1,2,3
+}

EachWithBreak

Iterates over elements of a set and invokes function for each element, when iteratee return false, will break the for each loop.

Signature:

go
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)
func (s Set[T]) EachWithBreak(iteratee func(item T) bool)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet(1, 2, 3, 4, 5)
+
+    var sum int
+
+    s.EachWithBreak(func(n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum) //6
+}

IsEmpty

Check if the set is empty or not

Signature:

go
func (s Set[T]) IsEmpty() bool
func (s Set[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet()
+
+    fmt.Println(set1.IsEmpty()) //false
+    fmt.Println(set2.IsEmpty()) //true
+}

Union

Create a new set contain all element of set s and other

Signature:

go
func (s Set[T]) Union(other Set[T]) Set[T]
func (s Set[T]) Union(other Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Union(set2)
+
+    fmt.Println(set3.Values()) //1,2,3,4,5
+}

Intersection

Create a new set whose element both be contained in set s and other

Signature:

go
func (s Set[T]) Intersection(other Set[T]) Set[T]
func (s Set[T]) Intersection(other Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.Intersection(set2)
+
+    fmt.Println(set3.Values()) //2,3
+}

SymmetricDifference

Create a new set whose element is in set1 or set2, but not in both set1 and set2

Signature:

go
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]
func (s Set[T]) SymmetricDifference(other Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set1.SymmetricDifference(set2)
+
+    fmt.Println(set3.Values()) //1,4,5
+}

Minus

Create an set of whose element in origin set but not in compared set

Signature:

go
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]
func (s Set[T]) Minus(comparedSet Set[T]) Set[T]

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    set1 := set.NewSet(1, 2, 3)
+    set2 := set.NewSet(2, 3, 4, 5)
+    set3 := set.NewSet(2, 3)
+
+    res1 := set1.Minus(set2)
+    fmt.Println(res1.Values()) //1
+
+    res2 := set2.Minus(set3)
+    fmt.Println(res2.Values()) //4,5
+}

Pop

Delete the top element of set then return it, if set is empty, return nil-value of T and false.

Signature:

go
func (s Set[T]) Pop() (v T, ok bool)
func (s Set[T]) Pop() (v T, ok bool)

Example:

go
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}
package main
+
+import (
+    "fmt"
+    set "github.com/duke-git/lancet/v2/datastructure/set"
+)
+
+func main() {
+    s := set.NewSet[int]()
+    s.Add(1)
+    s.Add(2)
+    s.Add(3)
+
+    val, ok = s.Pop()
+
+    fmt.Println(val) // 3
+    fmt.Println(ok) // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/stack.html b/docs/.vitepress/dist/en/api/packages/datastructure/stack.html new file mode 100644 index 0000000..b772bc2 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/stack.html @@ -0,0 +1,572 @@ + + + + + + Stack | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Stack

Stack is an abstract data type that serves as a collection of elements. Elements follow the LIFO principle. FIFO is last-in, first-out, meaning that the most recently produced items are recorded as sold first.

Source

Usage

go
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
import (
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)

Index

1. ArrayStack

2. LinkedStack

Documentation

1. ArrayStack

ArrayStack is a stack implemented by slice.

NewArrayStack

Return a empty ArrayStack pointer

Signature:

go
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]
type ArrayStack[T any] struct {
+	data   []T
+	length int
+}
+func NewArrayStack[T any]() *ArrayStack[T]

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk)
+}

Push

Push element into array stack

Signature:

go
func (s *ArrayStack[T]) Push(value T)
func (s *ArrayStack[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

Delete the top element of stack then return it, if stack is empty, return nil and error

Signature:

go
func (s *ArrayStack[T]) Pop() (*T, error)
func (s *ArrayStack[T]) Pop() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

Return the top element of array stack

Signature:

go
func (s *ArrayStack[T]) Peak() (*T, error)
func (s *ArrayStack[T]) Peak() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

Return a slice of all data in array stack

Signature:

go
func (s *ArrayStack[T]) Data() []T
func (s *ArrayStack[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

Return number of elements in array stack

Signature:

go
func (s *ArrayStack[T]) Size() int
func (s *ArrayStack[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

Check if array stack is empty or not

Signature:

go
func (s *ArrayStack[T]) IsEmpty() bool
func (s *ArrayStack[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

Clear all elments in array stack

Signature:

go
func (s *ArrayStack[T]) Clear()
func (s *ArrayStack[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewArrayStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

2. LinkedStack

LinkedStack is a stack implemented by linked list.

NewLinkedStack

Return a empty LinkedStack pointer

Signature:

go
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]
type StackNode[T any] struct {
+	Value T
+	Next  *StackNode[T]
+}
+type LinkedStack[T any] struct {
+	top    *datastructure.StackNode[T]
+	length int
+}
+func NewLinkedStack[T any]() *LinkedStack[T]

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk)
+}

Push

Push element into linked stack

Signature:

go
func (s *LinkedStack[T]) Push(value T)
func (s *LinkedStack[T]) Push(value T)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Pop

Delete the top element of stack then return it, if stack is empty, return nil and error

Signature:

go
func (s *LinkedStack[T]) Pop() (*T, error)
func (s *LinkedStack[T]) Pop() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Pop()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{2, 1}
+}

Peak

Return the top element of linked stack

Signature:

go
func (s *LinkedStack[T]) Peak() (*T, error)
func (s *LinkedStack[T]) Peak() (*T, error)

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    val, err := sk.Peak()
+    fmt.Println(err) //nil
+    fmt.Println(*val) //3
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Data

Return a slice of all data in linked stack

Signature:

go
func (s *LinkedStack[T]) Data() []T
func (s *LinkedStack[T]) Data() []T

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Data()) //[]int{3, 2, 1}
+}

Size

Return number of elements in linked stack

Signature:

go
func (s *LinkedStack[T]) Size() int
func (s *LinkedStack[T]) Size() int

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.Size()) //3
+}

IsEmpty

Check if linked stack is empty or not

Signature:

go
func (s *LinkedStack[T]) IsEmpty() bool
func (s *LinkedStack[T]) IsEmpty() bool

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+    fmt.Println(sk.IsEmpty()) //true
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    fmt.Println(sk.IsEmpty()) //false
+}

Clear

Clear all elments in linked stack

Signature:

go
func (s *LinkedStack[T]) Clear()
func (s *LinkedStack[T]) Clear()

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+    sk.Clear()
+
+    fmt.Println(sk.Data()) //[]int{}
+}

Print

Print the structure of a linked stack

Signature:

go
func (s *LinkedStack[T]) Print()
func (s *LinkedStack[T]) Print()

Example:

go
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}
package main
+
+import (
+    "fmt"
+    stack "github.com/duke-git/lancet/v2/datastructure/stack"
+)
+
+func main() {
+    sk := stack.NewLinkedStack[int]()
+
+    sk.Push(1)
+    sk.Push(2)
+    sk.Push(3)
+
+
+    sk.Print() //[ &{Value:3 Next:0xc000010260}, &{Value:2 Next:0xc000010250}, &{Value:1 Next:<nil>},  ]
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datastructure/tree.html b/docs/.vitepress/dist/en/api/packages/datastructure/tree.html new file mode 100644 index 0000000..826db67 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datastructure/tree.html @@ -0,0 +1,662 @@ + + + + + + Tree | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Tree

Tree is a collection of tree nodes. Each tree node has a value, a left pointer point to left node and a right pointer point to right node.

Source

Usage

go
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
import (
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)

Index

1. BSTree

Documentation

1. BSTree

BSTree is a binary search tree data structure in which each node has at two children, which are referred to as the left child and the right child. In BSTree: leftNode < rootNode < rightNode. Type T should implements Compare function in lancetconstraints.Comparator interface.

NewBSTree

Make a BSTree pointer instance

Signature:

go
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}
func NewBSTree[T any](rootData T, comparator lancetconstraints.Comparator) *BSTree[T]
+
+type BSTree[T any] struct {
+	root       *datastructure.TreeNode[T]
+	comparator lancetconstraints.Comparator
+}
+
+type TreeNode[T any] struct {
+	Value T
+	Left  *TreeNode[T]
+	Right *TreeNode[T]
+}

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    fmt.Println(bstree) //
+}

Insert

Insert value into binary search tree

Signature:

go
func (t *BSTree[T]) Insert(data T)
func (t *BSTree[T]) Insert(data T)

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

Delete

Delete value of binary search tree

Signature:

go
func (t *BSTree[T]) Delete(data T)
func (t *BSTree[T]) Delete(data T)

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    bstree.Delete(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //2, 5, 6, 7
+}

PreOrderTraverse

Traverse tree nodes in pre order

Signature:

go
func (t *BSTree[T]) PreOrderTraverse() []T
func (t *BSTree[T]) PreOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PreOrderTraverse()) //6, 5, 2, 4, 7
+}

InOrderTraverse

Traverse tree nodes in middle order

Signature:

go
func (t *BSTree[T]) InOrderTraverse() []T
func (t *BSTree[T]) InOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.InOrderTraverse()) //2, 4, 5, 6, 7
+}

PostOrderTraverse

Traverse tree nodes in post order

Signature:

go
func (t *BSTree[T]) PostOrderTraverse() []T
func (t *BSTree[T]) PostOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.PostOrderTraverse()) //5, 2, 4, 7, 6
+}

LevelOrderTraverse

Traverse tree nodes in node level order

Signature:

go
func (t *BSTree[T]) LevelOrderTraverse() []T
func (t *BSTree[T]) LevelOrderTraverse() []T

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.LevelOrderTraverse()) //6, 5, 7, 2, 4
+}

Depth

Get the depth of a binary saerch tree

Signature:

go
func (t *BSTree[T]) Depth() int
func (t *BSTree[T]) Depth() int

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Depth()) //4
+}

HasSubTree

Check if the given tree is sub tree of origin tree or not

Signature:

go
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool
func (t *BSTree[T]) HasSubTree(subTree *BSTree[T]) bool

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    superTree := tree.NewBSTree(8, &intComparator{})
+	superTree.Insert(4)
+	superTree.Insert(5)
+	superTree.Insert(6)
+	superTree.Insert(9)
+	superTree.Insert(4)
+
+    subTree := tree.NewBSTree(5, &intComparator{})
+	subTree.Insert(4)
+	subTree.Insert(6)
+
+    fmt.Println(superTree.HasSubTree(subTree)) //true
+    fmt.Println(subTree.HasSubTree(superTree)) //false
+}

Print

Print the structure of binary saerch tree

Signature:

go
func (t *BSTree[T]) Print()
func (t *BSTree[T]) Print()

Example:

go
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \
+//      /   \
+//     /     \
+//    /       \
+//    5       7
+//   /
+//  /
+//  2
+//   \
+//    4
+}
package main
+
+import (
+    "fmt"
+    tree "github.com/duke-git/lancet/v2/datastructure/tree"
+)
+
+type intComparator struct{}
+
+func (c *intComparator) Compare(v1, v2 any) int {
+	val1, _ := v1.(int)
+	val2, _ := v2.(int)
+
+	if val1 < val2 {
+		return -1
+	} else if val1 > val2 {
+		return 1
+	}
+	return 0
+}
+
+func main() {
+    bstree := tree.NewBSTree(6, &intComparator{})
+    bstree.Insert(7)
+	bstree.Insert(5)
+	bstree.Insert(2)
+	bstree.Insert(4)
+
+    fmt.Println(bstree.Print())
+//        6
+//       / \
+//      /   \
+//     /     \
+//    /       \
+//    5       7
+//   /
+//  /
+//  2
+//   \
+//    4
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/datetime.html b/docs/.vitepress/dist/en/api/packages/datetime.html new file mode 100644 index 0000000..51b30d1 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/datetime.html @@ -0,0 +1,1426 @@ + + + + + + Datetime | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Datetime

Package datetime supports date and time format and compare.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)
import (
+    "github.com/duke-git/lancet/v2/datetime"
+)

Index

Documentation

Note:

  1. In below functions, the format string param should be one of flows value (case no sensitive):
  • yyyy-mm-dd hh:mm:ss
  • yyyy-mm-dd hh:mm
  • yyyy-mm-dd hh
  • yyyy-mm-dd
  • yyyy-mm
  • mm-dd
  • dd-mm-yy hh:mm:ss
  • yyyy/mm/dd hh:mm:ss
  • yyyy/mm/dd hh:mm
  • yyyy/mm/dd hh
  • yyyy/mm/dd
  • yyyy/mm
  • mm/dd
  • dd/mm/yy hh:mm:ss
  • yyyymmdd
  • mmddyy
  • yyyy
  • yy
  • mm
  • hh:mm:ss
  • hh:mm
  • mm:ss

AddDay

Add or sub days to time.

Signature:

go
func AddDay(t time.Time, day int64) time.Time
func AddDay(t time.Time, day int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    tomorrow := datetime.AddDay(now, 1)
+    diff1 := tomorrow.Sub(now)
+
+    yesterday := datetime.AddDay(now, -1)
+    diff2 := yesterday.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 24h0m0s
+    // -24h0m0s
+}

AddHour

Add or sub hours to time.

Signature:

go
func AddHour(t time.Time, hour int64) time.Time
func AddHour(t time.Time, hour int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Hours := datetime.AddHour(now, 2)
+    diff1 := after2Hours.Sub(now)
+
+    before2Hours := datetime.AddHour(now, -2)
+    diff2 := before2Hours.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2h0m0s
+    // -2h0m0s
+}

AddMinute

Add or sub minutes to time.

Signature:

go
func AddMinute(t time.Time, minute int64) time.Time
func AddMinute(t time.Time, minute int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after2Minutes := datetime.AddMinute(now, 2)
+    diff1 := after2Minutes.Sub(now)
+
+    before2Minutes := datetime.AddMinute(now, -2)
+    diff2 := before2Minutes.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 2m0s
+    // -2m0s
+}

AddYear

Add or sub year to the time.

Signature:

go
func AddYear(t time.Time, year int64) time.Time
func AddYear(t time.Time, year int64) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    now := time.Now()
+
+    after1Year := datetime.AddYear(now, 1)
+    diff1 := after1Year.Sub(now)
+
+    before1Year := datetime.AddYear(now, -1)
+    diff2 := before1Year.Sub(now)
+
+    fmt.Println(diff1)
+    fmt.Println(diff2)
+
+    // Output:
+    // 8760h0m0s
+    // -8760h0m0s
+}

BeginOfMinute

Return beginning minute time of day.

Signature:

go
func BeginOfMinute(t time.Time) time.Time
func BeginOfMinute(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:00 +0000 UTC
+}

BeginOfHour

Return zero time of day.

Signature:

go
func BeginOfHour(t time.Time) time.Time
func BeginOfHour(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:00:00 +0000 UTC
+}

BeginOfDay

Return begin time of day.

Signature:

go
func BeginOfDay(t time.Time) time.Time
func BeginOfDay(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfWeek

Return beginning time of week, week begin from Sunday.

Signature:

go
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time
func BeginOfWeek(t time.Time, beginFrom ...time.Weekday) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 00:00:00 +0000 UTC
+}

BeginOfMonth

Return beginning time of month

Signature:

go
func BeginOfMonth(t time.Time) time.Time
func BeginOfMonth(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

BeginOfYear

Return beginning time of year.

Signature:

go
func BeginOfYear(t time.Time) time.Time
func BeginOfYear(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.BeginOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-01 00:00:00 +0000 UTC
+}

EndOfMinute

Return end time minute of day.

Signature:

go
func EndOfMinute(t time.Time) time.Time
func EndOfMinute(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMinute(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:50:59.999999999 +0000 UTC
+}

EndOfHour

Return end time hour of day.

Signature:

go
func EndOfHour(t time.Time) time.Time
func EndOfHour(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfHour(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 18:59:59.999999999 +0000 UTC
+}

EndOfDay

Return end time hour of day.

Signature:

go
func EndOfDay(t time.Time) time.Time
func EndOfDay(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfDay(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-08 23:59:59.999999999 +0000 UTC
+}

EndOfWeek

Return end time of week, week end with Saturday.

Signature:

go
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time
func EndOfWeek(t time.Time, endWith ...time.Weekday) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfWeek(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-14 23:59:59.999999999 +0000 UTC
+}

EndOfMonth

Return end time of month

Signature:

go
func EndOfMonth(t time.Time) time.Time
func EndOfMonth(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfMonth(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-01-31 23:59:59.999999999 +0000 UTC
+}

EndOfYear

Return beginning time of year.

Signature:

go
func EndOfYear(t time.Time) time.Time
func EndOfYear(t time.Time) time.Time

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    input := time.Date(2023, 1, 8, 18, 50, 10, 100, time.UTC)
+    result := datetime.EndOfYear(input)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2023-12-31 23:59:59.999999999 +0000 UTC
+}

GetNowDate

Get current date string, format is yyyy-mm-dd.

Signature:

go
func GetNowDate() string
func GetNowDate() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentDate := datetime.GetNowDate()
+    fmt.Println(currentDate)
+
+    // Output:
+    // 2022-01-28
+}

GetNowTime

Get current time string, format is hh:mm:ss.

Signature:

go
func GetNowTime() string
func GetNowTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime) // 15:57:33
+
+    // Output:
+    // 15:57:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    currentTime := datetime.GetNowTime()
+    fmt.Println(currentTime) // 15:57:33
+
+    // Output:
+    // 15:57:33
+}

GetNowDateTime

Get current date time string, format is yyyy-mm-dd hh:mm:ss.

Signature:

go
func GetNowDateTime() string
func GetNowDateTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    current := datetime.GetNowDateTime()
+    fmt.Println(current)
+
+    // Output:
+    // 2022-01-28 15:59:33
+}

GetTodayStartTime

Return the start time of today, format: yyyy-mm-dd 00:00:00.

Signature:

go
func GetTodayStartTime() string
func GetTodayStartTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    startTime := datetime.GetTodayStartTime()
+    fmt.Println(startTime)
+
+    // Output:
+    // 2023-06-29 00:00:00
+}

GetTodayEndTime

Return the end time of today, format: yyyy-mm-dd 23:59:59.

Signature:

go
func GetTodayEndTime() string
func GetTodayEndTime() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    endTime := datetime.GetTodayEndTime()
+    fmt.Println(endTime)
+
+    // Output:
+    // 2023-06-29 23:59:59
+}

GetZeroHourTimestamp

Return timestamp of zero hour (timestamp of 00:00).

Signature:

go
func GetZeroHourTimestamp() int64
func GetZeroHourTimestamp() int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    zeroTime := datetime.GetZeroHourTimestamp()
+    fmt.Println(zeroTime)
+
+    // Output:
+    // 1643299200
+}

GetNightTimestamp

Return timestamp of zero hour (timestamp of 23:59).

Signature:

go
func GetNightTimestamp() int64
func GetNightTimestamp() int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    nightTime := datetime.GetNightTimestamp()
+    fmt.Println(nightTime)
+
+    // Output:
+    // 1643385599
+}

FormatTimeToStr

Format time to string, `format` param specification see note 1.

Signature:

go
func FormatTimeToStr(t time.Time, format string, timezone ...string) string
func FormatTimeToStr(t time.Time, format string, timezone ...string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}
package main
+
+import (
+    "fmt"
+    "time"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    t, _ := time.Parse("2006-01-02 15:04:05", "2021-01-02 16:04:08")
+
+    result1 := datetime.FormatTimeToStr(t, "yyyy-mm-dd hh:mm:ss")
+    result2 := datetime.FormatTimeToStr(t, "yyyy-mm-dd")
+    result3 := datetime.FormatTimeToStr(t, "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08
+    // 2021-01-02
+    // 02-01-21 16:04:08
+}

FormatStrToTime

Format string to time, `format` param specification see note 1.

Signature:

go
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)
func FormatStrToTime(str, format string, timezone ...string) (time.Time, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1, _ := datetime.FormatStrToTime("2021-01-02 16:04:08", "yyyy-mm-dd hh:mm:ss")
+    result2, _ := datetime.FormatStrToTime("2021-01-02", "yyyy-mm-dd")
+    result3, _ := datetime.FormatStrToTime("02-01-21 16:04:08", "dd-mm-yy hh:mm:ss")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 2021-01-02 16:04:08 +0000 UTC
+    // 2021-01-02 00:00:00 +0000 UTC
+    // 2021-01-02 16:04:08 +0000 UTC
+}

NewUnixNow

Return unix timestamp of current time

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime
type theTime struct {
+    unix int64
+}
+func NewUnixNow() *theTime

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewUnix

Return unix timestamp of specified int64 value.

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime
type theTime struct {
+    unix int64
+}
+func NewUnix(unix int64) *theTime

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnix(1647597438)
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647597438}
+}

NewFormat

Return unix timestamp of specified time string, t should be "yyyy-mm-dd hh:mm:ss".

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewFormat(t string) (*theTime, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1647594245}
+}

NewISO8601

Return unix timestamp of specified iso8601 time string.

Signature:

go
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)
type theTime struct {
+    unix int64
+}
+func NewISO8601(iso8601 string) (*theTime, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, err := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    fmt.Println(tm)
+
+    // Output:
+    // &{1136214245}
+}

ToUnix

Return unix timestamp.

Signature:

go
func (t *theTime) ToUnix() int64
func (t *theTime) ToUnix() int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm := datetime.NewUnixNow()
+    fmt.Println(tm.ToUnix())
+
+    // Output:
+    // 1647597438
+}

ToFormat

Return time string 'yyyy-mm-dd hh:mm:ss'.

Signature:

go
func (t *theTime) ToFormat() string
func (t *theTime) ToFormat() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    fmt.Println(tm.ToFormat())
+
+    // Output:
+    // 2022-03-18 17:04:05
+}

ToFormatForTpl

Return the time string which format is specified tpl.

Signature:

go
func (t *theTime) ToFormatForTpl(tpl string) string
func (t *theTime) ToFormatForTpl(tpl string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewFormat("2022-03-18 17:04:05")
+    ts := tm.ToFormatForTpl("2006/01/02 15:04:05")
+    fmt.Println(ts)
+
+    // Output:
+    // 2022/03/18 17:04:05
+}

ToIso8601

Return iso8601 time string.

Signature:

go
func (t *theTime) ToIso8601() string
func (t *theTime) ToIso8601() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    tm, _ := datetime.NewISO8601("2006-01-02T15:04:05.999Z")
+    ts := tm.ToIso8601()
+    fmt.Println(ts)
+
+    // Output:
+    // 2006-01-02T23:04:05+08:00
+}

IsLeapYear

check if param `year` is leap year or not.

Signature:

go
func IsLeapYear(year int) bool
func IsLeapYear(year int) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.IsLeapYear(2000)
+    result2 := datetime.IsLeapYear(2001)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

BetweenSeconds

Return the number of seconds between two times.

Signature:

go
func BetweenSeconds(t1 time.Time, t2 time.Time) int64
func BetweenSeconds(t1 time.Time, t2 time.Time) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    today := time.Now()
+    tomorrow := datetime.AddDay(today, 1)
+    yesterday := datetime.AddDay(today, -1)
+
+    result1 := datetime.BetweenSeconds(today, tomorrow)
+    result2 := datetime.BetweenSeconds(today, yesterday)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 86400
+    // -86400
+}

DayOfYear

Returns which day of the year the parameter date `t` is.

Signature:

go
func DayOfYear(t time.Time) int
func DayOfYear(t time.Time) int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 02, 01, 1, 1, 1, 0, time.Local)
+    result1 := datetime.DayOfYear(date1)
+
+    date2 := time.Date(2023, 01, 02, 1, 1, 1, 0, time.Local)
+    result2 := datetime.DayOfYear(date2)
+
+    date3 := time.Date(2023, 01, 01, 1, 1, 1, 0, time.Local)
+    result3 := datetime.DayOfYear(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 31
+    // 1
+    // 0
+}

IsWeekend(Deprecated, Use '== Weekday' instead)

Checks if passed time is weekend or not.

Signature:

go
func IsWeekend(t time.Time) bool
func IsWeekend(t time.Time) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    date1 := time.Date(2023, 06, 03, 0, 0, 0, 0, time.Local)
+    date2 := time.Date(2023, 06, 04, 0, 0, 0, 0, time.Local)
+    date3 := time.Date(2023, 06, 02, 0, 0, 0, 0, time.Local)
+
+    result1 := datetime.IsWeekend(date1)
+    result2 := datetime.IsWeekend(date2)
+    result3 := datetime.IsWeekend(date3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

NowDateOrTime

Return current datetime with specific format and timezone.

Signature:

go
func NowDateOrTime(format string, timezone ...string) string
func NowDateOrTime(format string, timezone ...string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss")
+
+	result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 2023-07-26 15:01:30
+    // 2023-07-26 02:01:30
+}

Timestamp

Return current second timestamp.

Signature:

go
func Timestamp(timezone ...string) int64
func Timestamp(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.Timestamp()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051
+}

TimestampMilli

Return current mill second timestamp.

Signature:

go
func TimestampMilli(timezone ...string) int64
func TimestampMilli(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMilli()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331
+}

TimestampMicro

Return current micro second timestamp.

Signature:

go
func TimestampMicro(timezone ...string) int64
func TimestampMicro(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampMicro()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331784
+}

TimestampNano

Return current nano second timestamp.

Signature:

go
func TimestampNano(timezone ...string) int64
func TimestampNano(timezone ...string) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/datetime"
+)
+
+func main() {
+    ts := datetime.TimestampNano()
+
+    fmt.Println(ts)
+
+    // Output:
+    // 1690363051331788000
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/fileutil.html b/docs/.vitepress/dist/en/api/packages/fileutil.html new file mode 100644 index 0000000..b5ad50a --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/fileutil.html @@ -0,0 +1,808 @@ + + + + + + Fileutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Fileutil

Package fileutil implements some basic functions for file operations.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)
import (
+    "github.com/duke-git/lancet/v2/fileutil"
+)

Index

Documentation

ClearFile

Clear the file content, write empty string to the file.

Signature:

go
func ClearFile(path string) error
func ClearFile(path string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ClearFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CreateFile

Create file in path. return true if create succeed.

Signature:

go
func CreateFile(path string) bool
func CreateFile(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isCreatedSucceed := fileutil.CreateFile("./test.txt")
+    fmt.Println(isCreatedSucceed)
+}

CreateDir

Create directory in absolute path. param `absPath` like /a, /a/b.

Signature:

go
func CreateDir(absPath string) error
func CreateDir(absPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CreateDir("/a/b") // will create folder /a/b
+    fmt.Println(err)
+}

CopyFile

Copy src file to dest file. If dest file exist will overwrite it.

Signature:

go
func CopyFile(srcPath string, dstPath string) error
func CopyFile(srcPath string, dstPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.CopyFile("./test.txt", "./test_copy.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

CurrentPath

return current absolute path.

Signature:

go
func CurrentPath() string
func CurrentPath() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    absPath := CurrentPath()
+    fmt.Println(absPath)
+}

FileMode

Return file mode infomation.

Signature:

go
func FileMode(path string) (fs.FileMode, error)
func FileMode(path string) (fs.FileMode, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mode, err := fileutil.FileMode("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+    fmt.Println(mode)
+}

MiMeType

Get file mime type, 'file' param's type should be string or *os.File.

Signature:

go
func MiMeType(file any) string
func MiMeType(file any) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    type1 := fileutil.MiMeType("./test.txt")
+    fmt.Println(type1) //text/plain; charset=utf-8
+
+    f, _ := os.Open("./file.go")
+    type2 := fileutil.MiMeType(f)
+    fmt.Println(type2) //text/plain; charset=utf-8
+}

IsExist

Checks if a file or directory exists.

Signature:

go
func IsExist(path string) bool
func IsExist(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileutil.CreateFile("./test.txt")
+    isFileExist := fileutil.IsExist("./test.txt")
+    fmt.Println(isFileExist) //true
+}

Checks if a file is symbol link or not.

Signature:

go
func IsLink(path string) bool
func IsLink(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isLinkFile := fileutil.IsLink("./test.txt")
+    fmt.Println(isLinkFile) //false
+}

IsDir

Checks if the path is directy or not.

Signature:

go
func IsDir(path string) bool
func IsDir(path string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isDir := fileutil.IsDir("./")
+    fmt.Println(isDir) //true
+
+    isDir = fileutil.IsDir("./test.txt")
+    fmt.Println(isDir) //false
+}

ListFileNames

List all file names in given path.

Signature:

go
func ListFileNames(path string) ([]string, error)
func ListFileNames(path string) ([]string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fileNames, _ := fileutil.ListFileNames("./")
+    fmt.Println(fileNames)
+}

RemoveFile

Remove the file of path.

Signature:

go
func RemoveFile(path string) error
func RemoveFile(path string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.RemoveFile("./test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ReadFileToString

Return string of file content.

Signature:

go
func ReadFileToString(path string) (string, error)
func ReadFileToString(path string) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./test.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    f.WriteString("hello world")
+
+    content, _ := fileutil.ReadFileToString(path)
+    fmt.Println(content) //hello world
+}

ReadFileByLine

Read file line by line, and return slice of lines

Signature:

go
func ReadFileByLine(path string)([]string, error)
func ReadFileByLine(path string)([]string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}
package main
+
+import (
+    "fmt"
+    "os"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    path := "./text.txt"
+    fileutil.CreateFile(path)
+
+    f, _ := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+    f.WriteString("hello\nworld")
+
+    contents, _ := fileutil.ReadFileByLine(path)
+    fmt.Println(contents) //[]string{"hello", "world"}
+}

Zip

Create a zip file of fpath, fpath could be a file or a directory.

Signature:

go
func Zip(fpath string, destPath string) error
func Zip(fpath string, destPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

ZipAppendEntry

Append a single file or directory by fpath to an existing zip file.

Signature:

go
func ZipAppendEntry(fpath string, destPath string) error
func ZipAppendEntry(fpath string, destPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.ZipAppendEntry("./test.txt", "./test.zip")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

UnZip

Unzip the file and save it to dest path.

Signature:

go
func UnZip(zipFile string, destPath string) error
func UnZip(zipFile string, destPath string) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    err := fileutil.Zip("./test.zip", "./unzip/test.txt")
+    if err != nil {
+        fmt.Println(err)
+    }
+}

IsZipFile

Checks if file is zip file or not.

Signature:

go
func IsZipFile(filepath string) bool
func IsZipFile(filepath string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    isZip := fileutil.IsZipFile("./zipfile.zip")
+    fmt.Println(isZip)
+}

FileSize

Returns file size in bytes.

Signature:

go
func FileSize(path string) (int64, error)
func FileSize(path string) (int64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    size, err := fileutil.FileSize("./testdata/test.txt")
+
+    fmt.Println(size)
+    fmt.Println(err)
+
+    // Output:
+    // 20
+    // <nil>
+}

MTime

Returns file modified time(unix timestamp).

Signature:

go
func MTime(filepath string) (int64, error)
func MTime(filepath string) (int64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    mtime, err := fileutil.MTime("./testdata/test.txt")
+
+    fmt.Println(mtime)
+    fmt.Println(err)
+
+    // Output:
+    // 1682391110
+    // <nil>
+}

Sha

returns file sha value, param `shaType` should be 1, 256 or 512.

Signature:

go
func Sha(filepath string, shaType ...int) (string, error)
func Sha(filepath string, shaType ...int) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    sha1, err := fileutil.Sha("./testdata/test.txt", 1)
+    sha256, _ := fileutil.Sha("./testdata/test.txt", 256)
+    sha512, _ := fileutil.Sha("./testdata/test.txt", 512)
+
+    fmt.Println(sha1)
+    fmt.Println(sha256)
+    fmt.Println(sha512)
+    fmt.Println(err)
+
+    // Output:
+    // dda3cf10c5a6ff6c6659a497bf7261b287af2bc7
+    // aa6d0a3fbc3442c228d606da09e0c1dc98c69a1cac3da1909199e0266171df35
+    // d22aba2a1b7a2e2f512756255cc1c3708905646920cb1eb95e45b531ba74774dbbb89baebf1f716220eb9cf4908f1cfc5b2a01267704d9a59f59d77cab609870
+    // <nil>
+}

ReadCsvFile

Reads file content into slice.

Signature:

go
func ReadCsvFile(filepath string) ([][]string, error)
func ReadCsvFile(filepath string) ([][]string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    content, err := fileutil.ReadCsvFile("./testdata/test.csv")
+
+    fmt.Println(content)
+    fmt.Println(err)
+
+    // Output:
+    // [[Bob  12  male] [Duke  14  male] [Lucy  16  female]]
+    // <nil>
+}

WriteCsvFile

Write content to target csv file.

Signature:

go
func WriteCsvFile(filepath string, records [][]string, append bool) error
func WriteCsvFile(filepath string, records [][]string, append bool) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    fpath := "./test.csv"
+    fileutil.CreateFile(fpath)
+
+    f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777)
+    defer f.Close()
+
+    data := [][]string{
+        {"Lili", "22", "female"},
+        {"Jim", "21", "male"},
+    }
+    err := fileutil.WriteCsvFile(fpath, data, false)
+
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadCsvFile(fpath)
+
+    if err != nil {
+        return
+    }
+    fmt.Println(content)
+
+    // Output:
+    // [[Lili 22 female] [Jim 21 male]]
+}

WriteBytesToFile

Writes bytes to target file.

Signature:

go
func WriteBytesToFile(filepath string, content []byte) error
func WriteBytesToFile(filepath string, content []byte) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./bytes.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteBytesToFile(filepath, []byte("hello"))
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}

WriteStringToFile

Writes string to target file.

Signature:

go
func WriteStringToFile(filepath string, content string, append bool) error
func WriteStringToFile(filepath string, content string, append bool) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/fileutil"
+)
+
+func main() {
+    filepath := "./test.txt"
+
+    file, err := os.Create(filepath)
+    if err != nil {
+        return
+    }
+
+    defer file.Close()
+
+    err = fileutil.WriteStringToFile(filepath, "hello", true)
+    if err != nil {
+        return
+    }
+
+    content, err := fileutil.ReadFileToString(filepath)
+    if err != nil {
+        return
+    }
+
+    os.Remove(filepath)
+
+    fmt.Println(content)
+
+    // Output:
+    // hello
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/formatter.html b/docs/.vitepress/dist/en/api/packages/formatter.html new file mode 100644 index 0000000..38433eb --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/formatter.html @@ -0,0 +1,356 @@ + + + + + + Formatter | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Formatter

formatter contains some functions for data formatting.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)
import (
+    "github.com/duke-git/lancet/v2/formatter"
+)

Index

Documentation

Comma

Add comma to a number value by every 3 numbers from right to left. ahead by symbol char. if value is a invalid number string like "aa", return empty string.

Signature:

go
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string
func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.Comma("123", "")
+    result2 := formatter.Comma("12345", "$")
+    result3 := formatter.Comma(1234567, "")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 123
+    // $12,345
+    // ¥1,234,567
+}

Pretty

Pretty data to JSON string.

Signature:

go
func Pretty(v any) (string, error)
func Pretty(v any) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.Pretty([]string{"a", "b", "c"})
+    result2, _ := formatter.Pretty(map[string]int{"a": 1})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [
+    //     "a",
+    //     "b",
+    //     "c"
+    // ]
+    // {
+    //     "a": 1
+    // }
+}

PrettyToWriter

Pretty encode data to writer.

Signature:

go
func PrettyToWriter(v any, out io.Writer) error
func PrettyToWriter(v any, out io.Writer) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string `json:"name"`
+        Aage uint   `json:"age"`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    type User struct {
+        Name string `json:"name"`
+        Aage uint   `json:"age"`
+    }
+    user := User{Name: "King", Aage: 10000}
+
+    buf := &bytes.Buffer{}
+    err := formatter.PrettyToWriter(user, buf)
+
+    fmt.Println(buf)
+    fmt.Println(err)
+
+    // Output:
+    // {
+    //     "name": "King",
+    //     "age": 10000
+    // }
+    //
+    // <nil>
+}

DecimalBytes

Returns a human readable byte size under decimal standard (base 1000). The precision parameter specifies the number of digits after the decimal point, which is 4 for default.

Signature:

go
func DecimalBytes(size float64, precision ...int) string
func DecimalBytes(size float64, precision ...int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.DecimalBytes(1000)
+    result2 := formatter.DecimalBytes(1024)
+    result3 := formatter.DecimalBytes(1234567)
+    result4 := formatter.DecimalBytes(1234567, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KB
+    // 1.024KB
+    // 1.2346MB
+    // 1.235MB
+}

BinaryBytes

Returns a human readable byte size under binary standard (base 1024). The precision parameter specifies the number of digits after the decimal point, which is 4 for default.

Signature:

go
func BinaryBytes(size float64, precision ...int) string
func BinaryBytes(size float64, precision ...int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1 := formatter.BinaryBytes(1024)
+    result2 := formatter.BinaryBytes(1024 * 1024)
+    result3 := formatter.BinaryBytes(1234567)
+    result4 := formatter.BinaryBytes(1234567, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 1KiB
+    // 1MiB
+    // 1.1774MiB
+    // 1.18MiB
+}

ParseDecimalBytes

Returns the human readable bytes size string into the amount it represents(base 1000).

Signature:

go
func ParseDecimalBytes(size string) (uint64, error)
func ParseDecimalBytes(size string) (uint64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseDecimalBytes("12")
+    result2, _ := formatter.ParseDecimalBytes("12k")
+    result3, _ := formatter.ParseDecimalBytes("12 Kb")
+    result4, _ := formatter.ParseDecimalBytes("12.2 kb")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12000
+    // 12000
+    // 12200
+}

ParseBinaryBytes

Returns the human readable bytes size string into the amount it represents(base 1024).

Signature:

go
func ParseBinaryBytes(size string) (uint64, error)
func ParseBinaryBytes(size string) (uint64, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/formatter"
+)
+
+func main() {
+    result1, _ := formatter.ParseBinaryBytes("12")
+    result2, _ := formatter.ParseBinaryBytes("12ki")
+    result3, _ := formatter.ParseBinaryBytes("12 KiB")
+    result4, _ := formatter.ParseBinaryBytes("12.2 kib")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 12
+    // 12288
+    // 12288
+    // 12492
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/function.html b/docs/.vitepress/dist/en/api/packages/function.html new file mode 100644 index 0000000..7100936 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/function.html @@ -0,0 +1,474 @@ + + + + + + Function | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Function

Package function can control the flow of function execution and support part of functional programming.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/function"
+)
import (
+    "github.com/duke-git/lancet/v2/function"
+)

Index

Documentation

After

Creates a function that invokes given func once it's called n or more times.

Signature:

go
func After(n int, fn any) func(args ...any) []reflect.Value
func After(n int, fn any) func(args ...any) []reflect.Value

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.After(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+
+    // Output:
+    // hello
+}

Before

creates a function that invokes func once it's called less than n times.

Signature:

go
func Before(n int, fn any) func(args ...any) []reflect.Value
func Before(n int, fn any) func(args ...any) []reflect.Value

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    fn := function.Before(2, func() {
+        fmt.Println("hello")
+    })
+
+    fn()
+    fn()
+    fn()
+    fn()
+
+    // Output:
+    // hello
+    // hello
+}

CurryFn

Make curry function.

Signature:

go
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T
type CurryFn[T any] func(...T) T
+func (cf CurryFn[T]) New(val T) func(...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    add := func(a, b int) int {
+        return a + b
+    }
+
+    var addCurry function.CurryFn[int] = func(values ...int) int {
+        return add(values[0], values[1])
+    }
+    add1 := addCurry.New(1)
+
+    result := add1(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 3
+}

Compose

Compose the function list from right to left, then return the composed function.

Signature:

go
func Compose[T any](fnList ...func(...T) T) func(...T) T
func Compose[T any](fnList ...func(...T) T) func(...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    toUpper := func(strs ...string) string {
+        return strings.ToUpper(strs[0])
+    }
+    toLower := func(strs ...string) string {
+        return strings.ToLower(strs[0])
+    }
+    transform := function.Compose(toUpper, toLower)
+
+    result := transform("aBCde")
+
+    fmt.Println(result)
+
+    // Output:
+    // ABCDE
+}

Debounced

Creates a debounced function that delays invoking fn until after wait duration have elapsed since the last time the debounced function was invoked.

Signature:

go
func Debounced(fn func(), duration time.Duration) func()
func Debounced(fn func(), duration time.Duration) func()

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    add := func() {
+        count++
+    }
+
+    debouncedAdd := function.Debounced(add, 50*time.Microsecond)
+
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    debouncedAdd()
+
+    time.Sleep(100 * time.Millisecond)
+
+    fmt.Println(count)
+
+    // Output:
+    // 1
+    // 2
+}

Delay

Invoke function after delayed time.

Signature:

go
func Delay(delay time.Duration, fn any, args ...any)
func Delay(delay time.Duration, fn any, args ...any)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    var print = func(s string) {
+        fmt.Println(s)
+    }
+
+    function.Delay(2*time.Second, print, "hello")
+
+    // Output:
+    // hello
+}

Schedule

Invoke function every duration time, until close the returned bool chan.

Signature:

go
func Schedule(d time.Duration, fn any, args ...any) chan bool
func Schedule(d time.Duration, fn any, args ...any) chan bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    count := 0
+
+    increase := func() {
+        count++
+    }
+
+    stop := function.Schedule(2*time.Second, increase)
+
+    time.Sleep(2 * time.Second)
+    close(stop)
+
+    fmt.Println(count)
+
+    // Output:
+    // 2
+}

Pipeline

Pipeline takes a list of functions and returns a function whose param will be passed into the functions one by one.

Signature:

go
func Pipeline[T any](funcs ...func(T) T) func(T) T
func Pipeline[T any](funcs ...func(T) T) func(T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    addOne := func(x int) int {
+        return x + 1
+    }
+    double := func(x int) int {
+        return 2 * x
+    }
+    square := func(x int) int {
+        return x * x
+    }
+
+    fn := function.Pipeline(addOne, double, square)
+
+    result := fn(2)
+
+    fmt.Println(result)
+
+    // Output:
+    // 36
+}

Watcher

Watcher is used for record code excution time. can start/stop/reset the watch timer. get the elapsed time of function execution.

Signature:

go
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start() //start the watcher
+func (w *Watcher) Stop() //stop the watcher
+func (w *Watcher) Reset() //reset the watcher
+func (w *Watcher) GetElapsedTime() time.Duration //get the elapsed time of function execution
type Watcher struct {
+    startTime int64
+    stopTime  int64
+    excuting  bool
+}
+func NewWatcher() *Watcher
+func (w *Watcher) Start() //start the watcher
+func (w *Watcher) Stop() //stop the watcher
+func (w *Watcher) Reset() //reset the watcher
+func (w *Watcher) GetElapsedTime() time.Duration //get the elapsed time of function execution

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/function"
+)
+
+func main() {
+    w := function.NewWatcher()
+
+    w.Start()
+
+    longRunningTask()
+
+    fmt.Println(w.excuting) //true
+
+    w.Stop()
+
+    eapsedTime := w.GetElapsedTime().Milliseconds()
+
+    fmt.Println(eapsedTime)
+
+    w.Reset()
+}
+
+func longRunningTask() {
+    var slice []int64
+    for i := 0; i < 10000000; i++ {
+        slice = append(slice, int64(i))
+    }
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/maputil.html b/docs/.vitepress/dist/en/api/packages/maputil.html new file mode 100644 index 0000000..5c2212a --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/maputil.html @@ -0,0 +1,1672 @@ + + + + + + Maputil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Maputil

Package maputil includes some functions to manipulate map.

Source:

Example:

go
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)
import (
+    "github.com/duke-git/lancet/v2/maputil"
+)

Index

Documentation

MapTo

Rry to map any interface to struct or base type.

Signature:

go
func MapTo(src any, dst any) error
func MapTo(src any, dst any) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  `json:"name"`
+            Age   int     `json:"age"`
+            Phone string  `json:"phone"`
+            Addr  Address `json:"address"`
+        }
+
+        Address struct {
+            Street string `json:"street"`
+            Number int    `json:"number"`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    type (
+        Person struct {
+            Name  string  `json:"name"`
+            Age   int     `json:"age"`
+            Phone string  `json:"phone"`
+            Addr  Address `json:"address"`
+        }
+
+        Address struct {
+            Street string `json:"street"`
+            Number int    `json:"number"`
+        }
+    )
+
+    personInfo := map[string]interface{}{
+        "name":  "Nothin",
+        "age":   28,
+        "phone": "123456789",
+        "address": map[string]interface{}{
+            "street": "test",
+            "number": 1,
+        },
+    }
+
+    var p Person
+    err := MapTo(personInfo, &p)
+
+    fmt.Println(err)
+    fmt.Println(p)
+
+    // Output:
+    // <nil>
+    // {Nothin 28 123456789 {test 1}}
+}

ForEach

Executes iteratee funcation for every key and value pair in map.

Signature:

go
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))
func ForEach[K comparable, V any](m map[K]V, iteratee func(key K, value V))

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+    }
+
+    var sum int
+
+    maputil.ForEach(m, func(_ string, value int) {
+        sum += value
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 10
+}

Filter

Iterates over map, return a new map contains all key and value pairs pass the predicate function.

Signature:

go
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func Filter[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := maputil.Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    maputil.Filter(m, func(_ string, value int) {
+        sum += value
+    })
+
+    result := maputil.Filter(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[b:2 d:4]
+}

FilterByKeys

Iterates over map, return a new map whose keys are all given keys.

Signature:

go
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func FilterByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2]
+}

FilterByValues

Iterates over map, return a new map whose values are all given values.

Signature:

go
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func FilterByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.FilterByValues(m, []int{3, 4})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4]
+}

OmitBy

OmitBy is the opposite of Filter, removes all the map elements for which the predicate function returns true.

Signature:

go
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V
func OmitBy[K comparable, V any](m map[K]V, predicate func(key K, value V) bool) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+    isEven := func(_ string, value int) bool {
+        return value%2 == 0
+    }
+
+    result := maputil.OmitBy(m, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 c:3 e:5]
+}

OmitByKeys

The opposite of FilterByKeys, extracts all the map elements which keys are not omitted.

Signature:

go
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V
func OmitByKeys[K comparable, V any](m map[K]V, keys []K) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByKeys(m, []string{"a", "b"})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3 d:4 e:5]
+}

OmitByValues

The opposite of FilterByValues. remov all elements whose value are in the give slice.

Signature:

go
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V
func OmitByValues[K comparable, V comparable](m map[K]V, values []V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+        "d": 4,
+        "e": 5,
+    }
+
+    result := maputil.OmitByValues(m, []int{4, 5})
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Intersect

Iterates over maps, return a new map of key and value pairs in all given maps.

Signature:

go
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V
func Intersect[K comparable, V any](maps ...map[K]V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 6,
+        "d": 7,
+    }
+
+    m3 := map[string]int{
+        "a": 1,
+        "b": 9,
+        "e": 9,
+    }
+
+    result1 := maputil.Intersect(m1)
+    result2 := maputil.Intersect(m1, m2)
+    result3 := maputil.Intersect(m1, m2, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+    // map[a:1 b:2]
+    // map[a:1]
+}

Keys

Returns a slice of the map's keys.

Signature:

go
func Keys[K comparable, V any](m map[K]V) []K
func Keys[K comparable, V any](m map[K]V) []K

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    keys := maputil.Keys(m)
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Merge

Merge maps, next key will overwrite previous key.

Signature:

go
func Merge[K comparable, V any](maps ...map[K]V) map[K]V
func Merge[K comparable, V any](maps ...map[K]V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[int]string{
+        1: "a",
+        2: "b",
+    }
+    m2 := map[int]string{
+        1: "1",
+        3: "2",
+    }
+
+    result := maputil.Merge(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:c 2:b 3:d]
+}

Minus

Creates an map of whose key in mapA but not in mapB.

Signature:

go
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V
func Minus[K comparable, V any](mapA, mapB map[K]V) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "a": 11,
+        "b": 22,
+        "d": 33,
+    }
+
+    result := maputil.Minus(m1, m2)
+
+    fmt.Println(result)
+
+    // Output:
+    // map[c:3]
+}

Values

Returns a slice of the map's values.

Signature:

go
func Values[K comparable, V any](m map[K]V) []V
func Values[K comparable, V any](m map[K]V) []V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a a b c d]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+        4: "c",
+        5: "d",
+    }
+
+    values := maputil.Values(m)
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a a b c d]
+}

KeysBy

Creates a slice whose element is the result of function mapper invoked by every map's key.

Signature:

go
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T
func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "a",
+        3: "b",
+    }
+
+    keys := maputil.KeysBy(m, func(n int) int {
+        return n + 1
+    })
+
+    sort.Ints(keys)
+
+    fmt.Println(keys)
+
+    // Output:
+    // [2 3 4]
+}

ValuesBy

Creates a slice whose element is the result of function mapper invoked by every map's value.

Signature:

go
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T
func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+    values := maputil.ValuesBy(m, func(v string) string {
+        switch v {
+        case "a":
+            return "a-1"
+        case "b":
+            return "b-2"
+        case "c":
+            return "c-3"
+        default:
+            return ""
+        }
+    })
+
+    sort.Strings(values)
+
+    fmt.Println(values)
+
+    // Output:
+    // [a-1 b-2 c-3]
+}

MapKeys

Transforms a map to other type map by manipulating it's keys.

Signature:

go
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V
func MapKeys[K comparable, V any, T comparable](m map[K]V, iteratee func(key K, value V) T) map[T]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapKeys(m, func(k int, _ string) string {
+        return strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:b 3:c]
+}

MapValues

Transforms a map to other type map by manipulating it's values.

Signature:

go
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T
func MapValues[K comparable, V any, T any](m map[K]V, iteratee func(key K, value V) T) map[K]T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[int]string{
+        1: "a",
+        2: "b",
+        3: "c",
+    }
+
+    result := maputil.MapValues(m, func(k int, v string) string {
+        return v + strconv.Itoa(k)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a1 2:b2 3:c3]
+}

Entry

Transforms a map into array of key/value pairs.

Signature:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func Entries[K comparable, V any](m map[K]V) []Entry[K, V]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}
package main
+
+import (
+    "fmt"
+    "sort"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := maputil.Entries(m)
+
+    sort.Slice(result, func(i, j int) bool {
+        return result[i].Value < result[j].Value
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [{a 1} {b 2} {c 3}]
+}

FromEntries

Creates a map based on a slice of key/value pairs.

Signature:

go
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V
type Entry[K comparable, V any] struct {
+    Key   K
+    Value V
+}
+func FromEntries[K comparable, V any](entries []Entry[K, V]) map[K]V

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    result := maputil.FromEntries([]Entry[string, int]{
+        {Key: "a", Value: 1},
+        {Key: "b", Value: 2},
+        {Key: "c", Value: 3},
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

Transform

Transform a map to another type map.

Signature:

go
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2
func Transform[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1, iteratee func(key K1, value V1) (K2, V2)) map[K2]V2

Example:Run

go
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}
package main
+
+import (
+    "fmt"
+    "strconv"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    result := Transform(m, func(k string, v int) (string, string) {
+        return k, strconv.Itoa(v)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[a:1 b:2 c:3]
+}

IsDisjoint

Checks two maps are disjoint if they have no keys in common.

Signature:

go
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool
func IsDisjoint[K comparable, V any](mapA, mapB map[K]V) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m1 := map[string]int{
+        "a": 1,
+        "b": 2,
+        "c": 3,
+    }
+
+    m2 := map[string]int{
+        "d": 22,
+    }
+
+    m3 := map[string]int{
+        "a": 22,
+    }
+
+    result1 := maputil.IsDisjoint(m1, m2)
+    result2 := maputil.IsDisjoint(m1, m3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasKey

Checks if map has key or not. This function is used to replace the following boilerplate code:

go
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}
_, haskey := amap["baz"];
+
+if haskey {
+    fmt.Println("map has key baz")
+}

Signature:

go
func HasKey[K comparable, V any](m map[K]V, key K) bool
func HasKey[K comparable, V any](m map[K]V, key K) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    m := map[string]int{
+        "a": 1,
+        "b": 2,
+    }
+
+    result1 := maputil.HasKey(m, "a")
+    result2 := maputil.HasKey(m, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NewConcurrentMap

ConcurrentMap is like map, but is safe for concurrent use by multiple goroutines.

Signature:

go
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]
// NewConcurrentMap create a ConcurrentMap with specific shard count.
+func NewConcurrentMap[K comparable, V any](shardCount int) *ConcurrentMap[K, V]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    // create a ConcurrentMap whose key type is string, value type is int
+    cm := maputil.NewConcurrentMap[string, int](100)
+}

ConcurrentMap_Set

Set the value for a key.

Signature:

go
func (cm *ConcurrentMap[K, V]) Set(key K, value V)
func (cm *ConcurrentMap[K, V]) Set(key K, value V)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_Get

Get the value stored in the map for a key, or nil if no.

Signature:

go
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)
func (cm *ConcurrentMap[K, V]) Get(key K) (V, bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+	for j := 0; j < 5; j++ {
+		go func(n int) {
+			val, ok := cm.Get(fmt.Sprintf("%d", n))
+			fmt.Println(val, ok)
+			wg2.Done()
+		}(j)
+	}
+	wg2.Wait()
+
+    // output: (order may change)
+    // 1 true
+    // 3 true
+    // 2 true
+    // 0 true
+    // 4 true
+}

ConcurrentMap_GetOrSet

Returns the existing value for the key if present. Otherwise, it sets and returns the given value.

Signature:

go
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetOrSet(key K, value V) (actual V, ok bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg sync.WaitGroup
+    wg.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
+            fmt.Println(val, ok)
+            wg.Done()
+        }(i)
+    }
+    wg.Wait()
+
+    // output: (order may change)
+    // 1 false
+    // 3 false
+    // 2 false
+    // 0 false
+    // 4 false
+}

ConcurrentMap_Delete

Delete the value for a key.

Signature:

go
func (cm *ConcurrentMap[K, V]) Delete(key K)
func (cm *ConcurrentMap[K, V]) Delete(key K)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            cm.Delete(fmt.Sprintf("%d", n))
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}

ConcurrentMap_GetAndDelete

Returns the existing value for the key if present and then delete the value for the key. Otherwise, do nothing, just return false.

Signature:

go
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)
func (cm *ConcurrentMap[K, V]) GetAndDelete(key K) (actual V, ok bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //n, true
+
+            _, ok = cm.Get(fmt.Sprintf("%d", n))
+            fmt.Println(val, ok) //false
+
+            wg2.Done()
+        }(j)
+    }
+
+    wg2.Wait()
+}

ConcurrentMap_Has

Checks if map has the value for a key.

Signature:

go
func (cm *ConcurrentMap[K, V]) Has(key K) bool
func (cm *ConcurrentMap[K, V]) Has(key K) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+    var wg2 sync.WaitGroup
+	wg2.Add(5)
+    for j := 0; j < 5; j++ {
+        go func(n int) {
+            ok := cm.Has(fmt.Sprintf("%d", n))
+            fmt.Println(ok) // true
+            wg2.Done()
+        }(j)
+    }
+    wg2.Wait()
+}

ConcurrentMap_Range

Calls iterator sequentially for each key and value present in each of the shards in the map. If iterator returns false, range stops the iteration.

Signature:

go
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)
func (cm *ConcurrentMap[K, V]) Range(iterator func(key K, value V) bool)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/maputil"
+)
+
+func main() {
+    cm := maputil.NewConcurrentMap[string, int](100)
+
+    var wg1 sync.WaitGroup
+    wg1.Add(5)
+
+    for i := 0; i < 5; i++ {
+        go func(n int) {
+            cm.Set(fmt.Sprintf("%d", n), n)
+            wg1.Done()
+        }(i)
+    }
+    wg1.Wait()
+
+
+    cm.Range(func(key string, value int) bool {
+        fmt.Println(value)
+        return true
+    })
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/mathutil.html b/docs/.vitepress/dist/en/api/packages/mathutil.html new file mode 100644 index 0000000..1c3cb2b --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/mathutil.html @@ -0,0 +1,1086 @@ + + + + + + Mathutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Mathutil

Package mathutil implements some functions for math calculation.

Source:

Example:

go
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)
import (
+    "github.com/duke-git/lancet/v2/mathutil"
+)

Index

Documentation

Average

Return average value of numbers. Maybe call RoundToFloat to round result.

Signature:

go
func Average[T constraints.Integer | constraints.Float](numbers ...T) T
func Average[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Average(1, 2)
+
+    avg := mathutil.Average(1.2, 1.4)
+    result2 := mathutil.RoundToFloat(avg, 1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.3
+}

Exponent

Calculate x to the nth power.

Signature:

go
func Exponent(x, n int64) int64
func Exponent(x, n int64) int64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Exponent(10, 0)
+    result2 := mathutil.Exponent(10, 1)
+    result3 := mathutil.Exponent(10, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 10
+    // 100
+}

Fibonacci

Calculate the nth number of fibonacci sequence.

Signature:

go
func Fibonacci(first, second, n int) int
func Fibonacci(first, second, n int) int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Fibonacci(1, 1, 1)
+    result2 := mathutil.Fibonacci(1, 1, 2)
+    result3 := mathutil.Fibonacci(1, 1, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 1
+    // 5
+}

Factorial

Calculate the factorial of x.

Signature:

go
func Factorial(x uint) uint
func Factorial(x uint) uint

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Factorial(1)
+    result2 := mathutil.Factorial(2)
+    result3 := mathutil.Factorial(3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 6
+}

Max

Return max value of numbers.

Signature:

go
func Max[T constraints.Integer | constraints.Float](numbers ...T) T
func Max[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Max(1, 2, 3)
+    result2 := mathutil.Max(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.4
+}

MaxBy

Return the maximum value of a slice using the given comparator function.

Signature:

go
func MaxBy[T any](slice []T, comparator func(T, T) bool) T
func MaxBy[T any](slice []T, comparator func(T, T) bool) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MaxBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result2 := mathutil.MaxBy([]string{"abd", "abc", "ab"}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    result3 := mathutil.MaxBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) > len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abc
+    // abd
+    //
+}

Min

Return the minimum value of numbers.

Signature:

go
func Min[T constraints.Integer | constraints.Float](numbers ...T) T
func Min[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Min(1, 2, 3)
+    result2 := mathutil.Min(1.2, 1.4, 1.1, 1.4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 1.1
+}

MinBy

Return the minimum value of a slice using the given comparator function.

Signature:

go
func MinBy[T any](slice []T, comparator func(T, T) bool) T
func MinBy[T any](slice []T, comparator func(T, T) bool) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.MinBy([]string{"a", "ab", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result2 := mathutil.MinBy([]string{"ab", "ac", "abc"}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    result3 := mathutil.MinBy([]string{}, func(v1, v2 string) bool {
+        return len(v1) < len(v2)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // a
+    // ab
+    //
+}

Percent

calculate the percentage of val to total, retain n decimal places.

Signature:

go
func Percent(val, total float64, n int) float64
func Percent(val, total float64, n int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Percent(1, 2, 2)
+    result2 := mathutil.Percent(0.1, 0.3, 2)
+    result3 := mathutil.Percent(-30305, 408420, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 50
+    // 33.33
+    // -7.42
+}

RoundToFloat

Round float up to n decimal places.

Signature:

go
func RoundToFloat(x float64, n int) float64
func RoundToFloat(x float64, n int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToFloat(0.124, 2)
+    result2 := mathutil.RoundToFloat(0.125, 2)
+    result3 := mathutil.RoundToFloat(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

RoundToString

Round float up to n decimal places. will return string.

Signature:

go
func RoundToString(x float64, n int) string
func RoundToString(x float64, n int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RoundToString(0.124, 2)
+    result2 := mathutil.RoundToString(0.125, 2)
+    result3 := mathutil.RoundToString(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.13
+    // 0.125
+}

TruncRound

Round float off n decimal places.

Signature:

go
func TruncRound(x float64, n int) float64
func TruncRound(x float64, n int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.TruncRound(0.124, 2)
+    result2 := mathutil.TruncRound(0.125, 2)
+    result3 := mathutil.TruncRound(0.125, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.12
+    // 0.12
+    // 0.125
+}

Range

Creates a slice of numbers from start with specified count, element step is 1.

Signature:

go
func Range[T constraints.Integer | constraints.Float](start T, count int) []T
func Range[T constraints.Integer | constraints.Float](start T, count int) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Range(1, 4)
+    result2 := mathutil.Range(1, -4)
+    result3 := mathutil.Range(-4, 4)
+    result4 := mathutil.Range(1.0, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [-4 -3 -2 -1]
+    // [1 2 3 4]
+}

RangeWithStep

Creates a slice of numbers from start to end with specified step.

Signature:

go
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T
func RangeWithStep[T constraints.Integer | constraints.Float](start, end, step T) []T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RangeWithStep(1, 4, 1)
+    result2 := mathutil.RangeWithStep(1, -1, 0)
+    result3 := mathutil.RangeWithStep(-4, 1, 2)
+    result4 := mathutil.RangeWithStep(1.0, 4.0, 1.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [1 2 3]
+    // []
+    // [-4 -2 0]
+    // [1 2.1 3.2]
+}

AngleToRadian

Converts angle value to radian value.

Signature:

go
func AngleToRadian(angle float64) float64
func AngleToRadian(angle float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.AngleToRadian(45)
+    result2 := mathutil.AngleToRadian(90)
+    result3 := mathutil.AngleToRadian(180)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 0.7853981633974483
+    // 1.5707963267948966
+    // 3.141592653589793
+}

RadianToAngle

Converts radian value to angle value.

Signature:

go
func RadianToAngle(radian float64) float64
func RadianToAngle(radian float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.RadianToAngle(math.Pi)
+    result2 := mathutil.RadianToAngle(math.Pi / 2)
+    result3 := mathutil.RadianToAngle(math.Pi / 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 180
+    // 90
+    // 45
+}

PointDistance

Caculates two points distance.

Signature:

go
func PointDistance(x1, y1, x2, y2 float64) float64
func PointDistance(x1, y1, x2, y2 float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.PointDistance(1, 1, 4, 5)
+
+    fmt.Println(result1)
+
+    // Output:
+    // 5
+}

IsPrime

Checks if number is prime number.

Signature:

go
func IsPrime(n int) bool
func IsPrime(n int) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.IsPrime(-1)
+    result2 := mathutil.IsPrime(0)
+    result3 := mathutil.IsPrime(1)
+    result4 := mathutil.IsPrime(2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

GCD

Return greatest common divisor (GCD) of integers.

Signature:

go
func GCD[T constraints.Integer](integers ...T) T
func GCD[T constraints.Integer](integers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.GCD(1, 1)
+    result2 := mathutil.GCD(1, -1)
+    result3 := mathutil.GCD(-1, 1)
+    result4 := mathutil.GCD(-1, -1)
+    result5 := mathutil.GCD(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // 1
+    // -1
+    // -1
+    // 3
+}

LCM

Return Least Common Multiple (LCM) of integers.

Signature:

go
func LCM[T constraints.Integer](integers ...T) T
func LCM[T constraints.Integer](integers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.LCM(1, 1)
+    result2 := mathutil.LCM(1, 2)
+    result3 := mathutil.LCM(3, 6, 9)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 1
+    // 2
+    // 18
+}

Cos

Returns the cosine of the radian argument.

Signature:

go
func Cos(radian float64, precision ...int) float64
func Cos(radian float64, precision ...int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Cos(0)
+    result2 := mathutil.Cos(90)
+    result3 := mathutil.Cos(180)
+    result4 := mathutil.Cos(math.Pi)
+    result5 := mathutil.Cos(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 1
+    // -0.447
+    // -0.598
+    // -1
+    // 0
+}

Sin

Returns the sine of the radian argument.

Signature:

go
func Sin(radian float64, precision ...int) float64
func Sin(radian float64, precision ...int) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sin(0)
+    result2 := mathutil.Sin(90)
+    result3 := mathutil.Sin(180)
+    result4 := mathutil.Sin(math.Pi)
+    result5 := mathutil.Sin(math.Pi / 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 0
+    // 0.894
+    // -0.801
+    // 0
+    // 1
+}

Log

Returns the logarithm of base n.

Signature:

go
func Log(n, base float64) float64
func Log(n, base float64) float64

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Log(8, 2)
+    result2 := mathutil.TruncRound(mathutil.Log(5, 2), 2)
+    result3 := mathutil.TruncRound(mathutil.Log(27, 3), 0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // 3
+    // 2.32
+    // 3
+}

Sum

Returns sum of passed numbers.

Signature:

go
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T
func Sum[T constraints.Integer | constraints.Float](numbers ...T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := mathutil.Sum(1, 2)
+    result2 := mathutil.Sum(0.1, float64(1))
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 3
+    // 1.1
+}

Abs

Returns the absolute value of x.

Signature:

go
func Abs[T constraints.Integer | constraints.Float](x T) T
func Abs[T constraints.Integer | constraints.Float](x T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/mathutil"
+)
+
+func main() {
+    result1 := Abs(-1)
+	result2 := Abs(-0.1)
+	result3 := Abs(float32(0.2))
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+
+	// Output:
+	// 1
+	// 0.1
+	// 0.2
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/netutil.html b/docs/.vitepress/dist/en/api/packages/netutil.html new file mode 100644 index 0000000..513cf9c --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/netutil.html @@ -0,0 +1,1196 @@ + + + + + + Netutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Netutil

Package netutil contains functions to get net information and send http request.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)
import (
+    "github.com/duke-git/lancet/v2/netutil"
+)

Index

Documentation

ConvertMapToQueryString

Convert map to url query string.

Signature:

go
func ConvertMapToQueryString(param map[string]any) string
func ConvertMapToQueryString(param map[string]any) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    // Output:
+    // a=1&b=2&c=3
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    var m = map[string]any{
+        "c": 3,
+        "a": 1,
+        "b": 2,
+    }
+    qs := netutil.ConvertMapToQueryString(m)
+
+    // Output:
+    // a=1&b=2&c=3
+}

EncodeUrl

Encode url query string values.

Signature:

go
func EncodeUrl(urlStr string) (string, error)
func EncodeUrl(urlStr string) (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    urlAddr := "http://www.lancet.com?a=1&b=[2]"
+    encodedUrl, err := netutil.EncodeUrl(urlAddr)
+
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(encodedUrl)
+
+    // Output:
+    // http://www.lancet.com?a=1&b=%5B2%5D
+}

GetInternalIp

Get internal ip information.

Signature:

go
func GetInternalIp() string
func GetInternalIp() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    internalIp := netutil.GetInternalIp()
+    ip := net.ParseIP(internalIp)
+
+    fmt.Println(ip)
+
+    // Output:
+    // 192.168.1.9
+}

GetIps

Get all ipv4 list.

Signature:

go
func GetIps() []string
func GetIps() []string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ips := netutil.GetIps()
+    fmt.Println(ips)
+
+    // Output:
+    // [192.168.1.9]
+}

GetMacAddrs

Get all mac addresses list.

Signature:

go
func GetMacAddrs() []string {
func GetMacAddrs() []string {

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    macAddrs := netutil.GetMacAddrs()
+    fmt.Println(macAddrs)
+
+    // Output:
+    // [18:31:bf:09:d1:56 76:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f 74:ee:2a:e6:2e:0f]
+}

GetPublicIpInfo

Get public ip information.

Signature:

go
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  `json:"status"`
+    Country     string  `json:"country"`
+    CountryCode string  `json:"countryCode"`
+    Region      string  `json:"region"`
+    RegionName  string  `json:"regionName"`
+    City        string  `json:"city"`
+    Lat         float64 `json:"lat"`
+    Lon         float64 `json:"lon"`
+    Isp         string  `json:"isp"`
+    Org         string  `json:"org"`
+    As          string  `json:"as"`
+    Ip          string  `json:"query"`
+}
func GetPublicIpInfo() (*PublicIpInfo, error)
+type PublicIpInfo struct {
+    Status      string  `json:"status"`
+    Country     string  `json:"country"`
+    CountryCode string  `json:"countryCode"`
+    Region      string  `json:"region"`
+    RegionName  string  `json:"regionName"`
+    City        string  `json:"city"`
+    Lat         float64 `json:"lat"`
+    Lon         float64 `json:"lon"`
+    Isp         string  `json:"isp"`
+    Org         string  `json:"org"`
+    As          string  `json:"as"`
+    Ip          string  `json:"query"`
+}

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    publicIpInfo, err := netutil.GetPublicIpInfo()
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    fmt.Println(publicIpInfo)
+}

GetRequestPublicIp

Get http request public ip.

Signature:

go
func GetRequestPublicIp(req *http.Request) string
func GetRequestPublicIp(req *http.Request) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip := "36.112.24.10"
+
+    request := http.Request{
+        Method: "GET",
+        Header: http.Header{
+            "X-Forwarded-For": {ip},
+        },
+    }
+    publicIp := netutil.GetRequestPublicIp(&request)
+
+    fmt.Println(publicIp)
+
+    // Output:
+    // 36.112.24.10
+}

IsPublicIP

Checks if an ip is public or not.

Signature:

go
func IsPublicIP(IP net.IP) bool
func IsPublicIP(IP net.IP) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsPublicIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsPublicIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsPublicIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

IsInternalIP

Checks if an ip is intranet or not.

Signature:

go
func IsInternalIP(IP net.IP) bool
func IsInternalIP(IP net.IP) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ip1 := netutil.IsInternalIP(net.ParseIP("127.0.0.1"))
+    ip2 := netutil.IsInternalIP(net.ParseIP("192.168.0.1"))
+    ip3 := netutil.IsInternalIP(net.ParseIP("36.112.24.10"))
+
+    fmt.Println(ip1)
+    fmt.Println(ip2)
+    fmt.Println(ip3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HttpRequest

HttpRequest is a struct used to abstract HTTP request entity.

Signature:

go
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}
type HttpRequest struct {
+    RawURL      string
+    Method      string
+    Headers     http.Header
+    QueryParams url.Values
+    FormData    url.Values
+    Body        []byte
+}

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    header := http.Header{}
+    header.Add("Content-Type", "multipart/form-data")
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "testItem")
+
+    request := &netutil.HttpRequest{
+        RawURL:   "https://jsonplaceholder.typicode.com/todos",
+        Method:   "POST",
+        Headers:  header,
+        FormData: postData,
+    }
+}

HttpClient

HttpClient is a struct used to send HTTP request. It can be instanced with some configurations or none config.

Signature:

go
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient
type HttpClient struct {
+    *http.Client
+    TLS     *tls.Config
+    Request *http.Request
+    Config  HttpClientConfig
+}
+
+type HttpClientConfig struct {
+    SSLEnabled       bool
+    TLSConfig        *tls.Config
+    Compressed       bool
+    HandshakeTimeout time.Duration
+    ResponseTimeout  time.Duration
+    Verbose          bool
+}
+
+func NewHttpClient() *HttpClient
+
+func NewHttpClientWithConfig(config *HttpClientConfig) *HttpClient

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    httpClientCfg := netutil.HttpClientConfig{
+        SSLEnabled: true,
+        HandshakeTimeout:10 * time.Second
+    }
+    httpClient := netutil.NewHttpClientWithConfig(&httpClientCfg)
+}

SendRequest

Use HttpClient to send HTTP request.

Signature:

go
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)
func (client *HttpClient) SendRequest(request *HttpRequest) (*http.Response, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

DecodeResponse

Decode http response into target object.

Signature:

go
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error
func (client *HttpClient) DecodeResponse(resp *http.Response, target any) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "net"
+    "time"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    request := &netutil.HttpRequest{
+        RawURL: "https://jsonplaceholder.typicode.com/todos/1",
+        Method: "GET",
+    }
+
+    httpClient := netutil.NewHttpClient()
+    resp, err := httpClient.SendRequest(request)
+    if err != nil || resp.StatusCode != 200 {
+        return
+    }
+
+    type Todo struct {
+        UserId    int    `json:"userId"`
+        Id        int    `json:"id"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    var todo Todo
+    err = httpClient.DecodeResponse(resp, &todo)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(todo.Id)
+
+    // Output:
+    // 1
+}

StructToUrlValues

Convert struct to url values, only convert the field which is exported and has `json` tag.

Signature:

go
func StructToUrlValues(targetStruct any) url.Values
func StructToUrlValues(targetStruct any) url.Values

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Name   string `json:"name,omitempty"`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    type TodoQuery struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Name   string `json:"name,omitempty"`
+        Status string
+    }
+    item := TodoQuery{
+        Id:     1,
+        UserId: 123,
+        Name:   "test",
+        Status: "completed",
+    }
+    queryValues := netutil.StructToUrlValues(item)
+
+    fmt.Println(todoValues.Get("id"))
+    fmt.Println(todoValues.Get("userId"))
+    fmt.Println(todoValues.Get("name"))
+    fmt.Println(todoValues.Get("status"))
+
+    // Output:
+    // 1
+    // 123
+    // test
+    //
+}

HttpGet

Send http get request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpGet(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpGet(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPost

Send http post request.(Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPost(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPost(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos"
+    header := map[string]string{
+        "Content-Type": "application/x-www-form-urlencoded",
+    }
+
+    postData := url.Values{}
+    postData.Add("userId", "1")
+    postData.Add("title", "TestToDo")
+
+    resp, err := netutil.HttpPost(apiUrl, header, nil, postData)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPut

Send http put request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPut(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPut(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPutToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPut(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpDelete

Send http delete request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpDelete(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpDelete(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    resp, err := netutil.HttpDelete(url)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

HttpPatch

Send http patch request. (Deprecated: use SendRequest for replacement)

Signature:

go
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPatch(url string, params ...any) (*http.Response, error)
// params[0] is header which type should be http.Header or map[string]string,
+// params[1] is query param which type should be url.Values or map[string]string,
+// params[2] is post body which type should be []byte.
+// params[3] is http client which type should be http.Client.
+func HttpPatch(url string, params ...any) (*http.Response, error)

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+    type Todo struct {
+        Id     int    `json:"id"`
+        UserId int    `json:"userId"`
+        Title  string `json:"title"`
+    }
+    todo := Todo{1, 1, "TestPatchToDo"}
+    bodyParams, _ := json.Marshal(todo)
+
+    resp, err := netutil.HttpPatch(url, header, nil, bodyParams)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    body, _ := ioutil.ReadAll(resp.Body)
+    fmt.Println(body)
+}

ParseHttpResponse

Decode http response to specified interface.

Signature:

go
func ParseHttpResponse(resp *http.Response, obj any) error
func ParseHttpResponse(resp *http.Response, obj any) error

Example:

go
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    `json:"id"`
+        UserId    int    `json:"userId"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}
package main
+
+import (
+    "encoding/json"
+    "fmt"
+    "io/ioutil"
+    "log"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    url := "https://jsonplaceholder.typicode.com/todos/1"
+    header := map[string]string{
+        "Content-Type": "application/json",
+    }
+
+    resp, err := netutil.HttpGet(url, header)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    type Todo struct {
+        Id        int    `json:"id"`
+        UserId    int    `json:"userId"`
+        Title     string `json:"title"`
+        Completed bool   `json:"completed"`
+    }
+
+    toDoResp := &Todo{}
+    err = netutil.ParseHttpResponse(resp, toDoResp)
+    if err != nil {
+        log.Fatal(err)
+    }
+
+    fmt.Println(toDoResp)
+}

DownloadFile

Download the file exist in url to a local file.

Signature:

go
func DownloadFile(filepath string, url string) error
func DownloadFile(filepath string, url string) error

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    err := netutil.DownloadFile("./lancet_logo.jpg", "https://picx.zhimg.com/v2-fc82a4199749de9cfb71e32e54f489d3_720w.jpg?source=172ae18b")
+
+    fmt.Println(err)
+}

UploadFile

Upload the file to a server.

Signature:

go
func UploadFile(filepath string, server string) (bool, error)
func UploadFile(filepath string, server string) (bool, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    ok, err := netutil.UploadFile("./a.jpg", "http://www.xxx.com/bucket/test")
+
+    fmt.Println(ok)
+    fmt.Println(err)
+}

IsPingConnected

checks if can ping the specified host or not.

Signature:

go
func IsPingConnected(host string) bool
func IsPingConnected(host string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsPingConnected("www.baidu.com")
+    result2 := netutil.IsPingConnected("www.!@#&&&.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsTelnetConnected

Checks if can telnet the specified host or not.

Signature:

go
func IsTelnetConnected(host string, port string) bool
func IsTelnetConnected(host string, port string) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/netutil"
+)
+
+func main() {
+    result1 := netutil.IsTelnetConnected("www.baidu.com", "80")
+    result2 := netutil.IsTelnetConnected("www.baidu.com", "123")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/pointer.html b/docs/.vitepress/dist/en/api/packages/pointer.html new file mode 100644 index 0000000..7f4b841 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/pointer.html @@ -0,0 +1,260 @@ + + + + + + Pointer | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Pointer

pointer contains some util functions to operate go pointer.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)

Index

Documentation

Of

Returns a pointer to the pass value `v`.

Signature:

go
func Of[T any](v T) *T
func Of[T any](v T) *T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    result1 := pointer.Of(123)
+    result2 := pointer.Of("abc")
+
+    fmt.Println(*result1)
+    fmt.Println(*result2)
+
+    // Output:
+    // 123
+    // abc
+}

Unwrap

Returns the value from the pointer.

Signature:

go
func Unwrap[T any](p *T) T
func Unwrap[T any](p *T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 123
+    b := "abc"
+
+    result1 := pointer.Unwrap(&a)
+    result2 := pointer.Unwrap(&b)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 123
+    // abc
+}

UnwarpOr

Returns the value from the pointer or fallback if the pointer is nil.

Signature:

go
UnwarpOr[T any](p *T, fallback T) T
UnwarpOr[T any](p *T, fallback T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOr(&a, 456)
+	result2 := pointer.UnwarpOr(&b, "abc")
+	result3 := pointer.UnwarpOr(c, 456)
+	result4 := pointer.UnwarpOr(d, "def")
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 456
+	// def
+}

UnwarpOrDefault

Returns the value from the pointer or the default value if the pointer is nil.

Signature:

go
UnwarpOrDefault[T any](p *T) T
UnwarpOrDefault[T any](p *T) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+	a := 123
+	b := "abc"
+
+	var c *int
+	var d *string
+
+	result1 := pointer.UnwarpOrDefault(&a)
+	result2 := pointer.UnwarpOrDefault(&b)
+	result3 := pointer.UnwarpOrDefault(c)
+	result4 := pointer.UnwarpOrDefault(d)
+
+	fmt.Println(result1)
+	fmt.Println(result2)
+	fmt.Println(result3)
+	fmt.Println(result4)
+
+	// Output:
+	// 123
+	// abc
+	// 0
+	//
+}

ExtractPointer

Returns the underlying value by the given interface type

Signature:

go
func ExtractPointer(value any) any
func ExtractPointer(value any) any

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/pointer"
+)
+
+func main() {
+    a := 1
+    b := &a
+    c := &b
+    d := &c
+
+    result := pointer.ExtractPointer(d)
+
+    fmt.Println(result)
+
+    // Output:
+    // 1
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/random.html b/docs/.vitepress/dist/en/api/packages/random.html new file mode 100644 index 0000000..d5710e1 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/random.html @@ -0,0 +1,218 @@ + + + + + + Random | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Random

Package random implements some basic functions to generate random int and string.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/random"
+)
import (
+    "github.com/duke-git/lancet/v2/random"
+)

Index

Documentation

RandBytes

Generate random byte slice.

Signature:

go
func RandBytes(length int) []byte
func RandBytes(length int) []byte

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randBytes := random.RandBytes(4)
+    fmt.Println(randBytes)
+}

RandInt

Generate random int between min and max, may contain min, not max.

Signature:

go
func RandInt(min, max int) int
func RandInt(min, max int) int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    rInt := random.RandInt(1, 10)
+    fmt.Println(rInt)
+}

RandString

Generate random given length string. only contains letter (a-zA-Z)

Signature:

go
func RandString(length int) string
func RandString(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //pGWsze
+}

RandUpper

Generate a random upper case string

Signature:

go
func RandUpper(length int) string
func RandUpper(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandString(6)
+    fmt.Println(randStr) //PACWGF
+}

RandLower

Generate a random lower case string

Signature:

go
func RandLower(length int) string
func RandLower(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandLower(6)
+    fmt.Println(randStr) //siqbew
+}

RandNumeral

Generate a random numeral string

Signature:

go
func RandNumeral(length int) string
func RandNumeral(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeral(6)
+    fmt.Println(randStr) //035172
+}

RandNumeralOrLetter

generate a random numeral or letter string

Signature:

go
func RandNumeralOrLetter(length int) string
func RandNumeralOrLetter(length int) string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    randStr := random.RandNumeralOrLetter(6)
+    fmt.Println(randStr) //0aW7cQ
+}

UUIdV4

Generate a random UUID of version 4 according to RFC 4122.

Signature:

go
func UUIdV4() (string, error)
func UUIdV4() (string, error)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    uuid, err := random.UUIdV4()
+    if err != nil {
+        return
+    }
+    fmt.Println(uuid)
+}

RandUniqueIntSlice

Generate a slice of random int of length n that do not repeat.

Signature:

go
func RandUniqueIntSlice(n, min, max int) []int
func RandUniqueIntSlice(n, min, max int) []int

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/random"
+)
+
+func main() {
+    result := random.RandUniqueIntSlice(5, 0, 10)
+    fmt.Println(result) //[0 4 7 1 5] (random)
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/retry.html b/docs/.vitepress/dist/en/api/packages/retry.html new file mode 100644 index 0000000..14481e0 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/retry.html @@ -0,0 +1,328 @@ + + + + + + Retry | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Retry

Package retry is for executing a function repeatedly until it was successful or canceled by the context.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/retry"
+)
import (
+    "github.com/duke-git/lancet/v2/retry"
+)

Index

Documentation

Context

Set retry context config, can cancel the retry with context.

Signature:

go
func Context(ctx context.Context)
func Context(ctx context.Context)

Example:Run

go
import (
+    "context"
+    "errors"
+    "fmt"
+    "github.com/duke-git/lancet/v2/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}
import (
+    "context"
+    "errors"
+    "fmt"
+    "github.com/duke-git/lancet/v2/retry"
+    "time"
+)
+
+func main() {
+    ctx, cancel := context.WithCancel(context.TODO())
+
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number > 3 {
+            cancel()
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    retry.Retry(increaseNumber,
+        duration,
+        retry.Context(ctx),
+    )
+
+    fmt.Println(number)
+
+    // Output:
+    // 4
+}

RetryFunc

Function that retry executes.

Signature:

go
type RetryFunc func() error
type RetryFunc func() error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    var increaseNumber retry.RetryFunc = func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

RetryTimes

Set times of retry. Default times is 5.

Signature:

go
func RetryTimes(n uint)
func RetryTimes(n uint)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    err := retry.Retry(increaseNumber, retry.RetryTimes(2))
+    if err != nil {
+        fmt.Println(err)
+    }
+
+    // Output:
+    // function main.main.func1 run failed after 2 times retry
+}

RetryDuration

Set duration of retries. Default duration is 3 second.

Signature:

go
func RetryDuration(d time.Duration)
func RetryDuration(d time.Duration)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

Retry

Executes the retryFunc repeatedly until it was successful or canceled by the context.

Signature:

go
func Retry(retryFunc RetryFunc, opts ...Option) error
func Retry(retryFunc RetryFunc, opts ...Option) error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "log"
+    "github.com/duke-git/lancet/v2/retry"
+)
+
+func main() {
+    number := 0
+    increaseNumber := func() error {
+        number++
+        if number == 3 {
+            return nil
+        }
+        return errors.New("error occurs")
+    }
+
+    duration := retry.RetryDuration(time.Microsecond*50)
+
+    err := retry.Retry(increaseNumber, duration)
+    if err != nil {
+        return
+    }
+
+    fmt.Println(number)
+
+    // Output:
+    // 3
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/slice.html b/docs/.vitepress/dist/en/api/packages/slice.html new file mode 100644 index 0000000..4c1e671 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/slice.html @@ -0,0 +1,2534 @@ + + + + + + Slice | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Slice

Package slice implements some functions to manipulate slice.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/slice"
+)
import (
+    "github.com/duke-git/lancet/v2/slice"
+)

Index

Documentation

AppendIfAbsent

If slice doesn't contain the item, append it to the slice.

Signature:

go
func AppendIfAbsent[T comparable](slice []T, item T) []T
func AppendIfAbsent[T comparable](slice []T, item T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.AppendIfAbsent([]string{"a", "b"}, "b")
+    result2 := slice.AppendIfAbsent([]string{"a", "b"}, "c")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b]
+    // [a b c]
+}

Contain

Check if the target value is in the slice or not.

Signature:

go
func Contain[T comparable](slice []T, target T) bool
func Contain[T comparable](slice []T, target T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Contain([]string{"a", "b", "c"}, "a")
+    result2 := slice.Contain([]int{1, 2, 3}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainBy

returns true if predicate function return true.

Signature:

go
func ContainBy[T any](slice []T, predicate func(item T) bool) bool
func ContainBy[T any](slice []T, predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type foo struct {
+        A string
+        B int
+    }
+
+    array1 := []foo{{A: "1", B: 1}, {A: "2", B: 2}}
+    result1 := slice.ContainBy(array1, func(f foo) bool { return f.A == "1" && f.B == 1 })
+    result2 := slice.ContainBy(array1, func(f foo) bool { return f.A == "2" && f.B == 1 })
+
+    array2 := []string{"a", "b", "c"}
+    result3 := slice.ContainBy(array2, func(t string) bool { return t == "a" })
+    result4 := slice.ContainBy(array2, func(t string) bool { return t == "d" })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // false
+    // true
+    // false
+}

ContainSubSlice

Check if the slice contain subslice or not.

Signature:

go
func ContainSubSlice[T comparable](slice, subSlice []T) bool
func ContainSubSlice[T comparable](slice, subSlice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "b"})
+    result2 := slice.ContainSubSlice([]string{"a", "b", "c"}, []string{"a", "d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Chunk

Creates an slice of elements split into groups the length of `size`.

Signature:

go
func Chunk[T any](slice []T, size int) [][]T
func Chunk[T any](slice []T, size int) [][]T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arr := []string{"a", "b", "c", "d", "e"}
+
+    result1 := slice.Chunk(arr, 1)
+    result2 := slice.Chunk(arr, 2)
+    result3 := slice.Chunk(arr, 3)
+    result4 := slice.Chunk(arr, 4)
+    result5 := slice.Chunk(arr, 5)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [[a] [b] [c] [d] [e]]
+    // [[a b] [c d] [e]]
+    // [[a b c] [d e]]
+    // [[a b c d] [e]]
+    // [[a b c d e]]
+}

Compact

Creates an slice with all falsey values removed. The values false, nil, 0, and "" are falsey.

Signature:

go
func Compact[T comparable](slice []T) []T
func Compact[T comparable](slice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Compact([]int{0})
+    result2 := slice.Compact([]int{0, 1, 2, 3})
+    result3 := slice.Compact([]string{"", "a", "b", "0"})
+    result4 := slice.Compact([]bool{false, true, true})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // []
+    // [1 2 3]
+    // [a b 0]
+    // [true true]
+}

Concat

Creates a new slice concatenating slice with any additional slices.

Signature:

go
func Concat[T any](slice []T, slices ...[]T) []T
func Concat[T any](slice []T, slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Concat([]int{1, 2}, []int{3, 4})
+    result2 := slice.Concat([]string{"a", "b"}, []string{"c"}, []string{"d"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [1 2 3 4]
+    // [a b c d]
+}

Count

Returns the number of occurrences of the given item in the slice.

Signature:

go
func Count[T comparable](slice []T, item T) int
func Count[T comparable](slice []T, item T) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 3, 4}
+
+    result1 := slice.Count(nums, 1)
+    result2 := slice.Count(nums, 3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // 2
+}

CountBy

Iterates over elements of slice with predicate function, returns the number of all matched elements.

Signature:

go
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int
func CountBy[T any](slice []T, predicate func(index int, item T) bool) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.CountBy(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // 2
+}

Difference

Creates an slice of whose element not included in the other given slice.

Signature:

go
func Difference[T comparable](slice, comparedSlice []T) []T
func Difference[T comparable](slice, comparedSlice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6}
+
+    result := slice.Difference(s1, s2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

DifferenceBy

DifferenceBy accepts iteratee func which is invoked for each element of slice and values to generate the criterion by which they're compared.

Signature:

go
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T
func DifferenceBy[T comparable](slice []T, comparedSlice []T, iteratee func(index int, item T) T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{3, 4, 5}
+
+    addOne := func(i int, v int) int {
+        return v + 1
+    }
+
+    result := slice.DifferenceBy(s1, s2, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2]
+}

DifferenceWith

DifferenceWith accepts comparator which is invoked to compare elements of slice to values. The order and references of result values are determined by the first slice.

Signature:

go
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T
func DifferenceWith[T any](slice []T, comparedSlice []T, comparator func(value, otherValue T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3, 4, 5}
+    s2 := []int{4, 5, 6, 7, 8}
+
+    isDouble := func(v1, v2 int) bool {
+        return v2 == 2*v1
+    }
+
+    result := slice.DifferenceWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 5]
+}

DeleteAt

Delete the element of slice from start index to end index - 1.

Signature:

go
func DeleteAt[T any](slice []T, start int, end ...int)
func DeleteAt[T any](slice []T, start int, end ...int)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DeleteAt([]string{"a", "b", "c"}, -1)
+    result2 := slice.DeleteAt([]string{"a", "b", "c"}, 0)
+    result3 := slice.DeleteAt([]string{"a", "b", "c"}, 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [c]
+}

Drop

Drop n elements from the start of a slice.

Signature:

go
func Drop[T any](slice []T, n int) []T
func Drop[T any](slice []T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.Drop([]string{"a", "b", "c"}, 0)
+    result2 := slice.Drop([]string{"a", "b", "c"}, 1)
+    result3 := slice.Drop([]string{"a", "b", "c"}, -1)
+    result4 := slice.Drop([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [b c]
+    // [a b c]
+    // []
+}

DropRight

Drop n elements from the end of a slice.

Signature:

go
func DropRight[T any](slice []T, n int) []T
func DropRight[T any](slice []T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropRight([]string{"a", "b", "c"}, 0)
+    result2 := slice.DropRight([]string{"a", "b", "c"}, 1)
+    result3 := slice.DropRight([]string{"a", "b", "c"}, -1)
+    result4 := slice.DropRight([]string{"a", "b", "c"}, 4)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // [a b c]
+    // [a b]
+    // [a b c]
+    // []
+}

DropWhile

Drop n elements from the start of a slice while predicate function returns true.

Signature:

go
func DropWhile[T any](slice []T, predicate func(item T) bool) []T
func DropWhile[T any](slice []T, predicate func(item T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.DropWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [2 3 4 5]
+    // []
+    // [1 2 3 4 5]
+}

DropRightWhile

Drop n elements from the end of a slice while predicate function returns true.

Signature:

go
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T
func DropRightWhile[T any](slice []T, predicate func(item T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n != 2
+    })
+    result2 := slice.DropRightWhile(numbers, func(n int) bool {
+        return true
+    })
+    result3 := slice.DropRightWhile(numbers, func(n int) bool {
+        return n == 0
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // [1 2]
+    // []
+    // [1 2 3 4 5]
+}

Equal

Check if two slices are equal: the same length and all elements' order and value are equal.

Signature:

go
func Equal[T comparable](slice1, slice2 []T) bool
func Equal[T comparable](slice1, slice2 []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{1, 2, 3}
+    s3 := []int{1, 3, 2}
+
+    result1 := slice.Equal(s1, s2)
+    result2 := slice.Equal(s1, s3)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

EqualWith

Check if two slices are equal with comparator func.

Signature:

go
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool
func EqualWith[T, U any](slice1 []T, slice2 []U, comparator func(T, U) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    s1 := []int{1, 2, 3}
+    s2 := []int{2, 4, 6}
+
+    isDouble := func(a, b int) bool {
+        return b == a*2
+    }
+
+    result := slice.EqualWith(s1, s2, isDouble)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

Every

Return true if all of the values in the slice pass the predicate function.

Signature:

go
func Every[T any](slice []T, predicate func(index int, item T) bool) bool
func Every[T any](slice []T, predicate func(index int, item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Every(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // false
+}

Filter

Return all elements which match the function.

Signature:

go
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T
func Filter[T any](slice []T, predicate func(index int, item T) bool) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Filter(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 4]
+}

Find(deprecated: use FindBy)

Iterates over elements of slice, returning the first one that passes a truth test on function.

Signature:

go
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func Find[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.Find(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindBy

Iterates over elements of slice, returning the first one that passes a truth test on predicate function.If return T is nil or zero value then no items matched the predicate func. In contrast to Find or FindLast, its return value no longer requires dereferencing.

Signature:

go
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 2
+    // true
+}

FindLast(deprecated: use FindLastBy)

iterates over elements of slice from end to begin, returning the last one that passes a truth test on function.

Signature:

go
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)
func FindLast[T any](slice []T, predicate func(index int, item T) bool) (*T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLast(nums, isEven)
+
+    fmt.Println(*result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

FindLastBy

FindLastBy iterates over elements of slice, returning the last one that passes a truth test on predicate function. If return T is nil or zero value then no items matched the predicate func. In contrast to Find or FindLast, its return value no longer requires dereferencing.

Signature:

go
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)
func FindLastBy[T any](slice []T, predicate func(index int, item T) bool) (v T, ok bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result, ok := slice.FindLastBy(nums, isEven)
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Flatten

Flatten slice with one level.

Signature:

go
func Flatten(slice any) any
func Flatten(slice any) any

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.Flatten(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [[a b] [c d]]
+}

FlattenDeep

flattens slice recursive.

Signature:

go
func FlattenDeep(slice any) any
func FlattenDeep(slice any) any

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    arrs := [][][]string{{{"a", "b"}}, {{"c", "d"}}}
+
+    result := slice.FlattenDeep(arrs)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c d]
+}

ForEach

Iterates over elements of slice and invokes function for each element.

Signature:

go
func ForEach[T any](slice []T, iteratee func(index int, item T))
func ForEach[T any](slice []T, iteratee func(index int, item T))

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    var result []int
+    addOne := func(_ int, v int) {
+        result = append(result, v+1)
+    }
+
+    slice.ForEach(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

ForEachWithBreak

Iterates over elements of slice and invokes function for each element, when iteratee return false, will break the for each loop.

Signature:

go
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)
func ForEachWithBreak[T any](slice []T, iteratee func(index int, item T) bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 2, 3, 4, 5}
+
+    var sum int
+
+    slice.ForEachWithBreak(numbers, func(_, n int) bool {
+        if n > 3 {
+            return false
+        }
+        sum += n
+        return true
+    })
+
+    fmt.Println(sum)
+
+    // Output:
+    // 6
+}

GroupBy

Iterates over elements of the slice, each element will be group by criteria, returns two slices.

Signature:

go
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)
func GroupBy[T any](slice []T, groupFn func(index int, item T) bool) ([]T, []T)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    even, odd := slice.GroupBy(nums, isEven)
+
+    fmt.Println(even)
+    fmt.Println(odd)
+
+    // Output:
+    // [2 4]
+    // [1 3 5]
+}

GroupWith

Return a map composed of keys generated from the results of running each element of slice thru iteratee.

Signature:

go
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T
func GroupWith[T any, U comparable](slice []T, iteratee func(T) U) map[U][]T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []float64{6.1, 4.2, 6.3}
+
+    floor := func(num float64) float64 {
+        return math.Floor(num)
+    }
+
+    result := slice.GroupWith(nums, floor) //map[float64][]float64
+
+    fmt.Println(result)
+
+    // Output:
+    // map[4:[4.2] 6:[6.1 6.3]]
+}

IntSlice (Deprecated: use generic feature of go1.18+ for replacement)

Convert interface slice to int slice.

Signature:

go
func IntSlice(slice any) []int
func IntSlice(slice any) []int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []interface{}{1, 2, 3}
+
+    result := slice.IntSlice(nums) //[]int{1, 2, 3}
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3]
+}

InterfaceSlice (Deprecated: use generic feature of go1.18+ for replacement)

Convert value to interface slice.

Signature:

go
func InterfaceSlice(slice any) []any
func InterfaceSlice(slice any) []any

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c"}
+
+    result := slice.InterfaceSlice(strs) //[]interface{}{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

Intersection

Creates a slice of unique values that included by all slices.

Signature:

go
func Intersection[T comparable](slices ...[]T) []T
func Intersection[T comparable](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{2, 3, 4}
+
+    result := slice.Intersection(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3]
+}

InsertAt

insert the element into slice at index.

Signature:

go
func InsertAt[T any](slice []T, index int, value any) []T
func InsertAt[T any](slice []T, index int, value any) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.InsertAt([]string{"a", "b", "c"}, 0, "1")
+    result2 := slice.InsertAt([]string{"a", "b", "c"}, 1, "1")
+    result3 := slice.InsertAt([]string{"a", "b", "c"}, 2, "1")
+    result4 := slice.InsertAt([]string{"a", "b", "c"}, 3, "1")
+    result5 := slice.InsertAt([]string{"a", "b", "c"}, 0, []string{"1", "2", "3"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [1 a b c]
+    // [a 1 b c]
+    // [a b 1 c]
+    // [a b c 1]
+    // [1 2 3 a b c]
+}

IndexOf

Returns the index at which the first occurrence of a item is found in a slice or return -1 if the item cannot be found.

Signature:

go
func IndexOf[T comparable](slice []T, item T) int
func IndexOf[T comparable](slice []T, item T) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.IndexOf(strs, "a")
+    result2 := slice.IndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 0
+    // -1
+}

LastIndexOf

Returns the index at which the last occurrence of a item is found in a slice or return -1 if the item cannot be found.

Signature:

go
func LastIndexOf[T comparable](slice []T, item T) int
func LastIndexOf[T comparable](slice []T, item T) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "a", "b", "c"}
+
+    result1 := slice.LastIndexOf(strs, "a")
+    result2 := slice.LastIndexOf(strs, "d")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1
+    // -1
+}

Map

Creates an slice of values by running each element in slice thru function.

Signature:

go
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U
func Map[T any, U any](slice []T, iteratee func(index int, item T) U) []U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    addOne := func(_ int, v int) int {
+        return v + 1
+    }
+
+    result := slice.Map(nums, addOne)
+
+    fmt.Println(result)
+
+    // Output:
+    // [2 3 4]
+}

FilterMap

Returns a slice which apply both filtering and mapping to the given slice. iteratee callback function should returntwo values: 1, mapping result. 2, whether the result element should be included or not.

Signature:

go
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U
func FilterMap[T any, U any](slice []T, iteratee func(index int, item T) (U, bool)) []U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    getEvenNumStr := func(i, num int) (string, bool) {
+        if num%2 == 0 {
+            return strconv.FormatInt(int64(num), 10), true
+        }
+        return "", false
+    }
+
+    result := slice.FilterMap(nums, getEvenNumStr)
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"2", "4"}
+}

FlatMap

Manipulates a slice and transforms and flattens it to a slice of another type.

Signature:

go
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U
func FlatMap[T any, U any](slice []T, iteratee func(index int, item T) []U) []U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    result := slice.FlatMap(nums, func(i int, num int) []string {
+        s := "hi-" + strconv.FormatInt(int64(num), 10)
+        return []string{s}
+    })
+
+    fmt.Printf("%#v", result)
+
+    // Output:
+    // []string{"hi-1", "hi-2", "hi-3", "hi-4"}
+}

Merge

Merge all given slices into one slice.

Signature:

go
func Merge[T any](slices ...[]T) []T
func Merge[T any](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{3, 4}
+
+    result := slice.Merge(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 3 3 4]
+}

Reverse

Reverse the elements order in slice.

Signature:

go
func Reverse[T any](slice []T)
func Reverse[T any](slice []T)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "d"}
+
+    slice.Reverse(strs)
+
+    fmt.Println(strs)
+
+    // Output:
+    // [d c b a]
+}

Reduce

Reduce slice.(Deprecated: use ReduceBy)

Signature:

go
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T
func Reduce[T any](slice []T, iteratee func(index int, item1, item2 T) T, initial T) T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3}
+
+    sum := func(_ int, v1, v2 int) int {
+        return v1 + v2
+    }
+
+    result := slice.Reduce(nums, sum, 0)
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

ReduceBy

Produces a value from slice by accumulating the result of each element as passed through the reducer function.

Signature:

go
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceBy[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.ReduceBy([]int{1, 2, 3, 4}, 0, func(_ int, item int, agg int) int {
+        return agg + item
+    })
+
+    result2 := slice.ReduceBy([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 10
+    // 1234
+}

ReduceRight

ReduceRight is like ReduceBy, but it iterates over elements of slice from right to left.

Signature:

go
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U
func ReduceRight[T any, U any](slice []T, initial U, reducer func(index int, item T, agg U) U) U

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReduceRight([]int{1, 2, 3, 4}, "", func(_ int, item int, agg string) string {
+        return agg + fmt.Sprintf("%v", item)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 4321
+}

Replace

Returns a copy of the slice with the first n non-overlapping instances of old replaced by new.

Signature:

go
func Replace[T comparable](slice []T, old T, new T, n int) []T
func Replace[T comparable](slice []T, old T, new T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []string{"a", "b", "c", "a"}
+
+    result1 := slice.Replace(strs, "a", "x", 0)
+    result2 := slice.Replace(strs, "a", "x", 1)
+    result3 := slice.Replace(strs, "a", "x", 2)
+    result4 := slice.Replace(strs, "a", "x", 3)
+    result5 := slice.Replace(strs, "a", "x", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c a]
+    // [x b c a]
+    // [x b c x]
+    // [x b c x]
+    // [x b c x]
+}

ReplaceAll

Returns a copy of the slice with the first n non-overlapping instances of old replaced by new.

Signature:

go
func ReplaceAll[T comparable](slice []T, old T, new T) []T
func ReplaceAll[T comparable](slice []T, old T, new T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ReplaceAll([]string{"a", "b", "c", "a"}, "a", "x")
+
+    fmt.Println(result)
+
+    // Output:
+    // [x b c x]
+}

Repeat

Creates a slice with length n whose elements are passed param item.

Signature:

go
func Repeat[T any](item T, n int) []T
func Repeat[T any](item T, n int) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Repeat("a", 3)
+
+    fmt.Println(result)
+
+    // Output:
+    // [a a a]
+}

Shuffle

Creates an slice of shuffled values.

Signature:

go
func Shuffle[T any](slice []T) []T
func Shuffle[T any](slice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+    result := slice.Shuffle(nums)
+
+    fmt.Println(res)
+
+    // Output:
+    // [3 1 5 4 2] (random order)
+}

IsAscending

Checks if a slice is ascending order.

Signature:

go
func IsAscending[T constraints.Ordered](slice []T) bool
func IsAscending[T constraints.Ordered](slice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsAscending([]int{1, 2, 3, 4, 5})
+    result2 := slice.IsAscending([]int{5, 4, 3, 2, 1})
+    result3 := slice.IsAscending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsDescending

Checks if a slice is descending order.

Signature:

go
func IsDescending[T constraints.Ordered](slice []T) bool
func IsDescending[T constraints.Ordered](slice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsDescending([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsDescending([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsDescending([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsSorted

Checks if a slice is sorted (ascending or descending).

Signature:

go
func IsSorted[T constraints.Ordered](slice []T) bool
func IsSorted[T constraints.Ordered](slice []T) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSorted([]int{5, 4, 3, 2, 1})
+    result2 := slice.IsSorted([]int{1, 2, 3, 4, 5})
+    result3 := slice.IsSorted([]int{2, 1, 3, 4, 5})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsSortedByKey

Checks if a slice is sorted by iteratee function.

Signature:

go
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool
func IsSortedByKey[T any, K constraints.Ordered](slice []T, iteratee func(item T) K) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.IsSortedByKey([]string{"a", "ab", "abc"}, func(s string) int {
+        return len(s)
+    })
+    result2 := slice.IsSortedByKey([]string{"abc", "ab", "a"}, func(s string) int {
+        return len(s)
+    })
+    result3 := slice.IsSortedByKey([]string{"abc", "a", "ab"}, func(s string) int {
+        return len(s)
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

Sort

Sorts a slice of any ordered type(number or string), use quick sort algrithm. Default sort order is ascending (asc), if want descending order, set param `sortOrder` to `desc`. Ordered type: number(all ints uints floats) or string.

Signature:

go
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)
func Sort[T constraints.Ordered](slice []T, sortOrder ...string)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.Sort(numbers)
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    slice.Sort(numbers, "desc")
+    fmt.Println(numbers) // [5 4 3 2 1]
+
+    strings := []string{"a", "d", "c", "b", "e"}
+
+    slice.Sort(strings)
+    fmt.Println(strings) //[a b c d e}
+
+    slice.Sort(strings, "desc")
+    fmt.Println(strings) //[e d c b a]
+}

SortBy

Sorts the slice in ascending order as determined by the less function. This sort is not guaranteed to be stable.

Signature:

go
func SortBy[T any](slice []T, less func(a, b T) bool)
func SortBy[T any](slice []T, less func(a, b T) bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    numbers := []int{1, 4, 3, 2, 5}
+
+    slice.SortBy(numbers, func(a, b int) bool {
+        return a < b
+    })
+    fmt.Println(numbers) // [1 2 3 4 5]
+
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    slice.SortBy(users, func(a, b User) bool {
+        return a.Age < b.Age
+    })
+
+    fmt.Printf("sort users by age: %v", users)
+
+    // output
+    // [{b 15} {a 21} {c 100}]
+}

SortByField (Deprecated: use Sort and SortBy for replacement)

Sort struct slice by field. Slice element should be struct, field type should be int, uint, string, or bool. Default sort type is ascending (asc), if descending order, set sortType to desc.

Signature:

go
func SortByField(slice any, field string, sortType ...string) error
func SortByField(slice any, field string, sortType ...string) error

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    type User struct {
+        Name string
+        Age  uint
+    }
+
+    users := []User{
+        {Name: "a", Age: 21},
+        {Name: "b", Age: 15},
+        {Name: "c", Age: 100}}
+
+    err := slice.SortByField(users, "Age", "desc")
+    if err != nil {
+        return
+    }
+
+    fmt.Println(users)
+
+    // Output:
+    // [{c 100} {a 21} {b 15}]
+}

Some

Return true if any of the values in the list pass the predicate function.

Signature:

go
func Some[T any](slice []T, predicate func(index int, item T) bool) bool
func Some[T any](slice []T, predicate func(index int, item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 5}
+
+    isEven := func(i, num int) bool {
+        return num%2 == 0
+    }
+
+    result := slice.Some(nums, isEven)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

StringSlice (Deprecated: use generic feature of go1.18+ for replacement)

Convert interface slice to string slice.

Signature:

go
func StringSlice(slice any) []string
func StringSlice(slice any) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    strs := []interface{}{"a", "b", "c"}
+
+    result := slice.StringSlice(strs) //[]string{"a", "b", "c"}
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

SymmetricDifference

Create a slice whose element is in given slices, but not in both slices.

Signature:

go
func SymmetricDifference[T comparable](slices ...[]T) []T
func SymmetricDifference[T comparable](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 2, 3}
+    nums2 := []int{1, 2, 4}
+
+    result := slice.SymmetricDifference(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

ToSlice

Creates a slice of give items.

Signature:

go
func ToSlice[T any](items ...T) []T
func ToSlice[T any](items ...T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.ToSlice("a", "b", "c")
+
+    fmt.Println(result)
+
+    // Output:
+    // [a b c]
+}

ToSlicePointer

Returns a pointer to the slices of a variable parameter transformation

Signature:

go
func ToSlicePointer[T any](items ...T) []*T
func ToSlicePointer[T any](items ...T) []*T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    str1 := "a"
+    str2 := "b"
+
+    result := slice.ToSlicePointer(str1, str2)
+
+    expect := []*string{&str1, &str2}
+
+    isEqual := reflect.DeepEqual(result, expect)
+
+    fmt.Println(isEqual)
+
+    // Output:
+    // true
+}

Unique

Remove duplicate elements in slice.

Signature:

go
func Unique[T comparable](slice []T) []T
func Unique[T comparable](slice []T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Unique([]string{"a", "a", "b"})
+    fmt.Println(result)
+
+    // Output:
+    // [a b]
+}

UniqueBy

Call iteratee func with every item of slice, then remove duplicated.

Signature:

go
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T
func UniqueBy[T comparable](slice []T, iteratee func(item T) T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5, 6}
+    result := slice.UniqueBy(nums, func(val int) int {
+        return val % 3
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 0]
+}

Union

Creates a slice of unique values, in order, from all given slices. using == for equality comparisons.

Signature:

go
func Union[T comparable](slices ...[]T) []T
func Union[T comparable](slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums1 := []int{1, 3, 4, 6}
+    nums2 := []int{1, 2, 5, 6}
+
+    result := slice.Union(nums1, nums2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 3 4 6 2 5]
+}

UnionBy

UnionBy is like Union, what's more it accepts iteratee which is invoked for each element of each slice.

Signature:

go
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T
func UnionBy[T any, V comparable](predicate func(item T) V, slices ...[]T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4}
+
+    divideTwo := func(n int) int {
+        return n / 2
+    }
+    result := slice.UnionBy(divideTwo, nums)
+
+    fmt.Println(result)
+
+    // Output:
+    // [1 2 4]
+}

UpdateAt

Update the slice element at index. if param index < 0 or index <= len(slice), will return error.

Signature:

go
func UpdateAt[T any](slice []T, index int, value T) []T
func UpdateAt[T any](slice []T, index int, value T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result1 := slice.UpdateAt([]string{"a", "b", "c"}, -1, "1")
+    result2 := slice.UpdateAt([]string{"a", "b", "c"}, 0, "1")
+    result3 := slice.UpdateAt([]string{"a", "b", "c"}, 1, "1")
+    result4 := slice.UpdateAt([]string{"a", "b", "c"}, 2, "1")
+    result5 := slice.UpdateAt([]string{"a", "b", "c"}, 3, "1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // [a b c]
+    // [1 b c]
+    // [a 1 c]
+    // [a b 1]
+    // [a b c]
+}

Without

Creates a slice excluding all given items.

Signature:

go
func Without[T comparable](slice []T, items ...T) []T
func Without[T comparable](slice []T, items ...T) []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.Without([]int{1, 2, 3, 4}, 1, 2)
+
+    fmt.Println(result)
+
+    // Output:
+    // [3 4]
+}

KeyBy

Converts a slice to a map based on a callback function.

Signature:

go
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T
func KeyBy[T any, U comparable](slice []T, iteratee func(item T) U) map[U]T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    result := slice.KeyBy([]string{"a", "ab", "abc"}, func(str string) int {
+        return len(str)
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // map[1:a 2:ab 3:abc]
+}

Join

Join the slice item with specify separator.

Signature:

go
func Join[T any](s []T, separator string) string
func Join[T any](s []T, separator string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/slice"
+)
+
+func main() {
+    nums := []int{1, 2, 3, 4, 5}
+
+    result1 := slice.Join(nums, ",")
+    result2 := slice.Join(nums, "-")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // 1,2,3,4,5
+    // 1-2-3-4-5
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/stream.html b/docs/.vitepress/dist/en/api/packages/stream.html new file mode 100644 index 0000000..7640078 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/stream.html @@ -0,0 +1,972 @@ + + + + + + Stream | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Stream

Package stream implements a sequence of elements supporting sequential and operations. This package is an experiment to explore if stream in go can work as the way java does. it's feature is very limited.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/stream"
+)
import (
+    "github.com/duke-git/lancet/v2/stream"
+)

Index

Documentation

Of

Creates a stream whose elements are the specified values.

Signature:

go
func Of[T any](elems ...T) stream[T]
func Of[T any](elems ...T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromSlice

Creates a stream from slice.

Signature:

go
func FromSlice[T any](source []T) stream[T]
func FromSlice[T any](source []T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromSlice([]int{1, 2, 3})
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromChannel

Creates a stream from channel.

Signature:

go
func FromChannel[T any](source <-chan T) stream[T]
func FromChannel[T any](source <-chan T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    ch := make(chan int)
+    go func() {
+        for i := 1; i < 4; i++ {
+            ch <- i
+        }
+        close(ch)
+    }()
+
+    s := stream.FromChannel(ch)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

FromRange

Creates a number stream from start to end. both start and end are included. [start, end]

Signature:

go
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]
func FromRange[T constraints.Integer | constraints.Float](start, end, step T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.FromRange(1, 5, 1)
+
+    data := s.ToSlice()
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5]
+}

Generate

Creates a stream where each element is generated by the provided generater function.

Signature:

go
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]
func Generate[T any](generator func() func() (item T, ok bool)) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    n := 0
+    max := 4
+
+    generator := func() func() (int, bool) {
+        return func() (int, bool) {
+            n++
+            return n, n < max
+        }
+    }
+
+    s := stream.Generate(generator)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

Concat

Creates a lazily concatenated stream whose elements are all the elements of the first stream followed by all the elements of the second stream.

Signature:

go
func Concat[T any](a, b stream[T]) stream[T]
func Concat[T any](a, b stream[T]) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{4, 5, 6})
+
+    s := Concat(s1, s2)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3 4 5 6]
+}

Distinct

Creates returns a stream that removes the duplicated items. Support chainable operation

Signature:

go
func (s stream[T]) Distinct() stream[T]
func (s stream[T]) Distinct() stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 2, 3, 3, 3})
+    distinct := original.Distinct()
+
+    data1 := original.ToSlice()
+    data2 := distinct.ToSlice()
+
+    fmt.Println(data1)
+    fmt.Println(data2)
+
+    // Output:
+    // [1 2 2 3 3 3]
+    // [1 2 3]
+}

Filter

Returns a stream consisting of the elements of this stream that match the given predicate. Support chainable operation

Signature:

go
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]
func (s stream[T]) Filter(predicate func(item T) bool) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4, 5})
+
+    isEven := func(n int) bool {
+        return n%2 == 0
+    }
+
+    even := original.Filter(isEven)
+
+    fmt.Println(even.ToSlice())
+
+    // Output:
+    // [2 4]
+}

Map

Returns a stream consisting of the elements of this stream that apply the given function to elements of stream. Support chainable operation

Signature:

go
func (s stream[T]) Map(mapper func(item T) T) stream[T]
func (s stream[T]) Map(mapper func(item T) T) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    addOne := func(n int) int {
+        return n + 1
+    }
+
+    increament := original.Map(addOne)
+
+    fmt.Println(increament.ToSlice())
+
+    // Output:
+    // [2 3 4]
+}

Peek

Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream. Support chainable operation

Signature:

go
func (s stream[T]) Peek(consumer func(item T)) stream[T]
func (s stream[T]) Peek(consumer func(item T)) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    data := []string{}
+    peekStream := original.Peek(func(n int) {
+        data = append(data, fmt.Sprint("value", n))
+    })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(peekStream.ToSlice())
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+    // [1 2 3]
+    // [value1 value2 value3]
+}

Skip

Returns a stream consisting of the remaining elements of this stream after discarding the first n elements of the stream. If this stream contains fewer than n elements then an empty stream will be returned. Support chainable operation

Signature:

go
func (s stream[T]) Skip(n int) stream[T]
func (s stream[T]) Skip(n int) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Skip(-1)
+    s2 := original.Skip(0)
+    s3 := original.Skip(1)
+    s4 := original.Skip(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // [1 2 3 4]
+    // [1 2 3 4]
+    // [2 3 4]
+    // []
+}

Limit

Returns a stream consisting of the elements of this stream, truncated to be no longer than maxSize in length. Support chainable operation

Signature:

go
func (s stream[T]) Limit(maxSize int) stream[T]
func (s stream[T]) Limit(maxSize int) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3, 4})
+
+    s1 := original.Limit(-1)
+    s2 := original.Limit(0)
+    s3 := original.Limit(1)
+    s4 := original.Limit(5)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // []
+    // [1]
+    // [1 2 3 4]
+}

Reverse

Returns a stream whose elements are reverse order of given stream. Support chainable operation

Signature:

go
func (s stream[T]) Reverse() stream[T]
func (s stream[T]) Reverse() stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    reverse := original.Reverse()
+
+    fmt.Println(reverse.ToSlice())
+
+    // Output:
+    // [3 2 1]
+}

Range

Returns a stream whose elements are in the range from start(included) to end(excluded) original stream.Support chainable operation

Signature:

go
func (s stream[T]) Range(start, end int) stream[T]
func (s stream[T]) Range(start, end int) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    s1 := original.Range(0, 0)
+    s2 := original.Range(0, 1)
+    s3 := original.Range(0, 3)
+    s4 := original.Range(1, 2)
+
+    fmt.Println(s1.ToSlice())
+    fmt.Println(s2.ToSlice())
+    fmt.Println(s3.ToSlice())
+    fmt.Println(s4.ToSlice())
+
+    // Output:
+    // []
+    // [1]
+    // [1 2 3]
+    // [2]
+}

Sorted

Returns a stream consisting of the elements of this stream, sorted according to the provided less function.Support chainable operation

Signature:

go
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]
func (s stream[T]) Sorted(less func(a, b T) bool) stream[T]

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    sorted := original.Sorted(func(a, b int) bool { return a < b })
+
+    fmt.Println(original.ToSlice())
+    fmt.Println(sorted.ToSlice())
+
+    // Output:
+    // [4 2 1 3]
+    // [1 2 3 4]
+}

ForEach

Performs an action for each element of this stream.

Signature:

go
func (s stream[T]) ForEach(action func(item T))
func (s stream[T]) ForEach(action func(item T))

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := 0
+    original.ForEach(func(item int) {
+        result += item
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

Reduce

Performs a reduction on the elements of this stream, using an associative accumulation function, and returns an Optional describing the reduced value, if any.

Signature:

go
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T
func (s stream[T]) Reduce(initial T, accumulator func(a, b T) T) T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result := original.Reduce(0, func(a, b int) int {
+        return a + b
+    })
+
+    fmt.Println(result)
+
+    // Output:
+    // 6
+}

FindFirst

Returns the first element of this stream and true, or zero value and false if the stream is empty.

Signature:

go
func (s stream[T]) FindFirst() (T, bool)
func (s stream[T]) FindFirst() (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result, ok := original.FindFirst()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

FindLast

Returns the last element of this stream and true, or zero value and false if the stream is empty.

Signature:

go
func (s stream[T]) FindLast() (T, bool)
func (s stream[T]) FindLast() (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{3, 2, 1})
+
+    result, ok := original.FindLast()
+
+    fmt.Println(result)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

Max

Returns the maximum element of this stream according to the provided less function. less fuction: a > b

Signature:

go
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)
func (s stream[T]) Max(less func(a, b T) bool) (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    max, ok := original.Max(func(a, b int) bool { return a > b })
+
+    fmt.Println(max)
+    fmt.Println(ok)
+
+    // Output:
+    // 4
+    // true
+}

Min

Returns the minimum element of this stream according to the provided less function. less fuction: a < b

Signature:

go
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)
func (s stream[T]) Min(less func(a, b T) bool) (T, bool)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{4, 2, 1, 3})
+
+    min, ok := original.Min(func(a, b int) bool { return a < b })
+
+    fmt.Println(min)
+    fmt.Println(ok)
+
+    // Output:
+    // 1
+    // true
+}

AllMatch

Returns whether all elements of this stream match the provided predicate.

Signature:

go
func (s stream[T]) AllMatch(predicate func(item T) bool) bool
func (s stream[T]) AllMatch(predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AllMatch(func(item int) bool {
+        return item > 0
+    })
+
+    result2 := original.AllMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

AnyMatch

Returns whether any elements of this stream match the provided predicate.

Signature:

go
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool
func (s stream[T]) AnyMatch(predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.AnyMatch(func(item int) bool {
+        return item > 1
+    })
+
+    result2 := original.AnyMatch(func(item int) bool {
+        return item > 3
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

NoneMatch

Returns whether no elements of this stream match the provided predicate.

Signature:

go
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool
func (s stream[T]) NoneMatch(predicate func(item T) bool) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    original := stream.FromSlice([]int{1, 2, 3})
+
+    result1 := original.NoneMatch(func(item int) bool {
+        return item > 3
+    })
+
+    result2 := original.NoneMatch(func(item int) bool {
+        return item > 1
+    })
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

Count

Returns the count of elements in the stream.

Signature:

go
func (s stream[T]) Count() int
func (s stream[T]) Count() int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s1 := stream.FromSlice([]int{1, 2, 3})
+    s2 := stream.FromSlice([]int{})
+
+    fmt.Println(s1.Count())
+    fmt.Println(s2.Count())
+
+    // Output:
+    // 3
+    // 0
+}

ToSlice

Returns the elements in the stream.

Signature:

go
func (s stream[T]) ToSlice() []T
func (s stream[T]) ToSlice() []T

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/stream"
+)
+
+func main() {
+    s := stream.Of(1, 2, 3)
+
+    data := s.ToSlice()
+
+    fmt.Println(data)
+
+    // Output:
+    // [1 2 3]
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/struct.html b/docs/.vitepress/dist/en/api/packages/struct.html new file mode 100644 index 0000000..27cc35f --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/struct.html @@ -0,0 +1,588 @@ + + + + + + Structs | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Structs

Struct is abstract struct for provide several high level functions

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/structs"
+)
import (
+    "github.com/duke-git/lancet/v2/structs"
+)

Index:

Documentation:

New

The constructor function of the `Struct`

Signature:

go
func New(value any, tagName ...string) *Struct
func New(value any, tagName ...string) *Struct

Example:

go
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}
package main
+
+import (
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    // to do something
+}

ToMap

convert a valid struct to a map

Signature:

go
func (s *Struct) ToMap() (map[string]any, error)
func (s *Struct) ToMap() (map[string]any, error)

In addition, provided a convenient static function ToMap

go
func ToMap(v any) (map[string]any, error)
func ToMap(v any) (map[string]any, error)

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    // use constructor function
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // use static function
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    // use constructor function
+    s1 := structs.New(p1)
+    m1, _ := s1.ToMap()
+
+    fmt.Println(m1)
+
+    // use static function
+    m2, _ := structs.ToMap(p1)
+
+    fmt.Println(m2)
+
+    // Output:
+    // map[name:11]
+    // map[name:11]
+}

Fields

Get all fields of a given struct, that the fields are abstract struct field

Signature:

go
func (s *Struct) Fields() []*Field
func (s *Struct) Fields() []*Field

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    fields := s.Fields()
+
+    fmt.Println(len(fields))
+
+    // Output:
+    // 1
+}

Field

Get an abstract field of a struct by given field name

Signature:

go
func (s *Struct) Field(name string) *Field
func (s *Struct) Field(name string) *Field

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+    f := s.Field("Name")
+
+    fmt.Println(f.Value())
+
+    // Output:
+    // 11
+}

IsStruct

Check if the struct is valid

Signature:

go
func (s *Struct) IsStruct() bool
func (s *Struct) IsStruct() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type People struct {
+        Name string `json:"name"`
+    }
+    p1 := &People{Name: "11"}
+    s := structs.New(p1)
+
+    fmt.Println(s.IsStruct())
+
+    // Output:
+    // true
+}

Tag

Get a `Tag` of the `Field`, `Tag` is a abstract struct field tag

Signature:

go
func (f *Field) Tag() *Tag
func (f *Field) Tag() *Tag

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+
+    // Output:
+    // name
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    tag := n.Tag()
+
+    fmt.Println(tag.Name)
+
+    // Output:
+    // name
+}

Value

Get the `Field` underlying value

Signature:

go
func (f *Field) Value() any
func (f *Field) Value() any

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+
+    fmt.Println(n.Value())
+
+    // Output:
+    // 111
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string `json:"name,omitempty"`
+    }
+    p1 := &Parent{"111"}
+
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+
+    fmt.Println(n.Value())
+
+    // Output:
+    // 111
+}

IsEmbedded

Check if the field is an embedded field

Signature:

go
func (f *Field) IsEmbedded() bool
func (f *Field) IsEmbedded() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+    }
+    type Child struct {
+        Parent
+        Age int
+    }
+    c1 := &Child{}
+    c1.Name = "111"
+    c1.Age = 11
+
+    s := structs.New(c1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsEmbedded())
+    fmt.Println(a.IsEmbedded())
+
+    // Output:
+    // true
+    // false
+}

IsExported

Check if the field is exported

Signature:

go
func (f *Field) IsExported() bool
func (f *Field) IsExported() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        age  int
+    }
+    p1 := &Parent{Name: "11", age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("age")
+
+    fmt.Println(n.IsExported())
+    fmt.Println(a.IsExported())
+
+    // Output:
+    // true
+    // false
+}

IsZero

Check if the field is zero value

Signature:

go
func (f *Field) IsZero() bool
func (f *Field) IsZero() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.IsZero())
+    fmt.Println(a.IsZero())
+
+    // Output:
+    // true
+    // false
+}

Name

Get the field name

Signature:

go
func (f *Field) Name() string
func (f *Field) Name() string

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+
+    // Output:
+    // Name
+    // Age
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Name())
+    fmt.Println(a.Name())
+
+    // Output:
+    // Name
+    // Age
+}

Kind

Get the field's kind

Signature:

go
func (f *Field) Kind() reflect.Kind
func (f *Field) Kind() reflect.Kind

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+
+    // Output:
+    // string
+    // int
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        Age  int
+    }
+    p1 := &Parent{Age: 11}
+    s := structs.New(p1)
+    n, _ := s.Field("Name")
+    a, _ := s.Field("Age")
+
+    fmt.Println(n.Kind())
+    fmt.Println(a.Kind())
+
+    // Output:
+    // string
+    // int
+}

IsSlice

Check if the field is a slice

Signature:

go
func (f *Field) IsSlice() bool
func (f *Field) IsSlice() bool

Example:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+
+    fmt.Println(a.IsSlice())
+
+    // Output:
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/structs"
+)
+
+func main() {
+    type Parent struct {
+        Name string
+        arr  []int
+    }
+
+    p1 := &Parent{arr: []int{1, 2, 3}}
+    s := structs.New(p1)
+    a, _ := s.Field("arr")
+
+    fmt.Println(a.IsSlice())
+
+    // Output:
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/strutil.html b/docs/.vitepress/dist/en/api/packages/strutil.html new file mode 100644 index 0000000..383fd90 --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/strutil.html @@ -0,0 +1,1568 @@ + + + + + + Strutil | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Strutil

Package strutil contains some functions to manipulate string.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)
import (
+    "github.com/duke-git/lancet/v2/strutil"
+)

Index

Documentation

After

Returns the substring after the first occurrence of a specified string in the source string.

Signature:

go
func After(s, char string) string
func After(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.After("foo", "")
+    result2 := strutil.After("foo", "foo")
+    result3 := strutil.After("foo/bar", "foo")
+    result4 := strutil.After("foo/bar", "/")
+    result5 := strutil.After("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // /bar
+    // bar
+    // bar/baz
+}

AfterLast

Returns the substring after the last occurrence of a specified string in the source string.

Signature:

go
func AfterLast(s, char string) string
func AfterLast(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.AfterLast("foo", "")
+    result2 := strutil.AfterLast("foo", "foo")
+    result3 := strutil.AfterLast("foo/bar", "/")
+    result4 := strutil.AfterLast("foo/bar/baz", "/")
+    result5 := strutil.AfterLast("foo/bar/foo/baz", "foo")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    //
+    // bar
+    // baz
+    // /baz
+}

Before

Returns the substring of the source string up to the first occurrence of the specified string.

Signature:

go
func Before(s, char string) string
func Before(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Before("foo", "")
+    result2 := strutil.Before("foo", "foo")
+    result3 := strutil.Before("foo/bar", "/")
+    result4 := strutil.Before("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo
+}

BeforeLast

Returns the substring of the source string up to the last occurrence of the specified string.

Signature:

go
func BeforeLast(s, char string) string
func BeforeLast(s, char string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.BeforeLast("foo", "")
+    result2 := strutil.BeforeLast("foo", "foo")
+    result3 := strutil.BeforeLast("foo/bar", "/")
+    result4 := strutil.BeforeLast("foo/bar/baz", "/")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    //
+    // foo
+    // foo/bar
+}

CamelCase

Coverts string to camelCase string, non letters and numbers will be ignored.

Signature:

go
func CamelCase(s string) string
func CamelCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foobar", "&FOO:BAR$BAZ", "$foo%", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.CamelCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foobar
+    // fooBarBaz
+    // foo
+    // foo11Bar
+}

KebabCase

KebabCase covert string to kebab-case, non letters and numbers will be ignored.

Signature:

go
func KebabCase(s string) string
func KebabCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.KebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo-bar
+    // foo-bar
+    // foobar
+    // foo-1-1-bar
+}

UpperKebabCase

UpperKebabCase covert string to upper KEBAB-CASE, non letters and numbers will be ignored.

Signature:

go
func UpperKebabCase(s string) string
func UpperKebabCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperKebabCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-BAR
+    // FOO-1-1-BAR
+}

Capitalize

Convert the first character of a string to upper case.

Signature:

go
func Capitalize(s string) string
func Capitalize(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "Foo", "_foo", "fooBar", "foo-bar"}
+
+    for _, v := range strings {
+        s := strutil.Capitalize(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Foo
+    // _foo
+    // Foobar
+    // Foo-bar
+}

IsString

Check if the value's data type is string.

Signature:

go
func IsString(v any) bool
func IsString(v any) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsString("")
+    result2 := strutil.IsString("a")
+    result3 := strutil.IsString(1)
+    result4 := strutil.IsString(true)
+    result5 := strutil.IsString([]string{"a"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+    // false
+}

LowerFirst

Convert the first character of string to lower case.

Signature:

go
func LowerFirst(s string) string
func LowerFirst(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "Bar大"}
+
+    for _, v := range strings {
+        s := strutil.LowerFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // bar
+    // bAr
+    // bar大
+}

UpperFirst

Convert the first character of string to upper case.

Signature:

go
func UpperFirst(s string) string
func UpperFirst(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "bar", "BAr", "bar大"}
+
+    for _, v := range strings {
+        s := strutil.UpperFirst(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // Bar
+    // BAr
+    // Bar大
+}

Pad

Pads string on the left and right side if it's shorter than size.

Signature:

go
func Pad(source string, size int, padStr string) string
func Pad(source string, size int, padStr string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Pad("foo", 1, "bar")
+    result2 := strutil.Pad("foo", 2, "bar")
+    result3 := strutil.Pad("foo", 3, "bar")
+    result4 := strutil.Pad("foo", 4, "bar")
+    result5 := strutil.Pad("foo", 5, "bar")
+    result6 := strutil.Pad("foo", 6, "bar")
+    result7 := strutil.Pad("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // bfoob
+    // bfooba
+    // bafooba
+}

PadEnd

Pads string on the right side if it's shorter than size.

Signature:

go
func PadEnd(source string, size int, padStr string) string
func PadEnd(source string, size int, padStr string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadEnd("foo", 1, "bar")
+    result2 := strutil.PadEnd("foo", 2, "bar")
+    result3 := strutil.PadEnd("foo", 3, "bar")
+    result4 := strutil.PadEnd("foo", 4, "bar")
+    result5 := strutil.PadEnd("foo", 5, "bar")
+    result6 := strutil.PadEnd("foo", 6, "bar")
+    result7 := strutil.PadEnd("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // foob
+    // fooba
+    // foobar
+    // foobarb
+}

PadStart

Pads string on the left side if it's shorter than size.

Signature:

go
func PadStart(source string, size int, padStr string) string
func PadStart(source string, size int, padStr string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.PadStart("foo", 1, "bar")
+    result2 := strutil.PadStart("foo", 2, "bar")
+    result3 := strutil.PadStart("foo", 3, "bar")
+    result4 := strutil.PadStart("foo", 4, "bar")
+    result5 := strutil.PadStart("foo", 5, "bar")
+    result6 := strutil.PadStart("foo", 6, "bar")
+    result7 := strutil.PadStart("foo", 7, "bar")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+    fmt.Println(result7)
+
+    // Output:
+    // foo
+    // foo
+    // foo
+    // bfoo
+    // bafoo
+    // barfoo
+    // barbfoo
+}

Reverse

Return string whose char order is reversed to the given string.

Signature:

go
func Reverse(s string) string
func Reverse(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "foo"
+    rs := strutil.Reverse(s)
+
+    fmt.Println(s)
+    fmt.Println(rs)
+
+    // Output:
+    // foo
+    // oof
+}

SnakeCase

Coverts string to snake_case, non letters and numbers will be ignored.

Signature:

go
func SnakeCase(s string) string
func SnakeCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FOOBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.SnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // foo_bar
+    // foo_bar
+    // foobar
+    // foo_1_1_bar
+}

UpperSnakeCase

Coverts string to upper KEBAB-CASE, non letters and numbers will be ignored.

Signature:

go
func UpperSnakeCase(s string) string
func UpperSnakeCase(s string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    strings := []string{"", "foo-bar", "Foo Bar-", "FooBAR", "Foo-#1😄$_%^&*(1bar"}
+
+    for _, v := range strings {
+        s := strutil.UpperSnakeCase(v)
+        fmt.Println(s)
+    }
+
+    // Output:
+    //
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_BAR
+    // FOO_1_1_BAR
+}

SplitEx

Split a given string whether the result contains empty string.

Signature:

go
func SplitEx(s, sep string, removeEmptyString bool) []string
func SplitEx(s, sep string, removeEmptyString bool) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitEx(" a b c ", "", true)
+
+    result2 := strutil.SplitEx(" a b c ", " ", false)
+    result3 := strutil.SplitEx(" a b c ", " ", true)
+
+    result4 := strutil.SplitEx("a = b = c = ", " = ", false)
+    result5 := strutil.SplitEx("a = b = c = ", " = ", true)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // []
+    // [ a b c ]
+    // [a b c]
+    // [a b c ]
+}

Substring

Returns a substring of the specified length starting at the specified offset position.

Signature:

go
func Substring(s string, offset int, length uint) string
func Substring(s string, offset int, length uint) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Substring("abcde", 1, 3)
+    result2 := strutil.Substring("abcde", 1, 5)
+    result3 := strutil.Substring("abcde", -1, 3)
+    result4 := strutil.Substring("abcde", -2, 2)
+    result5 := strutil.Substring("abcde", -2, 3)
+    result6 := strutil.Substring("你好,欢迎你", 0, 2)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // bcd
+    // bcde
+    // e
+    // de
+    // de
+    // 你好
+}

Wrap

Wrap a string with given string.

Signature:

go
func Wrap(str string, wrapWith string) string
func Wrap(str string, wrapWith string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Wrap("foo", "")
+    result2 := strutil.Wrap("foo", "*")
+    result3 := strutil.Wrap("'foo'", "'")
+    result4 := strutil.Wrap("", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // foo
+    // *foo*
+    // ''foo''
+    //
+}

Unwrap

Unwrap a given string from anther string. will change source string.

Signature:

go
func Unwrap(str string, wrapToken string) string
func Unwrap(str string, wrapToken string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Unwrap("foo", "")
+    result2 := strutil.Unwrap("*foo*", "*")
+    result3 := strutil.Unwrap("*foo", "*")
+    result4 := strutil.Unwrap("foo*", "*")
+    result5 := strutil.Unwrap("**foo**", "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // foo
+    // foo
+    // *foo
+    // foo*
+    // *foo*
+}

SplitWords

Splits a string into words, word only contains alphabetic characters.

Signature:

go
func SplitWords(s string) []string
func SplitWords(s string) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.SplitWords("a word")
+    result2 := strutil.SplitWords("I'am a programmer")
+    result3 := strutil.SplitWords("Bonjour, je suis programmeur")
+    result4 := strutil.SplitWords("a -b-c' 'd'e")
+    result5 := strutil.SplitWords("你好,我是一名码农")
+    result6 := strutil.SplitWords("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // [a word]
+    // [I'am a programmer]
+    // [Bonjour je suis programmeur]
+    // [a b-c' d'e]
+    // []
+    // []
+}

WordCount

Return the number of meaningful word, word only contains alphabetic characters.

Signature:

go
func WordCount(s string) int
func WordCount(s string) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.WordCount("a word")
+    result2 := strutil.WordCount("I'am a programmer")
+    result3 := strutil.WordCount("Bonjour, je suis programmeur")
+    result4 := strutil.WordCount("a -b-c' 'd'e")
+    result5 := strutil.WordCount("你好,我是一名码农")
+    result6 := strutil.WordCount("こんにちは,私はプログラマーです")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+    fmt.Println(result6)
+
+    // Output:
+    // 2
+    // 3
+    // 4
+    // 3
+    // 0
+    // 0
+}

RemoveNonPrintable

Remove non-printable characters from a string.

Signature:

go
func RemoveNonPrintable(str string) string
func RemoveNonPrintable(str string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\u00a0 \u200bworld\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.RemoveNonPrintable("hello\u00a0 \u200bworld\n")
+    result2 := strutil.RemoveNonPrintable("你好😄")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // hello world
+    // 你好😄
+}

StringToBytes

Converts a string to byte slice without a memory allocation.

Signature:

go
func StringToBytes(str string) (b []byte)
func StringToBytes(str string) (b []byte)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [97 98 99]
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.StringToBytes("abc")
+    result2 := reflect.DeepEqual(result1, []byte{'a', 'b', 'c'})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [97 98 99]
+    // true
+}

BytesToString

Converts a byte slice to string without a memory allocation.

Signature:

go
func BytesToString(bytes []byte) string
func BytesToString(bytes []byte) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    bytes := []byte{'a', 'b', 'c'}
+    result := strutil.BytesToString(bytes)
+
+    fmt.Println(result)
+
+    // Output:
+    // abc
+}

IsBlank

Checks if a string is whitespace or empty.

Signature:

go
func IsBlank(str string) bool
func IsBlank(str string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\t\v\f\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.IsBlank("")
+    result2 := strutil.IsBlank("\t\v\f\n")
+    result3 := strutil.IsBlank(" 中文")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

HasPrefixAny

Checks if a string starts with any of an array of specified strings.

Signature:

go
func HasPrefixAny(str string, prefixes []string) bool
func HasPrefixAny(str string, prefixes []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasPrefixAny("foo bar", []string{"fo", "xyz", "hello"})
+    result2 := strutil.HasPrefixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

HasSuffixAny

Checks if a string ends with any of an array of specified strings.

Signature:

go
func HasSuffixAny(str string, suffixes []string) bool
func HasSuffixAny(str string, suffixes []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.HasSuffixAny("foo bar", []string{"bar", "xyz", "hello"})
+    result2 := strutil.HasSuffixAny("foo bar", []string{"oom", "world"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IndexOffset

Returns the index of the first instance of substr in string after offsetting the string by `idxFrom`, or -1 if substr is not present in string.

Signature:

go
func IndexOffset(str string, substr string, idxFrom int) int
func IndexOffset(str string, substr string, idxFrom int) int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "foo bar hello world"
+
+    result1 := strutil.IndexOffset(str, "o", 5)
+    result2 := strutil.IndexOffset(str, "o", 0)
+    result3 := strutil.IndexOffset(str, "d", len(str)-1)
+    result4 := strutil.IndexOffset(str, "d", len(str))
+    result5 := strutil.IndexOffset(str, "f", -1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // 12
+    // 1
+    // 18
+    // -1
+    // -1
+}

ReplaceWithMap

Returns a copy of `str`, which is replaced by a map in unordered way, case-sensitively.

Signature:

go
func ReplaceWithMap(str string, replaces map[string]string) string
func ReplaceWithMap(str string, replaces map[string]string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "ac ab ab ac"
+    replaces := map[string]string{
+        "a": "1",
+        "b": "2",
+    }
+
+    result := strutil.ReplaceWithMap(str, replaces)
+
+    fmt.Println(result)
+    // Output:
+    // 1c 12 12 1c
+}

Trim

Strips whitespace (or other characters) from the beginning and end of a string. The optional parameter `characterMask` specifies the additional stripped characters.

Signature:

go
func Trim(str string, characterMask ...string) string
func Trim(str string, characterMask ...string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    result1 := strutil.Trim("\nabcd")
+
+    str := "$ ab    cd $ "
+
+    result2 := strutil.Trim(str)
+    result3 := strutil.Trim(str, "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // abcd
+    // $ ab    cd $
+    // ab    cd
+}

SplitAndTrim

Splits string `str` by a string `delimiter` to a slice, and calls Trim to every element of slice. It ignores the elements which are empty after Trim.

Signature:

go
func SplitAndTrim(str, delimiter string, characterMask ...string) []string
func SplitAndTrim(str, delimiter string, characterMask ...string) []string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " a,b, c,d,$1 "
+
+    result1 := strutil.SplitAndTrim(str, ",")
+    result2 := strutil.SplitAndTrim(str, ",", "$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // [a b c d $1]
+    // [a b c d 1]
+}

HideString

Hide some chars in source string with param `replaceChar`. replace range is origin[start : end]. [start, end).

Signature:

go
func HideString(origin string, start, end int, replaceChar string) string
func HideString(origin string, start, end int, replaceChar string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "13242658976"
+
+    result1 := strutil.HideString(str, 3, 3, "*")
+    result2 := strutil.HideString(str, 3, 4, "*")
+    result3 := strutil.HideString(str, 3, 7, "*")
+    result4 := strutil.HideString(str, 7, 11, "*")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // 13242658976
+    // 132*2658976
+    // 132****8976
+    // 1324265****
+}

ContainsAll

Return true if target string contains all the substrings.

Signature:

go
func ContainsAll(str string, substrs []string) bool
func ContainsAll(str string, substrs []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAll(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAll(str, []string{"hello", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

ContainsAny

Return true if target string contains any one of the substrings.

Signature:

go
func ContainsAny(str string, substrs []string) bool
func ContainsAny(str string, substrs []string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := "hello world"
+
+    result1 := strutil.ContainsAny(str, []string{"hello", "world"})
+    result2 := strutil.ContainsAny(str, []string{"hello", "abc"})
+    result3 := strutil.ContainsAny(str, []string{"123", "abc"})
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

RemoveWhiteSpace

Remove whitespace characters from a string. when set repalceAll is true removes all whitespace, false only replaces consecutive whitespace characters with one space.

Signature:

go
func RemoveWhiteSpace(str string, repalceAll bool) string
func RemoveWhiteSpace(str string, repalceAll bool) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \r\n    \t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    str := " hello   \r\n    \t   world"
+
+    result1 := strutil.RemoveWhiteSpace(str, true)
+    result2 := strutil.RemoveWhiteSpace(str, false)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // helloworld
+    // hello world
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/system.html b/docs/.vitepress/dist/en/api/packages/system.html new file mode 100644 index 0000000..3499bda --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/system.html @@ -0,0 +1,284 @@ + + + + + + System | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

System

Package system contains some functions about os, runtime, shell command.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/system"
+)
import (
+    "github.com/duke-git/lancet/v2/system"
+)

Index

Documentation

IsWindows

Check if current os is windows.

Signature:

go
func IsWindows() bool
func IsWindows() bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsWindows := system.IsWindows()
+    fmt.Println(isOsWindows)
+}

IsLinux

Check if current os is linux.

Signature:

go
func IsLinux() bool
func IsLinux() bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsLinux := system.IsLinux()
+    fmt.Println(isOsLinux)
+}

IsMac

Check if current os is macos.

Signature:

go
func IsMac() bool
func IsMac() bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    isOsMac := system.IsMac()
+    fmt.Println(isOsMac)
+}

GetOsEnv

Gets the value of the environment variable named by the key.

Signature:

go
func GetOsEnv(key string) string
func GetOsEnv(key string) string

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

SetOsEnv

Sets the value of the environment variable named by the key.

Signature:

go
func SetOsEnv(key, value string) error
func SetOsEnv(key, value string) error

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    result := system.GetOsEnv("foo")
+
+    fmt.Println(err)
+    fmt.Println(result)
+    // Output:
+    // <nil>
+    // abc
+}

RemoveOsEnv

Remove a single environment variable.

Signature:

go
func RemoveOsEnv(key string) error
func RemoveOsEnv(key string) error

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err1 := system.SetOsEnv("foo", "abc")
+    result1 := GetOsEnv("foo")
+
+    err2 := system.RemoveOsEnv("foo")
+    result2 := GetOsEnv("foo")
+
+    fmt.Println(err1)
+    fmt.Println(err2)
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // <nil>
+    // <nil>
+    // abc
+    //
+}

CompareOsEnv

Get env named by the key and compare it with comparedEnv.

Signature:

go
func CompareOsEnv(key, comparedEnv string) bool
func CompareOsEnv(key, comparedEnv string) bool

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    err := system.SetOsEnv("foo", "abc")
+    if err != nil {
+        return
+    }
+
+    result := system.CompareOsEnv("foo", "abc")
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

ExecCommand

Execute shell command, return the stdout and stderr string of command, and error if error occur. param `command` is a complete command string, like, ls -a (linux), dir(windows), ping 127.0.0.1. In linux, use /bin/bash -c to execute command, In windows, use powershell.exe to execute command.

Signature:

go
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)
type (
+	Option func(*exec.Cmd)
+)
+func ExecCommand(command string, opts ...Option) (stdout, stderr string, err error)

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    // linux or mac
+    stdout, stderr, err := system.ExecCommand("ls")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    assert.Equal("", stderr)
+
+    // windows
+    stdout, stderr, err = system.ExecCommand("dir")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+
+    // error command
+    stdout, stderr, err = system.ExecCommand("abc")
+    fmt.Println("std out: ", stdout)
+    fmt.Println("std err: ", stderr)
+    if err != nil {
+        fmt.Println(err.Error())
+    }
+}

GetOsBits

Get current os bits, 32bit or 64bit. return 32 or 64

Signature:

go
func GetOsBits() int
func GetOsBits() int

Example:Run

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/system"
+)
+
+func main() {
+    osBit := system.GetOsBits()
+    fmt.Println(osBit) // 32 or 64
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/tuple.html b/docs/.vitepress/dist/en/api/packages/tuple.html new file mode 100644 index 0000000..0b1c1fc --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/tuple.html @@ -0,0 +1,1138 @@ + + + + + + Tuple | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Tuple

tuple package implements tuple data type and some operations on it.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)
import (
+    "github.com/duke-git/lancet/v2/pointer"
+)

Index

Documentation

Tuple2

Tuple2 represents a 2 elemnets tuple.

Signature:

go
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]
type Tuple2[A any, B any] struct {
+    FieldA A
+    FieldB B
+}
+
+func NewTuple2[A any, B any](a A, b B) Tuple2[A, B]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    fmt.Printf("%v %v", t.FieldA, t.FieldB)
+
+    // Output: 1 0.1
+}

Tuple2_Unbox

Tuple2 Unbox returns values in tuple.

Signature:

go
func (t Tuple2[A, B]) Unbox() (A, B)
func (t Tuple2[A, B]) Unbox() (A, B)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple2(1, 0.1)
+    v1, v2 := t.Unbox()
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: 1 0.1
+}

Zip2

Create a slice of Tuple2, whose elements are correspond to the given slice elements.

Signature:

go
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]
func Zip2[A any, B any](a []A, b []B) []Tuple2[A, B]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip2([]int{1}, []float64{0.1})
+    fmt.Println(result)
+
+    // Output: [{1 0.1}]
+}

Unzip2

Create a group of slice from a slice of Tuple2.

Signature:

go
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)
func Unzip2[A any, B any](tuples []Tuple2[A, B]) ([]A, []B)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2 := tuple.Unzip2([]tuple.Tuple2[int, float64]{{FieldA: 1, FieldB: 0.1}})
+
+    fmt.Printf("%v %v", v1, v2)
+
+    // Output: [1] [0.1]
+}

Tuple3

Tuple3 represents a 3 elemnets tuple.

Signature:

go
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]
type Tuple3[A any, B any, C any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+}
+
+func NewTuple3[A any, B any, C any](a A, b B c C) Tuple3[A, B, C]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    fmt.Printf("%v %v %v", t.FieldA, t.FieldB, t.FieldC)
+
+    // Output: 1 0.1 a
+}

Tuple3_Unbox

Tuple3 Unbox returns values in tuple.

Signature:

go
func (t Tuple3[A, B, C]) Unbox() (A, B, C)
func (t Tuple3[A, B, C]) Unbox() (A, B, C)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple3(1, 0.1, "a")
+    v1, v2, v3 := t.Unbox()
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: 1 0.1 a
+}

Zip3

Create a slice of Tuple3, whose elements are correspond to the given slice elements.

Signature:

go
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]
func Zip3[A any, B any, C any](a []A, b []B, c []C) []Tuple3[A, B, C]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip3([]int{1}, []float64{0.1}, []string{"a"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a}]
+}

Unzip3

Create a group of slice from a slice of Tuple3.

Signature:

go
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)
func Unzip3[A any, B any, C any](tuples []Tuple3[A, B, C]) ([]A, []B, []C)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3 := tuple.Unzip3([]tuple.Tuple3[int, float64, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a"},
+    })
+
+    fmt.Printf("%v %v %v", v1, v2, v3)
+
+    // Output: [1] [0.1] [a]
+}

Tuple4

Tuple4 represents a 4 elemnets tuple.

Signature:

go
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]
type Tuple4[A any, B any, C any, D any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+}
+
+func NewTuple4[A any, B any, C any, D any](a A, b B, c C, d D) Tuple4[A, B, C, D]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    fmt.Printf("%v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD)
+
+    // Output: 1 0.1 a true
+}

Tuple4_Unbox

Tuple4 Unbox returns values in tuple.

Signature:

go
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)
func (t Tuple4[A, B, C, D]) Unbox() (A, B, C, D)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple4(1, 0.1, "a", true)
+    v1, v2, v3, v4 := t.Unbox()
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: 1 0.1 a true
+}

Zip4

Create a slice of Tuple4, whose elements are correspond to the given slice elements.

Signature:

go
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]
func Zip4[A any, B any, C any, D any](a []A, b []B, c []C, d []D) []Tuple4[A, B, C, D]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip4([]int{1}, []float64{0.1}, []string{"a"}, []bool{true})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true}]
+}

Unzip4

Create a group of slice from a slice of Tuple4.

Signature:

go
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)
func Unzip4[A any, B any, C any, D any](tuples []Tuple4[A, B, C, D]) ([]A, []B, []C, []D)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4 := tuple.Unzip4([]tuple.Tuple4[int, float64, string, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true},
+    })
+
+    fmt.Printf("%v %v %v %v", v1, v2, v3, v4)
+
+    // Output: [1] [0.1] [a] [true]
+}

Tuple5

Tuple5 represents a 5 elemnets tuple.

Signature:

go
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]
type Tuple5[A any, B any, C any, D any, E any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+}
+
+func NewTuple5[A any, B any, C any, D any, E any](a A, b B, c C, d D, e E) Tuple5[A, B, C, D, E]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    fmt.Printf("%v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE)
+
+    // Output: 1 0.1 a true 2
+}

Tuple5_Unbox

Tuple5 Unbox returns values in tuple.

Signature:

go
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)
func (t Tuple5[A, B, C, D, E]) Unbox() (A, B, C, D, E)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple5(1, 0.1, "a", true, 2)
+    v1, v2, v3, v4, v5 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: 1 0.1 a true 2
+}

Zip5

Create a slice of Tuple5, whose elements are correspond to the given slice elements.

Signature:

go
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]
func Zip5[A any, B any, C any, D any, E any](a []A, b []B, c []C, d []D, e []E) []Tuple5[A, B, C, D, E]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip5([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2}]
+}

Unzip5

Create a group of slice from a slice of Tuple5.

Signature:

go
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)
func Unzip5[A any, B any, C any, D any, E any](tuples []Tuple5[A, B, C, D, E]) ([]A, []B, []C, []D, []E)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5 := tuple.Unzip5([]tuple.Tuple5[int, float64, string, bool, int]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2},
+    })
+
+    fmt.Printf("%v %v %v %v %v", v1, v2, v3, v4, v5)
+
+    // Output: [1] [0.1] [a] [true] [2]
+}

Tuple6

Tuple6 represents a 6 elemnets tuple.

Signature:

go
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]
type Tuple6[A any, B any, C any, D any, E any, F any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+}
+
+func NewTuple6[A any, B any, C any, D any, E any, F any](a A, b B, c C, d D, e E, f F) Tuple6[A, B, C, D, E, F]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    fmt.Printf("%v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Tuple6_Unbox

Tuple6 Unbox returns values in tuple.

Signature:

go
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)
func (t Tuple6[A, B, C, D, E, F]) Unbox() (A, B, C, D, E, F)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple6(1, 0.1, "a", true, 2, 2.2)
+    v1, v2, v3, v4, v5, v6 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: 1 0.1 a true 2 2.2
+}

Zip6

Create a slice of Tuple6, whose elements are correspond to the given slice elements.

Signature:

go
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]
func Zip6[A any, B any, C any, D any, E any, F any](a []A, b []B, c []C, d []D, e []E, f []F) []Tuple6[A, B, C, D, E, F]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip6([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2}]
+}

Unzip6

Create a group of slice from a slice of Tuple6.

Signature:

go
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)
func Unzip6[A any, B any, C any, D any, E any, F any](tuples []Tuple6[A, B, C, D, E, F]) ([]A, []B, []C, []D, []E, []F)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6 := tuple.Unzip6([]tuple.Tuple6[int, float64, string, bool, int, float32]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v", v1, v2, v3, v4, v5, v6)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2]
+}

Tuple7

Tuple7 represents a 7 elemnets tuple.

Signature:

go
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]
type Tuple7[A any, B any, C any, D any, E any, F any, G any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+}
+
+func NewTuple7[A any, B any, C any, D any, E any, F any, G any](a A, b B, c C, d D, e E, f F, g G) Tuple7[A, B, C, D, E, F, G]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    fmt.Printf("%v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Tuple7_Unbox

Tuple7 Unbox returns values in tuple.

Signature:

go
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)
func (t Tuple7[A, B, C, D, E, F, G]) Unbox() (A, B, C, D, E, F, G)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple7(1, 0.1, "a", true, 2, 2.2, "b")
+    v1, v2, v3, v4, v5, v6, v7 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: 1 0.1 a true 2 2.2 b
+}

Zip7

Create a slice of Tuple7, whose elements are correspond to the given slice elements.

Signature:

go
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]
func Zip7[A any, B any, C any, D any, E any, F any, G any](a []A, b []B, c []C, d []D, e []E, f []F, g []G) []Tuple7[A, B, C, D, E, F, G]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip7([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b}]
+}

Unzip7

Create a group of slice from a slice of Tuple7.

Signature:

go
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)
func Unzip7[A any, B any, C any, D any, E any, F any, G any](tuples []Tuple7[A, B, C, D, E, F, G]) ([]A, []B, []C, []D, []E, []F, []G)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7 := tuple.Unzip7([]tuple.Tuple7[int, float64, string, bool, int, float32, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b]
+}

Tuple8

Tuple8 represents a 8 elemnets tuple.

Signature:

go
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]
type Tuple8[A any, B any, C any, D any, E any, F any, G any, H any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+}
+
+func NewTuple8[A any, B any, C any, D any, E any, F any, G any, H any](a A, b B, c C, d D, e E, f F, g G, h H) Tuple8[A, B, C, D, E, F, G, H]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    fmt.Printf("%v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Tuple8_Unbox

Tuple8 Unbox returns values in tuple.

Signature:

go
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)
func (t Tuple8[A, B, C, D, E, F, G, H]) Unbox() (A, B, C, D, E, F, G, H)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple8(1, 0.1, "a", true, 2, 2.2, "b", "c")
+    v1, v2, v3, v4, v5, v6, v7, v8 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: 1 0.1 a true 2 2.2 b c
+}

Zip8

Create a slice of Tuple8, whose elements are correspond to the given slice elements.

Signature:

go
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]
func Zip8[A any, B any, C any, D any, E any, F any, G any, H any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H) []Tuple8[A, B, C, D, E, F, G, H]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip8([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c}]
+}

Unzip8

Create a group of slice from a slice of Tuple8.

Signature:

go
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)
func Unzip8[A any, B any, C any, D any, E any, F any, G any, H any](tuples []Tuple8[A, B, C, D, E, F, G, H]) ([]A, []B, []C, []D, []E, []F, []G, []H)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8 := tuple.Unzip8([]tuple.Tuple8[int, float64, string, bool, int, float32, string, string]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c"},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c]
+}

Tuple9

Tuple9 represents a 9 elemnets tuple.

Signature:

go
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]
type Tuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+}
+
+func NewTuple9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a A, b B, c C, d D, e E, f F, g G, h H, i I) Tuple9[A, B, C, D, E, F, G, H, I]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Tuple9_Unbox

Tuple9 Unbox returns values in tuple.

Signature:

go
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)
func (t Tuple9[A, B, C, D, E, F, G, H, I]) Unbox() (A, B, C, D, E, F, G, H, I)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    t := tuple.NewTuple9(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1]
+}

Zip9

Create a slice of Tuple9, whose elements are correspond to the given slice elements.

Signature:

go
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]
func Zip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I) []Tuple9[A, B, C, D, E, F, G, H, I]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip9([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3}]
+}

Unzip9

Create a group of slice from a slice of Tuple9.

Signature:

go
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)
func Unzip9[A any, B any, C any, D any, E any, F any, G any, H any, I any](tuples []Tuple9[A, B, C, D, E, F, G, H, I]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9 := tuple.Unzip9([]tuple.Tuple9[int, float64, string, bool, int, float32, string, string, int64]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3]
+}

Tuple10

Tuple10 represents a 10 elemnets tuple.

Signature:

go
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]
type Tuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any] struct {
+    FieldA A
+    FieldB B
+    FieldC C
+    FieldD D
+    FieldE E
+    FieldF F
+    FieldG G
+    FieldH H
+    FieldI I
+    FieldJ J
+}
+
+func NewTuple10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a A, b B, c C, d D, e E, f F, g G, h H, i I, j J) Tuple10[A, B, C, D, E, F, G, H, I, J]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", t.FieldA, t.FieldB, t.FieldC, t.FieldD, t.FieldE, t.FieldF, t.FieldG, t.FieldH, t.FieldI, t.FieldJ)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Tuple10_Unbox

Tuple10 Unbox returns values in tuple.

Signature:

go
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)
func (t Tuple10[A, B, C, D, E, F, G, H, I, J]) Unbox() (A, B, C, D, E, F, G, H, I, J)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    type foo struct {
+        A string
+    }
+    t := tuple.NewTuple10(1, 0.1, "a", true, 2, 2.2, "b", "c", map[string]int{"a": 1}, foo{A: "a"})
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := t.Unbox()
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: 1 0.1 a true 2 2.2 b c map[a:1] {a}
+}

Zip10

Create a slice of Tuple10, whose elements are correspond to the given slice elements.

Signature:

go
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]
func Zip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](a []A, b []B, c []C, d []D, e []E, f []F, g []G, h []H, i []I, j []J) []Tuple10[A, B, C, D, E, F, G, H, I, J]

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    result := tuple.Zip10([]int{1}, []float64{0.1}, []string{"a"}, []bool{true}, []int{2}, []float32{2.2}, []string{"b"}, []string{"c"}, []int64{3}, []bool{false})
+    fmt.Println(result)
+
+    // Output: [{1 0.1 a true 2 2.2 b c 3 false}]
+}

Unzip10

Create a group of slice from a slice of Tuple10.

Signature:

go
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)
func Unzip10[A any, B any, C any, D any, E any, F any, G any, H any, I any, J any](tuples []Tuple10[A, B, C, D, E, F, G, H, I, J]) ([]A, []B, []C, []D, []E, []F, []G, []H, []I, []J)

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/tuple"
+)
+
+func main() {
+    v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 := tuple.Unzip10([]tuple.Tuple10[int, float64, string, bool, int, float32, string, string, int64, bool]{
+        {FieldA: 1, FieldB: 0.1, FieldC: "a", FieldD: true, FieldE: 2, FieldF: 2.2, FieldG: "b", FieldH: "c", FieldI: 3, FieldJ: false},
+    })
+
+    fmt.Printf("%v %v %v %v %v %v %v %v %v %v", v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
+    // Output: [1] [0.1] [a] [true] [2] [2.2] [b] [c] [3] [false]
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/validator.html b/docs/.vitepress/dist/en/api/packages/validator.html new file mode 100644 index 0000000..bfd878c --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/validator.html @@ -0,0 +1,1228 @@ + + + + + + Validator | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Validator

Package validator contains some functions for data validation.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/validator"
+)
import (
+    "github.com/duke-git/lancet/v2/validator"
+)

Index

Documentation

ContainChinese

Check if the string contain mandarin chinese.

Signature:

go
func ContainChinese(s string) bool
func ContainChinese(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainChinese("你好")
+    result2 := validator.ContainChinese("你好hello")
+    result3 := validator.ContainChinese("hello")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainLetter

Check if the string contain at least one letter.

Signature:

go
func ContainLetter(str string) bool
func ContainLetter(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLetter("你好")
+    result2 := validator.ContainLetter("&@#$%^&*")
+    result3 := validator.ContainLetter("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // false
+    // false
+    // true
+}

ContainLower

Check if the string contain at least one lower case letter a-z.

Signature:

go
func ContainLower(str string) bool
func ContainLower(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainLower("abc")
+    result2 := validator.ContainLower("aBC")
+    result3 := validator.ContainLower("ABC")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

ContainUpper

Check if the string contain at least one upper case letter A-Z.

Signature:

go
func ContainUpper(str string) bool
func ContainUpper(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.ContainUpper("ABC")
+    result2 := validator.ContainUpper("abC")
+    result3 := validator.ContainUpper("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsAlpha

Check if the string contains only letters (a-zA-Z).

Signature:

go
func IsAlpha(s string) bool
func IsAlpha(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAlpha("abc")
+    result2 := validator.IsAlpha("ab1")
+    result3 := validator.IsAlpha("")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllUpper

Check if string is all upper case letters A-Z.

Signature:

go
func IsAllUpper(str string) bool
func IsAllUpper(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllUpper("ABC")
+    result2 := validator.IsAllUpper("ABc")
+    result3 := validator.IsAllUpper("AB1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsAllLower

Check if string is all lower case letters a-z.

Signature:

go
func IsAllLower(str string) bool
func IsAllLower(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsAllLower("abc")
+    result2 := validator.IsAllLower("abC")
+    result3 := validator.IsAllLower("ab1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsASCII

Checks if string is all ASCII char.

Signature:

go
func IsASCII(str string) bool
func IsASCII(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsASCII("ABC")
+    result2 := validator.IsASCII("123")
+    result3 := validator.IsASCII("")
+    result4 := validator.IsASCII("😄")
+    result5 := validator.IsASCII("你好")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+    // false
+}

IsBase64

Check if the string is base64 string.

Signature:

go
func IsBase64(base64 string) bool
func IsBase64(base64 string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsBase64("aGVsbG8=")
+    result2 := validator.IsBase64("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseMobile

Check if the string is valid chinese mobile number.

Signature:

go
func IsChineseMobile(mobileNum string) bool
func IsChineseMobile(mobileNum string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseMobile("13263527980")
+    result2 := validator.IsChineseMobile("434324324")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChineseIdNum

Check if the string is chinese id number.

Signature:

go
func IsChineseIdNum(id string) bool
func IsChineseIdNum(id string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChineseIdNum("210911192105130715")
+    result2 := validator.IsChineseIdNum("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsChinesePhone

Check if the string is chinese phone number.

Signature:

go
func IsChinesePhone(phone string) bool
func IsChinesePhone(phone string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsChinesePhone("010-32116675")
+    result2 := validator.IsChinesePhone("123-87562")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsCreditCard

Check if the string is credit card.

Signature:

go
func IsCreditCard(creditCart string) bool
func IsCreditCard(creditCart string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsCreditCard("4111111111111111")
+    result2 := validator.IsCreditCard("123456")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsDns

Check if the string is valid dns.

Signature:

go
func IsDns(dns string) bool
func IsDns(dns string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsDns("abc.com")
+    result2 := validator.IsDns("a.b.com")
+    result3 := validator.IsDns("http://abc.com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsEmail

Check if the string is email address.

Signature:

go
func IsEmail(email string) bool
func IsEmail(email string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmail("abc@xyz.com")
+    result2 := validator.IsEmail("a.b@@com")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsEmptyString

Check if the string is empty or not.

Signature:

go
func IsEmptyString(s string) bool
func IsEmptyString(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsEmptyString("")
+    result2 := validator.IsEmptyString(" ")
+    result3 := validator.IsEmptyString("\t")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // false
+    // false
+}

IsInt

Check if the value is integer(int, unit) or not.

Signature:

go
func IsInt(v any) bool
func IsInt(v any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsInt("")
+    result2 := validator.IsInt("3")
+    result3 := validator.IsInt(0.1)
+    result4 := validator.IsInt(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsFloat

Check if the value is float(float32, float34) or not.

Signature:

go
func IsFloat(v any) bool
func IsFloat(v any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloat("")
+    result2 := validator.IsFloat("3")
+    result3 := validator.IsFloat(0)
+    result4 := validator.IsFloat(0.1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // false
+    // true
+}

IsNumber

Check if the value is number(integer, float) or not.

Signature:

go
func IsNumber(v any) bool
func IsNumber(v any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumber("")
+    result2 := validator.IsNumber("3")
+    result3 := validator.IsNumber(0.1)
+    result4 := validator.IsNumber(0)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // false
+    // false
+    // true
+    // true
+}

IsIntStr

Check if the string can convert to a integer.

Signature:

go
func IsIntStr(s string) bool
func IsIntStr(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIntStr("+3")
+    result2 := validator.IsIntStr("-3")
+    result3 := validator.IsIntStr("3.")
+    result4 := validator.IsIntStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsFloatStr

Check if the string can convert to a float.

Signature:

go
func IsFloatStr(s string) bool
func IsFloatStr(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsFloatStr("3.")
+    result2 := validator.IsFloatStr("+3.")
+    result3 := validator.IsFloatStr("12")
+    result4 := validator.IsFloatStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsNumberStr

Check if the string can convert to a number.

Signature:

go
func IsNumberStr(s string) bool
func IsNumberStr(s string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsNumberStr("3.")
+    result2 := validator.IsNumberStr("+3.")
+    result3 := validator.IsNumberStr("+3e2")
+    result4 := validator.IsNumberStr("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // true
+    // false
+}

IsJSON

Check if the string is valid JSON.

Signature:

go
func IsJSON(str string) bool
func IsJSON(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\"name\": \"test\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsJSON("{}")
+    result2 := validator.IsJSON("{\"name\": \"test\"}")
+    result3 := validator.IsJSON("")
+    result4 := validator.IsJSON("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsRegexMatch

Check if the string match the regexp.

Signature:

go
func IsRegexMatch(s, regex string) bool
func IsRegexMatch(s, regex string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", `^[a-zA-Z]+$`)
+    result2 := validator.IsRegexMatch("ab1", `^[a-zA-Z]+$`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsRegexMatch("abc", `^[a-zA-Z]+$`)
+    result2 := validator.IsRegexMatch("ab1", `^[a-zA-Z]+$`)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIp

Check if the string is a ip address.

Signature:

go
func IsIp(ipstr string) bool
func IsIp(ipstr string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIp("127.0.0.1")
+    result2 := validator.IsIp("::0:0:0:0:0:0:1")
+    result3 := validator.IsIp("127.0.0")
+    result4 := validator.IsIp("::0:0:0:0:")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsIpV4

Check if the string is a ipv4 address.

Signature:

go
func IsIpV4(ipstr string) bool
func IsIpV4(ipstr string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV4("127.0.0.1")
+    result2 := validator.IsIpV4("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsIpV6

Check if the string is a ipv6 address.

Signature:

go
func IsIpV6(ipstr string) bool
func IsIpV6(ipstr string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsIpV6("127.0.0.1")
+    result2 := validator.IsIpV6("::0:0:0:0:0:0:1")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsStrongPassword

Check if the string is strong password (alpha(lower+upper) + number + special chars(!@#$%^&*()?gt<)).

Signature:

go
func IsStrongPassword(password string, length int) bool
func IsStrongPassword(password string, length int) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsStrongPassword("abcABC", 6)
+    result2 := validator.IsStrongPassword("abcABC123@#$", 10)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // false
+    // true
+}

IsUrl

Check if the string is url.

Signature:

go
func IsUrl(str string) bool
func IsUrl(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsUrl("abc.com")
+    result2 := validator.IsUrl("http://abc.com")
+    result3 := validator.IsUrl("abc")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+
+    // Output:
+    // true
+    // true
+    // false
+}

IsWeakPassword

Checks if the string is weak password(only letter or only number or letter + number) .

Signature:

go
func IsWeakPassword(password string, length int) bool
func IsWeakPassword(password string, length int) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsWeakPassword("abcABC")
+    result2 := validator.IsWeakPassword("abc123@#$")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+
+    // Output:
+    // true
+    // false
+}

IsZeroValue

Checks if passed value is a zero value.

Signature:

go
func IsZeroValue(value any) bool
func IsZeroValue(value any) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsZeroValue("")
+    result2 := validator.IsZeroValue(0)
+    result3 := validator.IsZeroValue("abc")
+    result4 := validator.IsZeroValue(1)
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+
+    // Output:
+    // true
+    // true
+    // false
+    // false
+}

IsGBK

Checks if data encoding is gbk(Chinese character internal code extension specification). this function is implemented by whether double bytes fall within the encoding range of gbk,while each byte of utf-8 encoding format falls within the encoding range of gbk.Therefore, utf8.valid() should be called first to check whether it is not utf-8 encoding and then call IsGBK() to check gbk encoding. like the example.

Signature:

go
func IsGBK(data []byte) bool
func IsGBK(data []byte) bool

Example:运行

go
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}
import (
+    "fmt"
+    "golang.org/x/text/encoding/simplifiedchinese"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    str := "你好"
+    gbkData, _ := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(str))
+
+    result := validator.IsGBK(gbkData)
+
+    fmt.Println(result)
+
+    // Output:
+    // true
+}

IsPrintable

Checks if string is all printable chars.

Signature:

go
func IsPrintable(str string) bool
func IsPrintable(str string) bool

Example:运行

go
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}
import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/validator"
+)
+
+func main() {
+    result1 := validator.IsPrintable("ABC")
+    result2 := validator.IsPrintable("{id: 123}")
+    result3 := validator.IsPrintable("")
+    result4 := validator.IsPrintable("😄")
+    result5 := validator.IsPrintable("\u0000")
+
+    fmt.Println(result1)
+    fmt.Println(result2)
+    fmt.Println(result3)
+    fmt.Println(result4)
+    fmt.Println(result5)
+
+    // Output:
+    // true
+    // true
+    // true
+    // true
+    // false
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/api/packages/xerror.html b/docs/.vitepress/dist/en/api/packages/xerror.html new file mode 100644 index 0000000..406db8f --- /dev/null +++ b/docs/.vitepress/dist/en/api/packages/xerror.html @@ -0,0 +1,508 @@ + + + + + + Xerror | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Xerror

Package xerror implements helpers for errors.

Source:

Usage:

go
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)
import (
+    "github.com/duke-git/lancet/v2/xerror"
+)

Index

Documentation

New

Creates a new XError pointer instance with message.

Signature:

go
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError
type XError struct {
+    id      string
+    message string
+    stack   *stack
+    cause   error
+    values  map[string]any
+}
+
+func New(format string, args ...any) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

Wrap

Creates a new XError pointer instance based on error object, and add message.

Signature:

go
func Wrap(cause error, message ...any) *XError
func Wrap(cause error, message ...any) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("wrong password")
+    wrapErr := xerror.Wrap(err, "error")
+
+    fmt.Println(wrapErr.Error())
+
+    // Output:
+    // error: wrong password
+}

Unwrap

Returns unwrapped XError from err by errors.As. If no XError, returns nil.

Signature:

go
func Unwrap(err error) *XError
func Unwrap(err error) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/pkg/errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    wrapErr := errors.Wrap(err1, "oops")
+
+    err := xerror.Unwrap(wrapErr)
+
+    values := err.Values()
+    fmt.Println(values["level"])
+
+    // Output:
+    // high
+}

XError_Wrap

Creates a new XError and copy message and id to new one.

Signature:

go
func (e *XError) Wrap(cause error) *XError
func (e *XError) Wrap(cause error) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}
package main
+
+import (
+    "fmt"
+    "errors"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+	err2 := err1.Wrap(errors.New("invalid username"))
+
+	fmt.Println(err2.Error())
+
+	// Output:
+	// error: invalid username
+}

XError_Unwrap

Compatible with github.com/pkg/errors.

Signature:

go
func (e *XError) Unwrap() error
func (e *XError) Unwrap() error

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").With("level", "high")
+    err2 := err1.Wrap(errors.New("invalid username"))
+
+    err := err2.Unwrap()
+
+    fmt.Println(err.Error())
+
+    // Output:
+    // invalid username
+}

XError_With

Adds key and value related to the XError object.

Signature:

go
func (e *XError) With(key string, value any) *XError
func (e *XError) With(key string, value any) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_Id

Sets XError object id to check equality in XError.Is.

Signature:

go
func (e *XError) Id(id string) *XError
func (e *XError) Id(id string) *XError

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Is

Checks if target error is XError and Error.id of two errors are matched.

Signature:

go
func (e *XError) Is(target error) bool
func (e *XError) Is(target error) bool

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err1 := xerror.New("error").Id("e001")
+    err2 := xerror.New("error").Id("e001")
+    err3 := xerror.New("error").Id("e003")
+
+    equal := err1.Is(err2)
+    notEqual := err1.Is(err3)
+
+    fmt.Println(equal)
+    fmt.Println(notEqual)
+
+    // Output:
+    // true
+    // false
+}

XError_Values

Returns map of key and value that is set by With. All wrapped xerror.XError key and values will be merged. Key and values of wrapped error is overwritten by upper xerror.XError.

Signature:

go
func (e *XError) Values() map[string]any
func (e *XError) Values() map[string]any

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error").With("level", "high")
+
+    errLevel := err.Values()["level"]
+
+    fmt.Println(errLevel)
+
+    // Output:
+    // high
+}

XError_StackTrace

Returns stack trace which is compatible with pkg/errors.

Signature:

go
func (e *XError) StackTrace() StackTrace
func (e *XError) StackTrace() StackTrace

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+
+    stacks := err.Stacks()
+
+    fmt.Println(stacks[0].Func)
+    fmt.Println(stacks[0].Line)
+
+    containFile := strings.Contains(stacks[0].File, "xxx.go")
+    fmt.Println(containFile)
+}

XError_Info

Returns information of xerror, which can be printed.

Signature:

go
func (e *XError) Info() *errInfo
func (e *XError) Info() *errInfo

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    cause := errors.New("error")
+    err := xerror.Wrap(cause, "invalid username").Id("e001").With("level", "high")
+
+    errInfo := err.Info()
+
+    fmt.Println(errInfo.Id)
+    fmt.Println(errInfo.Cause)
+    fmt.Println(errInfo.Values["level"])
+    fmt.Println(errInfo.Message)
+
+    // Output:
+    // e001
+    // error
+    // high
+    // invalid username
+}

XError_Error

Error implements standard error interface.

Signature:

go
func (e *XError) Error() string
func (e *XError) Error() string

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    err := xerror.New("error")
+    fmt.Println(err.Error())
+
+    // Output:
+    // error
+}

TryUnwrap

TryUnwrap if err is nil then it returns a valid value. If err is not nil, Unwrap panics with err.

Signature:

go
func TryUnwrap[T any](val T, err error) T
func TryUnwrap[T any](val T, err error) T

Example:Run

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/xerror"
+)
+
+func main() {
+    result1 := xerror.TryUnwrap(strconv.Atoi("42"))
+    fmt.Println(result1)
+
+    _, err := strconv.Atoi("4o2")
+    defer func() {
+        v := recover()
+        result2 := reflect.DeepEqual(err.Error(), v.(*strconv.NumError).Error())
+        fmt.Println(result2)
+    }()
+
+    xerror.TryUnwrap(strconv.Atoi("4o2"))
+
+    // Output:
+    // 42
+    // true
+}

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/guide/getting_started.html b/docs/.vitepress/dist/en/guide/getting_started.html new file mode 100644 index 0000000..89e2379 --- /dev/null +++ b/docs/.vitepress/dist/en/guide/getting_started.html @@ -0,0 +1,50 @@ + + + + + + Installation | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

Installation

  1. For users who use go1.18 and above, it is recommended to install lancet v2.x.x. Cause in v2.x.x all functions was rewriten with generics of go1.18.
go
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
  1. For users who use version below go1.18, you should install v1.x.x. The latest of v1.x.x is v1.4.1.
go
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x

Usage

Lancet organizes the code into package structure, and you need to import the corresponding package name when use it. For example, if you use string-related functions, just import the strutil package like below:

go
import "github.com/duke-git/lancet/v2/strutil"
import "github.com/duke-git/lancet/v2/strutil"

Example

Here takes the string function Reverse (reverse order string) as an example, and the strutil package needs to be imported.

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}

More

Check out the APIs for details.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/guide/introduction.html b/docs/.vitepress/dist/en/guide/introduction.html new file mode 100644 index 0000000..e64e5bc --- /dev/null +++ b/docs/.vitepress/dist/en/guide/introduction.html @@ -0,0 +1,28 @@ + + + + + + What is lancet? | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
On this page

What is lancet?

Lancet is a powerful, efficient, and reusable util function library of go. Inspired by the java apache common package and lodash.js.

Why lancet?

Lancet makes Go dev easier by taking the hassle out of working with concurrency, net, math, slice, string, etc. Lancet's utility methods are great for:

  • Iterating slice and array.
  • Manipulating strings.
  • Work with net and http.
  • Other tools, eg. random, crypto, stream, retry, etc.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/en/index.html b/docs/.vitepress/dist/en/index.html new file mode 100644 index 0000000..e5cfc3e --- /dev/null +++ b/docs/.vitepress/dist/en/index.html @@ -0,0 +1,28 @@ + + + + + + Lancet | Lancet + + + + + + + + + + + + + + + + + +
Skip to content

Lancet

A powerful util function library of Go

Simple, powerful, and efficient.

lancet

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/guide/getting_started.html b/docs/.vitepress/dist/guide/getting_started.html new file mode 100644 index 0000000..a190641 --- /dev/null +++ b/docs/.vitepress/dist/guide/getting_started.html @@ -0,0 +1,50 @@ + + + + + + 安装 | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

安装

  1. 使用 go1.18 及以上版本的用户,建议安装 v2.x.x。 因为 v2.x.x 应用 go1.18 的泛型重写了大部分函数。
go
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x
  1. 使用 go1.18 以下版本的用户,必须安装 v1.x.x。目前最新的 v1 版本是 v1.4.1。
go
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x
go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x

用法

lancet 是以包的结构组织代码的,使用时需要导入相应的包名。例如:如果使用字符串相关函数,需要导入 strutil 包:

go
import "github.com/duke-git/lancet/v2/strutil"
import "github.com/duke-git/lancet/v2/strutil"

示例

此处以字符串工具函数 Reverse(逆序字符串)为例,需要导入 strutil 包:

go
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}
package main
+
+import (
+    "fmt"
+    "github.com/duke-git/lancet/v2/strutil"
+)
+
+func main() {
+    s := "hello"
+    rs := strutil.Reverse(s)
+    fmt.Println(rs) //olleh
+}

More

其他特性请参考API.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/guide/introduction.html b/docs/.vitepress/dist/guide/introduction.html new file mode 100644 index 0000000..63eaaa9 --- /dev/null +++ b/docs/.vitepress/dist/guide/introduction.html @@ -0,0 +1,28 @@ + + + + + + lancet是什么? | Lancet + + + + + + + + + + + + + + + + + +
Skip to content
本页内容

lancet是什么?

lancet(柳叶刀)是一个功能强大、全面、高效、可复用的go语言工具函数库。lancet受到了java apache common包和lodash.js的启发。

为什么选择lancet?

Lancet 消除了处理并发、网络、数学、切片、字符串等的麻烦,使 Go 开发变得更容易。 Lancet 的实用方法非常适合:

  • 迭代切片和数组。
  • 操作字符串。
  • 处理网络和http请求。
  • 其他工具,例如。 随机、加密、流、重试等。

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/hashmap.json b/docs/.vitepress/dist/hashmap.json new file mode 100644 index 0000000..afcc7e7 --- /dev/null +++ b/docs/.vitepress/dist/hashmap.json @@ -0,0 +1 @@ +{"api_overview.md":"0734e445","api_packages_compare.md":"046b68ac","api_packages_algorithm.md":"a5fd6586","api_packages_concurrency.md":"02593d84","api_packages_condition.md":"2519cae3","api_packages_convertor.md":"3dc6f3b4","api_packages_datastructure_copyonwritelist.md":"1a351580","api_packages_datastructure_hashmap.md":"310e4711","api_packages_datastructure_heap.md":"749f37d9","api_packages_cryptor.md":"2d4965d7","api_packages_datastructure_link.md":"53b556c9","api_packages_datastructure_list.md":"c39c7138","api_packages_datastructure_set.md":"8bd77304","api_packages_datastructure_queue.md":"55dce1c4","api_packages_datastructure_stack.md":"9d7b51a7","api_packages_datastructure_tree.md":"1eeacf87","api_packages_datetime.md":"53f898b5","api_packages_formatter.md":"8820c0cf","api_packages_fileutil.md":"94d3797c","api_packages_function.md":"5cbb4c31","api_packages_maputil.md":"68434477","api_packages_pointer.md":"3465a655","api_packages_random.md":"c5785d61","api_packages_retry.md":"746cf8ed","api_packages_mathutil.md":"274658f0","api_packages_netutil.md":"d9f6ee6d","api_packages_struct.md":"bdd9b8b9","api_packages_stream.md":"f8a1897d","api_packages_system.md":"3c9cc0ec","api_packages_slice.md":"f48c775b","en_api_overview.md":"1eb70105","api_packages_strutil.md":"2574c069","api_packages_xerror.md":"b2d37d2c","api_packages_validator.md":"1f431893","en_api_packages_compare.md":"409d8174","api_packages_tuple.md":"04b31a3e","en_api_packages_algorithm.md":"4b3abf4d","en_api_packages_condition.md":"a164dfc9","en_api_packages_concurrency.md":"4ccb7541","en_api_packages_convertor.md":"4d1b1ca4","en_api_packages_datastructure_hashmap.md":"55db8537","en_api_packages_datastructure_copyonwritelist.md":"c4ab8b5a","en_api_packages_datastructure_heap.md":"638dd5d1","en_api_packages_cryptor.md":"83b35674","en_api_packages_datastructure_link.md":"062572a5","en_api_packages_datastructure_list.md":"d467285d","en_api_packages_datastructure_queue.md":"88ad36da","en_api_packages_datastructure_set.md":"963fc914","en_api_packages_datastructure_stack.md":"1998c8dc","en_api_packages_datastructure_tree.md":"e0a47a13","en_api_packages_formatter.md":"00b1f98e","en_api_packages_function.md":"0aff7e60","en_api_packages_fileutil.md":"fea45f47","en_api_packages_datetime.md":"32edaec1","en_api_packages_pointer.md":"51cdc76e","en_api_packages_random.md":"09d4734b","en_api_packages_retry.md":"9ae8caac","en_api_packages_mathutil.md":"cd3e0e74","en_api_packages_maputil.md":"4fc65b0e","en_api_packages_netutil.md":"4a71afe0","en_api_packages_struct.md":"ebe3b9e2","en_api_packages_stream.md":"99e473e0","en_api_packages_system.md":"b89ed647","en_api_packages_slice.md":"1a1b5495","guide_introduction.md":"c4fdb40e","index.md":"3fde7444","en_guide_introduction.md":"d2712e12","en_index.md":"3bc9892c","en_guide_getting_started.md":"fbd5d30c","guide_getting_started.md":"acfc7802","en_api_packages_xerror.md":"5cac58cd","en_api_packages_strutil.md":"2bfcfdc2","en_api_packages_validator.md":"fa34c2f2","en_api_packages_tuple.md":"ce828c9e"} diff --git a/docs/.vitepress/dist/index.html b/docs/.vitepress/dist/index.html new file mode 100644 index 0000000..b94aec5 --- /dev/null +++ b/docs/.vitepress/dist/index.html @@ -0,0 +1,28 @@ + + + + + + Lancet | Lancet + + + + + + + + + + + + + + + + + +
Skip to content

Lancet

一个强大的Go语言工具函数库

简洁, 强大, 高效

lancet

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/docs/.vitepress/dist/lancet_logo.png b/docs/.vitepress/dist/lancet_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..481f8906e1de3b320c09e6d516ab4b1d9e67293b GIT binary patch literal 18948 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 literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/lancet_logo_mini.png b/docs/.vitepress/dist/lancet_logo_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..9c20d1d2318567d6d14d1a31e083851ca5e21bd2 GIT binary patch literal 9551 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 literal 0 HcmV?d00001

ZW z>LvWci|0Ys_~}zA<#r!FpYB||^on+Us`%f%qy+jTHN#5H_iqB-3Ph=a%NV&Ad-gHw zl4kvsk9?lBv!OO#qTiYn;vKECa%fn4tT|~nfbKPSY6FQp8|vk7r?}G(%x$_VOxJ)1tWAXy zcO*??y!+8dxoc9|2dW^~GN;B|U287!Nm=LIaJ|ooF+aLwJ~NGa1&q?uVsgUYS0mKc z^NMXa(-R0U<;Xo`mUgC|{_3V_zm68nk4b20hpwkRQkMb*pZZl2rg(>RoxTxgS~q>5 zb7#x}f7-3WFBmEwNSeWAM6RG)CF_BlV(;Q7?x!tD9MS)>b17=hXlnJg>danU(&=^r z-)3(3ih3{goV}bHi+zaagq6RWx_bm``PwSmsO_Yvdpio+qC;yl?_p;yv+s7FpwBj+ zQai?Me5wWN2(b*{1y)CJlZqTYJZ35$0sP!^-i64 z`d(46qTZAIEg zkrG#q7P)*}dk)#g;1erffjC^O)0hAQnxgE(`z}fm7Ix$@FIwC;_oNa zQb&n&LZp+=b$_xc{dgqZKj`Ci-p9j(Ryc}Wu~;G%Dtxnv98OyN+DAJgu2V;>(~qs& zkMFpj*r+4-hRg21{p371)eP8HBbcxVziL&b4fi2d@`LnFB1U$xu*{2mR8p>ft_poh zSMe{nu_Rcv;3^rP@5-rh|9xug(~ls?I)#9qyBhPnOY%II$Co)f@D+Kv_-R{h zXnyH(AMtPjD&-$N=K_KvHgl>^4Qkuj!*!WJ;SH=1X9TjeBd-x-1AbEA=ZaACwu*`O z0>$QkuFPMm%7?1@#NE3ripz13?~-Ww-aowBr@cqTsggA3 z3*J}p+tOY*WsqHRX2`&Z9p9#Ro4ul0WWTiGS|uwMo;BEVjY$vB+Ym)-U6|ZqF;3$! zrN(UN4VB^Vp_&@OB&0&+WJq@9)n3uzf+f zznj$JjkJc79b(a6waK(YWIRJ!Az;Yhj+_A5DxQ;Kv6B~B21}U1912nRRMCh4kTHon zgbPU{0EAg->BR!bLNdrCvr;(nAvdf6$s-c7u*ozhQK>)$bE0}2sB+FpRM6te|9d$z zsI5ztZ;OpjIolBaY**(tM0%96Ey=yE_lNV?pF1vK9eCUcm|=EY0VN(v_@u(f(o4}T zDPatNGza`q^$)!d@XiKafG`2@@smOcv1e`|<84JnJ<$xy@d428$9~ES%Y{8c)7c^n zCH|?WB}1}yOj(oly=x^m+d|brlb`{e)F_{pX_W>XA3CIEa{FgYkrY``lAH5~dex~$_1`jOy7Z>Rpw0O{g&wfc8 zQ=iC8D4!jalOX>Fj04tz^xgg$v?*Z*31uAo@4$U-n?rDBUjS!7h(YY2#tQ$g;|q`r z6c%wSK>q>Ig@9dl3le8G5Au%?{(s&QOGwMY?0V1x?*aY^;4c7v0ez8T2t?=ziU<*Q zMO}m4;J1V=b6XHD85m<@a-6rmf|5WzKtBLaw>$69b&G*`@%w?2Zjkc6QO@>=?2gJu zMR{rB{F(XX^z=(DJg1{C4X|8La0Q*-*h>dA!_qQDU=a$>G17i^XM`|v+iBl(Iv zYKMTn2yGB%@URuq#LNm(UQD`(h0j;Ag2v$b`0g3dRV!}5!n zTEcQZP5dOYHo4Ry7aVg&nCFwJ2=gMA7n7(ac8`;5MfKxIOA+d#TpcGn)LMvumjl_h zo=TuG8$p7Bf?;A&ZWQJu%%NpI#B&ojr;fSBGH2qv7l(3@jmyn)W{liT=O16Sw9;6L z{+-oC>l{M`sr;;@i}Pi}QD426)og?M6l$x zS285gwp@ILu`&NdHn$V;c6%=3-X!G9AXa1=cvs@ZL_|Vzr9F`=Ah$kY%Ji~+lH_D= zL7O9Z_ZSs!;N;Rya`B7GUm$`~Ji@B)bdN(}y-bR7g;nIr$RbUF^}8O`al0rNtw&g9LmFGLLJ}WJawYEuP%qpMa8&>OX((BGB7iL zav?s(?X2X)K#H-Ts&MCC_gC4>xZM`an()wF`FE zPdn)sjI?+bN3B7c4y#bF(PghHNxk}6vvN;Hv9F)~fUp=P%q3OF#j%NXp`xxh9l&44 z=jAvS{$#zW>(Kg?qqK&v&9m7?f77mxS$qJamj}TvR_Dm;DMFOQlcdEP`#VYx52Zox z-mW5ry3tedKXOK9e4(}cBy7K?kQR(iqc`g3o>c4aj!5&8Dy-LeO~M~!p(oxiu2*ho zLn9%w#gIoN#i!|qhQWk6#pSD%kD|;?in_(rx~ssH%rag?Sjw^?0W77Lz6RlQyIDF6 zJtPH865f#Vfh;!wD{fUcKiApATY)Fe&3}eFxo$iE0yUeVWI=<02d`rfxL5(W8Fs#& zD|%!AIC-?{7S>{`YwSP(puevN~8bE$j8Jz9Ekdec7tG3laqtU^S2(R!)|IFZidr8 zM?Ea*~cX?!2l%ch2t}LH@d0Z>zRw?(&cvQi&qA_X^7*j~MH%?!Vm{?-F zxBBi%s!LWQvKy7tFNzyd(X@tmZZzX@Tb{P0yIXo%MwByDUZ8^EiY8{k;i2N8iQ%i^ z=I3y8RZ=4?%qcxrOT?;@#QKt{uBuaGJH6_0+swNcL+{P~?o~_`Dy-W}Ij@h=n5$$m zPtoC`@Ym^ek#5v99bXR=wJd zjkC{>G-$8y&Q^AI=k_wycCAiIO>0onge-b}zDm_Sv$$%Rk(O5D)@m)!-4Pb9g0h^u zVh2jIrA)hORnx4S@%M{8>DJ1qwA0qIT)o#W^aRELD#loE<*;gecZ7;xU5Y3uCuLxMY*o3kV_?;x+$zS;kApXLtMS$yDy3%qX zFNWaAY&g0y92u@ zQbSQ1ixw`%hGI1p=aS+zmtaRV{HoQ_OU}%)X#LBKwRe`NWyfuHEq*Pzj zXVW&bQTtMDwPtyPfwI0&(ghi4>tTYLV%}?Vd**`tkiz(DqP3o}&%U>P4c{lrKJboL z^hH{#Y32c&bC0Gi$z4)^L8>~3O-(n!s*Z?i)z}2Aa4%$Q34HV3-t;6~PAHrQ%^J{8?pu7zZ2WqILvIix5cu~< z2cS5?>}{Zqt>^b`6&34|EjYvDU1h5H-N!Qkr3KbR9i=&rdqxMYwJ0m9{g`QoK3J z?cQ5Vzb2bf7Il>LYlch)(|rSKi><>nC)z9uhdB=+A^FS0mScljN_~eq8=8idCM4_H zG{T8czae68BX6#A(^U_S-_%L17*8(OS4WSrha#&&T223QEl{~|7BfyaSz7=N42Lb> z%3JS(T`RT{dIlXGQ#j5jtzZBMTV?EOFgu|(rT=2*D1Wo5Xr!23jnWfO-Q)V}K` zQPAF~LWXiwq>i{&PH;LI(%};6myPrntCEkHhjpXzR-2Fb z;?5o{%&u2lp~a6=#+Yf+)B7V7QmmGvdM^_3J5kir`MNpE_bk-w@7%;%IkaWfWMdFa zI&~ZNV_lD@LhHQvD53w8J6|v>kiSdK*9hq4jh++qR_j;RT6dcOGoE5f( zq~yp`FeKufrjhV&sgVleT4Dqgp<$^YHUE{7hT^?!R9Z^$cSd|P<=|SYlvDI4_bb6x zBUNqy&2h9%Ys>FZe6p0@H=ko(*>F2F^hG3N#pa^oJW<}YvTQ#jp02r9yuaQ%V@$qf zF-TS58swLOSYUkM2Unw`XgE>f{4gPqssfm?bWjQ#u0=$U> z=Jc?I?J=zxqkVC^1)C?mTmKS4M9MvcSCCjBiVE>B8vdy<0&FPPkf)XE9zKE%O21G4yIA*H6;_4fUyD;Cwk#)oXq2pLv#nW zKCi?Bq0JBx(&sR;M_GIYVsuT}5`X3L?0#HUCIEfRY694F#>%4_U8i-?QcgI!EMm$b ze|F3!dvVx8aJI>fg4hLsYsLg=nX{3~4agk1r$@=A*_%tD?E}=XSD^TwKD=v zTbsGdLP#Hz5Kv-eM<|n~H}YOAR|fksLfmO+e(Bf_L$hkx8C9rVgb**Z#yVBTq_F`h zx7_~0Uy&l_(gGi`Do$>YtHgVtc=yFcWi^(RF7XDqC351j{-nWUU_hq-f-DWJURP`d zQl27WA&6oeim2D7*Rqs{fN&5ZS#{fIh`yD~MTVpH8+`BfQ;Mm&&BImP6~-L0j5^aG zpfQVy)3ozqs_zbK`E~|qW&^Mm;_uY#9MEC?0HP6vnN>K~GOq}+0D`(!D z_KhCJC4n&(Rv9mn#X)1YPbe6V0(KZ%QUk}{4@mO@D8+9?aNrDFW?~@uk-fB$7sXt2 zp!w|&*KrhF*4GZU2Ra}M3VYj}QWz|MKHtfai+Y0e3ltW3vB4Aw3>D!D%mkICL6Vqb zIFe5pBKQ*TWo!)tndBT=V_XknuGkqF8nHO-5G{60g) zG&u(uh-CmrXe@}S1_q@3x5jZolcBo?Q$_;a;)i2~87(XzdbV+Jgc^Q?^|&fDm~?<_ zgKV@dltBUpwhkDu+6Yx*ihJ3}f>ZtxMYD%v~@)Z4coYVX8t;{Z2RMDD zTg)1GWmmEBB z6)Unp=FYv;i`MeJ4N6T#?$DUoW_X7Vxx;g|155RgZrH-b6_n_zbndns7gfXw@I-_S z=99|J0_L&B2^6Xa5?Zwyn{A@`IVZcMG)JRy$?W0-Nt_t z3)w@ClC|O?A2jfk6wojb9xGDU@ob}0k-J~OXkyi4%n?*t6(Aeq=T4q}O~4&C)9pIp zSEf#5eBe&@86Y)2iI~s8zYsIvw$^eqxWjnmhv}Q}f2tUSb*-3WW-;wkMuR?5)9r0v z9Ou#4&U9%!-d)ea4s}6STGnrj282tVgI3cC&_yYIkm$fQf)739>1{wwLd=XRA%_Qr zgH%P%(qwyK$_2my@7VH^p|k!hPyE6Td1Quf${;A+o^S$0-F(RJ_M`r4S6_TD?O&YV z%6-pqEsgmp%T(~M<%hrK?={3V{GE>D!< z6Qdlgz)g~tye8quf|t1kRD+MdJ(zzer_XqFmGk1A>kSN8E3+A1l9xx{J=D$mTzj@p zAHI~COYX-r8k8uhroB2}RT4rsWerlyZgzAys8eaoj5})qIxjE!>Nez%0X7^uCbi^& z=z2u*@yu7B6PmT|~?rr(PMa8;)g!;T~!S^(GSvD7! zD4Z>Lz!lQ%JQ4g)Z^ z2G7<_%0*Fu1J+ER>Ss1H7})UdwHPg)5uxe+sN=y01JWxWOf|f&n$Jx%je+k3W>#W7 z=`b>@9*K8d1K1R%_F!BYQSUV-a=1bF2v^p#J ztp}B6;=xa<_LK;f4#(;8m1}416L3f)yyQt}q+Z3vnxnz6LzA>b@Nr}rfiV`{npCr_ z`fc}cAB$~fkc)&xgR6S|-?8fzxBtqZVq^q``rc(}hND0B__^CRI-QyU>w@Pa)?JO0 zbpid?-)3wku=Pz7EtEJLA*MEo0eoH-a9c9UFr~jCiTg@|U>ngiJ7zM!zZhkDwx3P} zY|>n?wnU8)5b-njb<9JlRPH&`cQXOg(&nNH;yP4^rfb{hAI=UHWeBO_M`36~qkhEV zT{xVFR9dT8N6(-4+f^tfq%eha8OW#0K01%+w8AoVg3kqCA+O`<>aE#<(xVl7Giu)Hr2v53$$PF_!5& zZ7c3aH_Be+GJ=ZDwvN3VD8xls0B8D|b`r;)enF_(- zh?E-F7uPBqy|2Km`ntwK_%w$Z=*eKKYrb*u8<&vwkG!J0hws8xOi zBr%OCi6aE@)zx|IQEI7Nx0Df^}3U)$Ma{Vq(ZUEejB!Hlk ztBXR&vMCKZ0B{FEHhFbP}_@MbbxQ!45l|k(`VSj14nL3`&|Vsv&j&- z8tluCu*-ER(Y*#K(m(O|n<=uvnRs$b{@*wk38N?yVp=K_A73UuQX9D+FDdzAy!ObG zKIz(8i>@#TrmL&&`%Ad&K3RFIb@@)a&bk^y+J3z{Gqbq5P2MMOc4?^9fOGKi;sA!utAc%nTXqcgS${X|TFu*Ad-$sq zhFwT(jgL!jE@zy^r~{0=zY(ZSsV zQ`j_Y@9&!riaF^!K=j%AFmxR;y2`+Fz<1Ecbqc4qR8~d+uCqUFQCIj!! zqyY|7ahrSJ`_YOsRb1*0bHIHMMx+ni?0LhAQ+H|}Pt)Pmf}_%nQY&WJQ&H->yMx}@ zhfxjolgyTaJO{g~<{Q+@u^v7aB~`v!{bpJ=a*i_hMPn`ioukjeCjXMY-L&?{QEx?2 z#RUTaf!#NyKHVApc^AC;%+z>4D(p{}SXDnid|0WX+xu}B+Ub~1^c~O4^nE&$(8UJg zJ|G9%>4WnbR|<0kG~uTRrWrKChU&N*b?oZ3Rw-y#$>}zI(AiLJ=LPxpb*K0Z&Ja3( zyHInY?i{sF@tnvEoSIO~+Q@=)LGW|Ws{kBh9L^8ZpW#XMp$P>ALk^B7=8bSju01;^ zb+WvZCFO8S0AWfV{V&x8B&O)Ki`Z+WZ~Up9q=>}a$GF%t-|aqH%N@?Y3i>MT#4WamuUyCCO{98U~66ci+clIow~>BEQfU?0HT55-qbHZRnE_4xIs zpT{(QR_aV;4d~;jTD&f`&85&^|%k%7#goXx-k|T<|RfdLzW{-Og^G>nF zCI!G;0KcpZ1p@%lfVgiTi2DGM{_YP){w9>^05Gw9wObXYv#cynnKyES9RSA!)-#2M42Vf_?cV^Yyhs`v!kM zd}o4GG5_`y3TQ{SwKWTyZ6ikVhrBW1?HnMytb8!v@-MH}+2jo;)ANxy3)_R^_a9sx z_l~-EwW*LV1#*_;EzT@N3)TjQK|Cpgqw@Cw8-{* z0gD%7j@&%fd)!sa1U_wPYr8X6b-`mDcljod`N2HJf%6kPHvPB3J;8!>A~EqXE@Y{g z6CZjnc=Zhdm5;o3)YDI@Nk2HsH}g>zNCJw7ZiNdxjqeWkP?LP}pSZF9#GhXhTKIkW z5woMIloEbX{OcTgZ^rJ+tkQs5{rH$OxVLDf>m=j65&8wXe0lfM+GsIuhmHz&}r-;QS2H`2B zZ>WD31Gy&v5L*INeNfJW(B!4kiRy58FDp!VqP)CzsxDNtwVfb2#RRfEFa@!(;>zWw zuMTEDdL4k_YIuJ^2;hWV1$z;sXh$sG*9MLC*s+sJGUTUcG8&E0L7@TyvE$WLM_gzd z+b^r(alXe?#1gTqQUi|SYYdlle;Ei^QHIYJXqWsw7s%Tx8#`iGnH(L)W$8=-KGlVl zNa^eh;_j0_;_3J^{-_WG#Qs3byg!Lgz{e}}Sk215(Myd;O#))?1je?2XU3B$0Qv8R zq8E^Yw!@-?mE*rluWuPFq&{p%9-)2@&ss4S<6lsy2FE$kqJH!5;C@Zg>VuT)kw1u!YRRmC0Or`)p2zHSM zX{*H#Z@tgT2U80I&fqAoE9Fs0)CgG3TR{O6M?sbD(CDXrZxOVxg9hp7%h@Yy)UVyw zm+QjDn3tU_{IEuz>yuao0tD7hJPK?=11v2AHoNZh?uRQff;YOtM=n+QtyrNncz!&w zT3TK@kw!{ihvlTEa!9N4pI~BnGm6`hI#hc=TjU*`<{stQCFI!&O#p|^*9`x)t4(Wy z3F;Ik2B!}MKp+HrNaBE|Uzyqj2@MMbyfCx6_~>%8yIVL60~8hj-v>~Kp|9;wK+#U* zFL45t4Jnih^{@drmtb17xrLn4kJ-@{HQtSy4hi>s!rBrz@!pbeI}&oV>YR@9%4&-3Rt?=aBr4)ISSS5C@&qbP z4g0X$8y?t&eKdUcLrS5_{8H2G?GW*Xh7gI_wx-V4#xD58$2lO=gAr*ZrvJQQFW7>b z$5+3C6liNo>RU4**zIhUir53-gWlciBcUWcD_%=4(Eu*C_E0MIP9Zgc4Mv^*4wk|c z2;5&79n{8(?aeABAB#zKJBlrB?DwQ7VT@Fk2{TUpuf zG}6PibvZuRozRiVt?sx|c4W#Z}yFEE%SRdFO@~o_}lfTz7_ln^rr2Bz@q$-mL1x zy3x7J{>+Mw@#3(yxB7>d7j?Od&H0tnKN4HFM5n=t*!=C=O5sebsj4Bt;)q`}zuwo) zyT~E6%#@(?-DZLXJy&?4+o(-sdaE_1#*+NziNz(|GSw1n3v2yZ*HJN$c{X$1NOj`U ztf2pBdhI;z_A@?T_pK5Ad``G`*f6D}q4MTg95Av4JQQ!6C;)L^A()2xE9$GrZ)z`* zy^dQFo_J;5F91D*@3o70zuTX4eWVN8YrVZsi5mhS@Y=+Nx>^x%u2&p=qx4I?SDxMO zVKnv(e%g8wLm8i(sr4|v5gW!Z3=(r6AxhRH9*PIzD%c^^&=CB%gK$c*ps)!<5pCbL z_Li^b>?dvv3G|X<06G12uFT z;p$oSfY@f!F6B-gi~ct(;LF7hc>*wmu%);2vy{a)qy;0KpsY~?(H56dHg6afP zD@84{fMkWI^hehu1;K(=<*7!$zq^j%tlaU@m>nPAQ4X$f*3>yQ`uk$#S0NT+GW(Ca zO3K?D#t-kjk=wf>6e;M{y_QrtI;+(EFD)Gdg6foC-`K;m9i+aHh!Ma(kc=dkKEl&gFhgMbe-*`lnr-2iwxiW*{))&xbQE3S0fHM%uxaBX3WVzq9zXWUYI zvah*FQs?%6V(M0Ah~xCi@@Nj+Y8}XJDM0M}K0C6YU;rXQl&fWd^&*NfWZcj}LiZC0 z=tmtX4WRYE+py2cwd9`c>(7;yYtDX3p1=G+&Ck!~Dv^@ttAEZHXKN=rV&o;C;o%ae zoN4K6+Lo3(V1KQ4Ix+phnV@-`oQ+LjeTm1cIZVd^G91_k}-f%WPbi87eC|98%^s*fGOUIFO zWqs_!P~mRNUPAo!w#)8U+q|MXWEgBd+w5u7J_m?>f0q|c0gB}Dch~gGSKfjJ_=aEhp#|nt%&>QFTC@8 zXXC?ju6C9MZmEw8dRu=jsF&`$y>%`DP_H9-xfGyCUSDvXl4wl-cDmgS03>Ort59v? zVoJFfd!SncXu1wygF{piccW=oWnB;(+p(+A#Ol)DANVEEf^lo|@APu|=z()Wkpuw< z!4b0dDb!XsU$fYs+9V+x;bF_mSA=Z-6@c2!aEzAa^ZX|SFA55(Tj7y>A<|A|@WrXW zuF0J=G3zmc-r0>I8Wc{vCG^X(tx?dv0Q67!1S``JegBmuCete&&^ zzpcCFM_aYc=L1Q3ZEhg$Pr+WypS*#K>XV{CjD2elJSM84IOsH&Dv2f>5CQ06)CHK& z#1GHwfbcJ`#m;^B9RG5*;^h8D`Gp_l?aad=hSDp3#g$VJ`DW?L13!t+qS~V%?D`4& z?<&)Ox*h%V*~4yoo0eD4akv{87jf%>7cs3jIPhMofZZW;mNCGVW!w^KN_1VB61zV- z`yMd_ft7RsjY8UVRNtwacfN=>?j9-HVBgB&rjq8U1u2WO8TlXpOq%|`tswq#R~7QM z^OJt_i$&zRW&-9B(04k3%PL*F!Kc8FsWw=Ag|+< zKv%%B6LX}BDS?z(<^wU?&fZdtwya}kt!KNPjvf~2tN>!oQvg{sK-eN%y~xVI%& zp@0?9?h{-eO#RL6K@kzHL4nP|!GZOyKH&_{*kr6@EZMV1$&T2cR|*v9#pFA8$iJM^ z%go(8uUrY3hcf^LxGnelB02Gu49;09FD5l_xpiK=G2oi1jZL_2A{;cX>r}7lBEmkm zz`*5q3-$zVz>&wl6FKM)I2GAEe56RTd$5Tq>UvF!RgQ@Ut z^#89d6gYITj0x-SXUbfxhs0mPi^oZXenQoou-Zcly#EmWcSvqFv;oF{gvGvA-dWgDzmnS=r*xjbjlqUZ@+H!u?5xg zCN1pkzD?eInXvtA!7(UH8qPI9;&Ph2 zqWrm=%q^3m+tS>k_&4*-6)KJj!CRxn!@>UT5hTyfA^+MeAih!2M`%}elA@^%GZ4V2 zpnEJQhIa9Gb8+?qW@4@s!zq*TwlTA+o2QGTt0&N#Uf#&rxIHn^ zsOJwc8t)$$?dyLcuu5iQT_)T1C2$?8+S@I!=B(WQW%xJAD%#6GBEk;+@diw2V zUI8K~z1uGxapJw1v!9EL8;r7HZx@^;B9T!>EcA#fzFp!RPQ|L& z_g}_h`3kW>7ps~XyD#&d>ich4`Cw1?kOvH>sHGF5;wDaI4`xL8Cb(L|fdO5*4Yx0~ zM819e_fPmB;yE{JL9m_;Dx9UJZjV-uRdCBK3RbsLSi&f%sM}u#$HYDm`>Y8A(h;*h zPfSf_;w(@JU&Dk0?wAA3(LX(1O|{I2dZ*6|D#AVQCmzu)rrML^@%3G zEmV8uN#xLkoMoTPqij+ZDLD}ii+ZA(T)(l(is-B|_is(8R>tQb^X>xW^1%W;1XfEL zO4`Us?ZSEeaDA)_`1!pH^Lpwn;tEYHTzwo}+;Kyme8c3gu~x`^ERaTs~5 z{g-#Ckxz)Z>38{Fx#=7%xl}R|NM8c1Zk_SIa@LXgv(mqM6>=+q?sZEiDh(Ei$SU4I zluq@D5=*CP?9;0VJzcKs9Cp){$Mod>L*7F*l- zCEDjYB}UpY5&?4G%Pua_G1n#$Z%2!ymCuMK_VSLG7H{StMSdDduD|3`#Y_zWfhf z>x9XC=bKG^s7%hRq5)G5Z%a|m?X>9E2gf)hR%GbY0<-%i>Bli8(?VcTt7+`J->FQq z=*yuxHkRd8qFMUAIsQP+!Bs;W<)Iy0$m`~THQ1J~&GLH9)InZ152V^*7P=Rt6wF-w zaL%sm>!4n?aPwlEv#6`5BiXzwk6wsZ&m#&oh0UjOx2o8mMPMLz=}$oVTp)Y_=4tH0})g^L{2~5(D4@0mS~Hao;~| z5S+E40jdX_;1Q<39>A{_Y2-UCNlABZlLOq&X-O|McXKs0<$!tcJC;D~hx=J3?jB~A z?p`L8)J|q5xwGn$?4L8MOdcSgg;_CDBJ1_N&N@o24#{@NVEk1t1-i=ov#7(D@<7rv zgFMa7TT35@R>O~DOXi;a4c6OQ)RE~`3EC}{uW0UIjk>^3;(q$Mh`gEz2OmA0o|%?8 zRxd3G%VtKH`|J8D$9}7A1s2%lWyw6q%)=zENfPIL4se-~rX0H3OW@|>hcmTbAu+W20u({;IEV(9E=HXt5>V-|XQqE`wTtE0}z6lU0a3Cw)y0&4+eW0ji= zcQsZ0t4N8L-=7e>^0x~{Rji)3Uvd`i5P6@T{by%o+I!&}i@`jDI|)&pByl++i&ofC z+nGmeXsb`9UKP@lIkpG@O2=SYFza%pT!oa4rJJT)u|!@>n#{V$wAU8aE{MBClm{|+ z0FV@l_Af2q^!=?PYB&BoT)v$)=+t2)pw>LK%V`}=2;|8YqOMxJwr75h8RlgvV~@_P z#iYLZ0M^ehytj>I{x?E-SMg|may)m$EutbAb(j6ktdKutQ1}2gI`YKI3&wwXgmkkp zQLUxHQ_#7`@$>(%+AMFp^+7u|U-(HO@@a1fAFMsc7Z}^I?yl3aZ_)|^=orUTH$-*W zDm-mqU+LS*@HeZ;_j0m~o7L!A*m#&&JKSm&aT#}~;mh4Z|1l6QY=#8lUtlIoE(g?A z9XJPBK>p@Zz2+y5HP1CR?Z@c=4g$adhO|+|75t4EnPMr2&%y>ZT>dJesqmS0LyTxE#=>tDXfT3Fce44g8a@(f(q zSzuLe{+m)GzDiNdFQpYz=!@#WkT#^a;#D|(Up1dU*@vkH!vd2DGNLyE;TrQ>#n-lKlbrV zm$5=($WU_}xu~PU{;Rpr10ePvB!F}9cD?{5C<~P4j0}A1D|I>X-uq}DUbbS4PoRy; zOjiV)_#f3^|Fxr{h};|(GNh1be5UKk$AO#ORgT|)?YJ2b-zKN9C8q$yx8ZD5q1-50 zprId+0ALW!n0G2I-sSKEl>4t%FuYP~`|iWbq+x%mJCLmG-_nrJLH^W}di|K&GJE-v zq(}nN%inrZB`)^e9wF5WXBuKZe!0QNu*{k%V-2_Smm4dXyq+FEWE2vFVt}$O*X}ZO zkq!*RR!UP`txnC>|p1~)DoJW$AZoRP){pD?i2uhU;hUP0m%MUaG))!+pXVG6WWxiKjIcE zo@`p^_)Nd`#`$=W)2bb1&;++CuC4L5`~2UP)xTLO+++90eCp2hPipda@24;$U);$} z{w>0vGVZK{T#OBxu5#R7Zb7!)& z{H5&drF=^E@={KI>96$Um6ZIPrRD70uXr*sjz}iqeKSbJxC|mtvjs?zENtTa3B~Yk zgi3Ho^!iF!&R$X-{vJ-seY+Fu3b4NZ&xPQ8WJbdSPe3>$a_u-cLJS?JA)Tkr*H{sW zWKTSa>|a^#-xR}TtqxSuFZLk|j7y+L69IWB>(i^wilxW(99`XQT+S5B%W>mmt+X4? zv*XAC&nL5)?c=$g&(l&pPWDqy|2#=^oL?UR-mnF}8vy)|VF&pbh{b^s6|d#oqc#-&QX4R}Rm|%2pZ?$jK@X4VjE9q(jDIg5`i<_7 zIkc098QR^`MgU27za3#W|H&V29nE%~Ji}#{iG2NN8ju@UdykWH#hs4SNgA!#hF-`7 zGHOk`9InTY^^tid{v!h)2S%oWj=~+8xMGL+NdWlTNyTG01oHy&g3B~wYz*Roz17bu zuu^mn;jUA~JT}YtwqAM(^}mS?hnc(6&+B;Ns7(t;^j% zu`1}~+i^jCU#8*KS7A_|U0I9Mm8B9fs+w-!!Wh*MU5E2Jd-#{13=HaSqM~4`za~n_ z80O#_yRuzm5BSZ#>g}8#5XR=!l=+8$B=4|Z$FSjyn^I)ik~-B)H|B`o%>$}0Tn@8t z;~NT=NC`k@wwTTQ{m0`?Q!{Db$+4-a8x`^tynBHDTHk-E_I4>1^~1h_o<&P8w`Lmfi+VXKwFuWCwa$Uw*HZ#MI zs5?cOFdITRMk!(SNJ7pZ7Msf-7R2cx2KmFi>@bP9GatKVh{Rm1LostbP$v zI3$Bl$rd;0X$v}Zv!pnfo%Z0<2PSOe9)|Iz2R+rhzKtCc?Klzvj3~wE!GR}vkyH?K>Wcf{jmEROvCVH5HUW|pdy^D8{J|HB!sFI@Kp4xOtIRL|O*PcpLKyJZ^G5S>$Nvnbs z7gWvZu>?!tJT)OG>-f#|Tc$n@qcJyZvP5DF4|#}D%P!~1d2g19&))Wv&i8RGEMss? zyi^!_TObTFubQ;(i!$fC(Y<};g3_`hx+&Ki;GHS_zA632>)*g^eZk&}wruuxqj99I&$jpncu$r0JQ(fhZ=4J#3_GLH zyzn%`8|Nrn{w>fml0oNn;}t@<0yO_edzxX*GnV1K6~mz{@E-N2U|KW(5jzYsm%~y2 z5Ch6wS7_FUbSPOz+U$65gZ(+`DcFU46!xdZr-F%Z4rjyoc5Yz$o3X}_;0|(sYpVKu zN(01N1=hbeo3hs*v$=zt;OB$nQD}-zV{O!q9c)Fg4v<+ z*^Z6v+N_r8wupC2C&n9BOD9*W?#=Ebb!d&2qiHo%C{tTCWl9v9tW?3_jH3qz!(`Md zw$smHydrQw6*C1zM>Fcx>3i(gR`ktghgd5>a^vg{tUeiI>u`L7)k{ZPSZy~G-#C8F zOz=k(U9YwM&28syA{qcIC&C_RvO62#x`|978Gr|ZSU*2>p zs0z6MbErJAtJp34DG9jq{=)P&Pyd#TBd6=cje14nk~k=z5`XiUMV~^73pzGmN~e&A zQ#Ne_{LswUG*R%+>Z_ap7pE7mz1x%2b-D4+6}{M(Q*3?p{NmjEPnE}}{lBgp-#WXs zWpOe5cVWBC!oufozxAJ||Mlwjw;x;9;>PX&wqMVyTAVzn|F;AdERz9%cXI&14B#z5 z1wa_fd1Wl}J=-D0Jx3(2qYU#PEJKqK=~t(;2Pn4?wluGVst|4LxJGPPI#v-}c_$`7 z-&SW4BU@!2mq?9VAhh{jz*4(0eDk8DARR$m>4S1KECe!?D~2G#lA#*`%G&`wo+&A+ zB)T{}ksC+E4w*GW14-}NR*j$?4RlPsZi*LjF!d+^^ZrUER+6*icEmNrRij_k&WB_X zj7WQ~NFiiemR+jH8m`x-Rf0^}4OXdtq_K6GGGMImNbbsG@rPi)s!WY`;r!)t0cmcP zU=zC;q!QIH*Gk`Sfx$1+z=*AT0Kl-k0&;jMVCt65>)v0v`BF<=vv)FkYLOa|v20{; zpN1MH*E%+?C09nzYqVt88Z9akRM(Wsjp733;scMS>w@j0zyBrG?pYCNqGi(MdnKAC4S{8V+)a?+t zMqqKDo3Uk|QDbAe8SVjfb@sD>v28uF#aM*Mu_hsXmBt*YmZEtNF(t7jgJefGN8KG})I$;WIKE{Nf8n3Vg zl9(HmCyJ7|G94+}u+E_!xKDA`Bi7F1HXO#}kZR;He{OEO3O6-P!y$5aVC$9d#>dh5 zazz%tZfJSYRkb%h9>v@2Acm&gs|MsG3vzI*|s9d@8-D?nb8{*@jPdJ%y?Q3cCoMHsQiZdx)tRwOy?A z&MD=oo1+>gj7n$bl-;Nq88USDh~+*V`dZJ4&7VQ<7Gs^2m%BMlXXy-F8l`AgxpC}T zkqT!$CsB)_u==89G(F>LBS5=_01J1&WQVU?m|)G(IyV`hA+o9Ud5ByiuvlU;w(Mi7 z9A26hI$(;-^jNI{2HlDzNQ*H;Vi%O0RjXq)OxCC@`|BP?p@b02a75;-Z%qQ`??sZE7=~w%8!sKZ7Rp(4KK#1Z;sLe)yBYeAI=7NX zgBrl}PD+mC|i$mw86{pc0yLY)sybs z4Q_H5mOT8_m^w~AsJ^EDfAwwk_v(erubWC)8_XYO{Wa@mmOtx3RxBH{{KoRS1!RwB zJ8qlRuF9xMwWu~p(?BBm)R6~;Q6f<&PLs4mGF_)ht=3mv>7QOOUp0Sw$%a^>&9=oB z*#)~}-?wvioxzD|wz%Xo5A$`NV4h{CT<-+uxyHGT(P6weV1@)|I(L!_kKRs zXZlIcc;2rEgcz7$hAbRHQlNzGa1_QuOmcx95P$&az#T$>2-yH(6}lsv&Ou+gOG7k8 zA^ry!a1FO{KR@MRj_@L<5JGxHKmw!}4V1f!70*rzS1VS8SK`|tOgDtoQ6vSYa3m&=R+q{O)@(un(2$2Me zC`JWNdJNDod zdSMtQV?L5Ng-a;oG1ADRtj)U9O*-mPjYGTGE>{=A0xgT{@79c!zSgea#h=@E$w;Fl zOQAIFoPGHCx+*D-Qmc#lYm8^rW=8Q14(Zq`YKD5Q`@Sqv3RMQy>BuJX7nD(P~*+$^t^R2lO* ze)b){&(C=uALSqUYkt&6{YqevFdOipK5*gxqAgCbBW}g#aViQ?Nw&00MOsP$>DM%u z?7Z&7Pd?*&etWu|C6{QB12%Ai+x5||+Z`LSX&bYctws+ciKxho-c2a})ymqf*3(8h zzDM@7PU}^@wfA*S5A>6+d$9k}o(t$)vJ!o>cRu4fkv~+w1yfH(axu_7AxK77lpq zM=`HcuR~*YbujmpU3h=|b{+7(>b=njpJtz7pUZZxeboGIy07!S>UaBW&kt$8WxsnP zIl28S{>`&xjxK015U?IlwOZEf76Kpkm3?cc&f@d-^xo4VZX=l}Ceat?Y9h*Ix&ChNk~*=Yg5hPw)j3$GMlB|B{A3WZ01Kbd%sdTgNU2TB$cLZ+3zNr)%hO8|hFlK2iyb&$MJgFMPoExr;F5S0#m z#uhiyk$ssgAVF`+Xxe!kWZ}A6{8E#xSkzB0;%iv7czIh6=s4yUtjdj5#E2_bZ(EwS zFpVoLmR?qyPLq9JbV~!ZiE?%@Ej3J?2XR{~fU1Weq1x5}&|3=fA)%&<2&sC8NjQdB zPsZ^0>Al+`sN?Y4f|hi_QBkx_u_Gi3$SyiUOd+Z}QcGv_^=x7ZZ90KkGwHH>j@U;2 zIp4oQISN$aB?pcMBB7lz!Y(QHby=Vr>S7@@0dy)KP>BJd>RZq)f*gwTNU;_6s>Bq~rGk#d( zZ3J-d5Og9kG;8%@!LqQu7~EoiITr>|bfnki{Km=B*WQ+PZ+m$Qb;t_bJeqn4)vDFx zD^!{0AsO>sR#=#r5ct(ttMD$lvO<2#PS6)J_vK>OOArRDYPCG3oHijZ`$YPYh&$ud zAY12_d<13lItq`o+Gi*o%4yAkXTL) z&H8(w!T;ThbdrG(gmXzVc?3#;J)w|OmTzpm z#u|jnraxp3*b<#wc5h&DdKza@*m0VK+^_rSla#A=EIAFk7c zCd=1JY(5J+=-v2R5}JqkGJi=K7)z(`tKgtTik_LTME4ebHNqDR3>12dCLZpq{&AlA{nBpXa zXn|S|Rk;68`-G}ulsU51<1R0;WPGh=wU*i=fu=AMdRo%2_gm$vWKax*F$rE6XHWHV zq>KD4i>`fcBq*wnM3A37s0s&{RtV?K*L)`=hL>(UYJ;JEHRreJg>HKi`?>Udd*4P8 z^9Qk7Rf+g<%;mC%f;d(I7545KB^M75gA zl)cKgYK1)V)jjeeB+`J6%h4@vAZ>tPQcFsVXAh(NyiozIZw%N=X#H%ulaK&-@dl8{ zF1_b^P@q=hEoXVrCvc?*TtQ&#~Mu0tDD! zN00zQ>t0o|?FKsKh$caIaNpEiBZsa52hbW}om%N%5#H2Td(MsCFV|^{?nL(Hft^M*DF=x^i5^n+ zer%x_DvptT`tTfn|KrQ#aB#}{#dEt10>G}Xtqwl~<;uDECi(mpklOoXcvxMuOIYW4 zsl5?3ZT&$iwXs2zkZ%}nX^p{c&dKA76I@2Kx}c~Us6z15U2Q}v+~%ZoiWaa%dN#MHTj{44VExvK(=#pl9_8s}2(@T;MTci*jGOmoLk zJT-#R(ifu~GgnZNFy9;>u>+!LUW#N;UK4~?h(nKIH<sO>^#Rb%`miLdhqO2frc`zz#Kn2 z;>?MX1drUPlktwmeeuibyM|P1D$g`%-^IUTDYpTp)2)^QssnW_U=|Br01!13g*X@mNJd zNj@-TD(J~tf&o45wQNueTNx(A^Ev$_VjpLv!N8<6Av{@x5G>?4>(Ks9o}r;1z_O61 zg;cH*Xnr%e01_GXae<3p4+j(p-dZrgWKmsUIx2I>33ZtsLetWrdB)JZ_z|&hn4zV67QNKkwV3krxCSky-{Qb!jb` z!+ZSeqXjoS&KFgdClx9Z8>nTeyhHO&Yk*wRGcz=wf*x&xLZ6YbGUT(~;Nn)VJKT*6 zEss2>Mg-Y$ z&8t!+GxCk!=eEQY4D^m(I*Y;Fhj^g15>oXwfy0TXR-y+-LMER4YZ>1RO_-Sltc(rq zwI>ztn^XB@Z>=!CRjI8{OuSYO0!mN2!a--oAhp%b>@A2{`kQ`wx`e`x_7jwj(mIn2_O7a_&q z=9t)r?#O3v(0V66Jb!``{G(cex5iO_^t-trqI-d;AZ!?_-AF8b(VILU2bgsDtf+1J{VBnz^I{G-}p$gA!!=@yTNlp?$2f zpg_hc+fm32Wyh;dtb`0|ENlS1*;${aUQe?jsfL(w5(mPvxDS21)DdvAwgMmxY(={z zC~|Q7ve4Ek)u`@Ui2YEWSwLTTgttmStT3i5+@y~!s1S!+67Mx`1(WhJL6`ccPB=xf zfmWXr?1VHW9;?M4x(``0eBvgXBDr#~dTDrI3n(+Bno%8nWh6w5-SgmSVC92X<`|06 zyivBqS%ZW%)`Xf4X0_!~)^Eh!VI4cS%Q+jPmXECS; zEaf{=f_aoMZ9oG&$;VYF5%{#XvWa7$D&@x@=&rq;Ca3edMIKzt4@+NCHZ_;n z`shX2eV)o!@ebnZleXm)F8rK6-3-(dL?Yd*Ame^o7h*?kkXMqN$fD3E@_1;)R$c6Q+nL}dY&nGu41loLK zzodXF$Wp0?7&CGanLG@wmIf3kY#YT)KPYS#>pdBqh)`)qCck?1hE4_g0Bvt{0~=zm zMF==;k(BLn$&9KAn+PoqfPgd$YN+dM=HLWd?W_j|)kGj;t&70@LH`%Y6|snTOHz1+^a&2zBUKJ&ayZ@3pLPQ zf~^Y83A_zF;URRd6o^STk90r!6EpSB(bg6L__?R+P219%1yYA5p_3j~Lay7K&j}S1 z<&Z+@Z~FDHSIT(4=-D8fE8z#m_Bq|p7I`BcpGg?e30;@%>@;6Z3)V@u?VKRgP@_j4 znhVt~DHxX^*me{YfV2?dqD|$gnmJsHY<89T!Cj+?L;$IzmrcIYg_ET5XNi9V;ymnR zs>2#sk+4j8vVWe=2!L@`(A#dW8U-FqOF3D@5n8GnUkn55BYY0ihpmCfIRaLTfq}&_F$a#ImQ2z#Ie)8{1X8kx{9hoeM)j2S$F*!v zb;0}b5WJ;i`1aeqC6+ZT& ziV+jkQyl-n22(RDU-`0TBIgOX+rz(}IPYa+cp8Fz9wsNh0=lN}mCw_pCt>0(q^uh@jB@C5h# z{N}DrncX&r>UYT!emwnxdla(-Nz90=g*N>3cQJUf4vMaKnJgb3@)6GD_DN3-deE~< zQMl%j1oIMN!}?iC(A=)jouNUkA6Vz;RRXyn4_3tB@y0??MzRyl*WPk!9KGWTxI|oa zg|ojl-1dgfyQT0@OVuO}hl!g!kt+d@dqAOQ+~wXJX6|6&`jn+d7-Hx+KJ@kg!1RTp zl5*8$y!)6PZxTfzWlJq@p#~CgU?^Uj1yrm{N_=I-4VG@+ne_k^G(ravOh!^9=%{b0 z_I@=j$aADPET|pO+~0pH~T z;u^hECfLvTsoBtE$MSrATWRN##Vd=QyZNK0!5fY~?thT>{L9~cMVBUraVT8<)J$oM zYW}Xc-~Ra#12R=BU>;}3O93*F_D%_H2;{F?#|_niErEfN5moKqN>I{ZIuT=FW4MA6 zOj&6s1D$PW2g1V5?EvJw86-Fm4V{Pp9lD&Fu(?HrQ^+_rsW#Nn!Yrq2&4B}pDiS*F z1SFTlS&H3H2_3Cv6*U%bHwTI6*Ct^amx-YRKC~!7W9k$F5T}q!L4E~|=|yyHcy*qUL9m$|`(eFPaFLetUgRoglsjdz z!d~LR9(XQKJz`v7C!d~8nDaeMwI+m!p&SSu*Qt!h7(;!6Q{jvATj63Rt}wYAF9Xy& z&2i}fuos-67)oRT)pkCHSI_{DR60^`FYOJd!8Y$V#(by6Xf~vJJE%0RbfddXciA+^ zZ+Ip<6OR?!!#lh+3MFWJ{gA@p2k)SB0lh%k6CchN(NwkGmkvzy?FO<` zKYq4r)S>nC!FRF-a+kixec&@k)JG&}i(So$OP!oOi9>jVLdqo99jWMX2K z2oW;lz)-c8N{=?TO8}eJ0~e$NHgC3<==k9OF-n`rqeGej@dE(KIVNe(Y^ceNI=hI zYH$(A*Tvi^La1!3qun+8Km?C%a<1l$E zoyoIk@SUplO&s1O)5ZB<-jO#$1K&`H=Al#4eVfTQ+nR*hC2_JVXDsyZ>T#S# zi=TcNl%VvNKP-@Bbfd6vGJ3B`h?rBD(B^x#nE)C5NpvBB7{k$&|F}fu5Hp803+jXt zcVL5T!-G-nGJSU0;xHD4_rTXg#r8Xoa;YWNcTst&s;Iwl*E8io?sZx(VfGB z&DgEmjdsbioK-Eaaecj>5*t5OL$+@8ynt$mQq}d&OP0ZA6dBCdCQ<5ZMwm6yl6!k4BQ~ zl7HHwR#%GzRimgnX-{%yJXico6}nH0LsOsW$y43=wXv-GK;Bcro@EboY;jr#Yrfz1yx9(gWuz( zJ(bXkLs8p)Z3C-6(|X$saQFnf5p?rq#WgCf3SlO`HL9ULOfaDjo~X8yx4@lqM0gz~ zsngmdQ{&w0Am{{INsrit!qQb-z8GP5E8YtjxI%AVST{oxXv3J>7Vj!igPKjFK)O3F}n{XJ|$-= zytV+qw^&iZWG9pALi00V=8N5dIl*swJbgt%Y<84zj~#%WvF9>{!!lz)#cGb+N71%FD@Q(BA>H@1gy|ehtU7E-AvoqH`!33=<_>6Y!Msq_ z6*iL(Ap`JQy1GP%x-~6h4uXCgFD#g9S={FX@k{X7E!b+ZD!UAj@Ez&(i>U^_>Dk#~ z1$W@z#Dq;qCV;BTy0$c5ja+MD>s1_d6_s2GN(KrxoPB&@_eaRGXw_W(gh;*HT)e?@S6a5%(NOSa5e!(FOGM;)hO^K z_{gCF-1RBKM;fBuwgd57g6q!i218_ULRZ-l;hr_$OqNL!UDuWS5MoL>$dr=8<|j~b z2x7CEK2T0?Ziruk)7e5zQ$=t3zXv+eNY?2hka%e{hb%k{>-ROfJzNuWB)XdtDYDcCdZqk7Cuf?xWcrIFCg>U|rkR&N05AWb`MqDuzn^V9tt3yhwthQdcD1zj)F{W0D8~&r@89O!wr$> zT~PSEkqk8QyR0Tg9FC~etzdy0q}$TBa1_XYjhM1p0z*v}a4X|L&_rOg$qt6;^!TG| zl1%6#AcTCN$T;`JKDibCDCOPdQ1HwP5O1seS9=Ha+HjukgqeC590x(J##P zGP11@A+ErwF7o=D+R6z1c*m6FQU@lvrB_GO`;}^iZ?;aIO!k)^g71IZL2brOGPkP< z(*&83@%akon#i@0!6ZhD4*{{ot`0Wm7~S6c66LlU_Es}Z1Z)^81OTtAkcMklNo=Gq zzBZLd-&*y!q`K!QUx!Ay8|+KdU?`Eg88cD~={N(|h=@2Z2pt%D7?qvHfkhK-7u&8F06>mr=K(M^2f~O%{1H(IC(Onu=FlGYG6HIo?H8S*E+-sRD-l$GEN`< ze*&YqC2{{e(Wt0P62;b1cX_iUAtf;(CX(Q-0rq<_heVQOHg>a>Y%Qf%-@x?wF)Z8g zz&{UdTP;_yab7@?7K=_OWP39MeYVh(3Vp36SJUyBE&*LHCl~%bFkmuD-z>9r!`oKF zw)qw1);~Ox#A_P}{K$mCxX-wm19V;!Zj^sKI#4>VLduk&-CFqH63&|JW!uV?tMd7Y zjfvvJ0%{%SLl=KZoT?h#sEEx z-1)HpaN0}Xs`1_e#5?}F90gi9j+Cv9?hcr$!-~s62T+}I}Ko0i{Rm3IuwLQj#O zYVuo#TEqy&Gj1!AYAwOY5h>)RNI}DHnj#4u$rZ$>^bhwe{nMi?m@3Fl739FsQd%*n z^Vf*Dop}d2FKVn-Vw+8&cXn4%S+{#2y|8>&vdw$06&thu>l+jDy81S4WU6z)7eM^U z6CjtXNn_u-tG52h!FZYL{s2ooP(#Chdxg0YV_jijZ=yRSgVUx=8)j+5a9z+`PM_a4;4)nGO;c)EfFA3n%WJmFreoR+wY87@xAiQg_$$eS8S(OE-kT= z$wVS|Ot!2GN3RY>=k_N+sUQWrC*-DnWiH z8ZRfj@WDD3!&#xSItJef!OAi5YAXc!prv<9ZFaaCAx|KHw&6r|5CHUW{@Rz1Yl66} zz?{dh(7X2uiDUb3&WN^so6+u&>4}R3i)yCmzbaxa%$AC@0eoCfAA!k3H5k4)J(f_;r? z1qNPjP)=*|F+C2yF#A=p!A3AJNe2}Tj4(E~Ug%BQnPt$uYU(~5&YWvKKmFRte8DtU zbJ&ysOF*>0x||!_a%?-P8-=XU7JA^f(Iq24=e@(8^htNKZ4dVJMzY!RML({Z4EkNO zGTGN1oo8Q3jr=(jBcz=}`TIYcK4#K~(bQl&(>;sPIQaD&q07c4F0k>i0)Ok(fm;SY zf-8Li0#eI=Yz~M696-CkH)0U&X|Zb6`>k&>^K>Z_;MVFaB=9{z7&g#8y8I&`2Bf2U ze}E2jG70aC2zZ_iLo_MXt6vfl&oA^`~!HDq|?(40)SPVa!Ym+QX%7HlQ z9uZ?o9Um$y)ygDb>&Gp0SfTali*dP1PQeP%bIH4fAU4_=z1|FU9oCNO&}WN2thVDu zW(U8wnODpdEmPSB63%cNgVkjiW=Gngi>8xjxr9bz4_GX= zFF@0weY75vBuC9($0k&`M)ZID@pgT+YBAUb=M0^9Gn^c67pf~$0&iBZe>PIlGmIyy zstb!_tdvm0H^$VXbW=+hQj_$jz&7H@c=^6S?`Bq5b)-e`8%J=d)IvxC6=oppPSZ+L zI;YUiqN5Z=P5Nz2$~XwCX~xT_(yzDLm?K#C*|#hy8mr(MNctq`R##F#p;~3IEma&4 zQw{zYCZ0r5yva3d8Y#c80@9yzqD`pL0TQexNVJ`e?-uzaE>#hb^tD}!#M{%}*-d=Z zWjXOJQK~-L`gZmtc2%wI2?#td*IK}!Mov$n@(QEY3o8@yt5BxX+R8JCwQR@;g_B}I zGN;aiv&RxjWv`v1J~RJyq~p5cq*IS~w@}>+(JeLBClenWE+!0xQ)-url!d^l!N*CP zgNRKlh$b1%LFPio&>K%v4T_)$2(h^E24Xyk$)(asi-jZ!$d97j>|jBYmQ&r+jVN+t3yVD5Q&$=jo8POzQjptXg^HL}PvOKH`H^QT0~<6dD~pG=4EkN_|kMy}WE$|8B2GhrL#pL}aX z_F!N^MV3HAjx*{qD8@zdOOU~(Gg$YXW-2Y*%?;P!5fbk5TUrN^WwQPYBXFd$tb%=9b7sPYn35! z^M`6Es5lO`6cQWrW=|HGqM!V#3%Kqgte?*tdTnTQC zGVC{V=aq_cOo67kWKkcl>>_x6BBSjNB4mouGUfdBq;QqC+FGUVqzC&MM#-Q6N`lTP z^)?ak^Xu{LeIX&?Obr8HLZcj-LN;a(VG1++6iw|H+%r0oV#;6HPKtls-jedh#<2#@*tLp!$yU_r?Bp;J9w2$syIzS;mEfmv&(694*?tjWC1+ z5uN@ObB3Mddn`NV1z81wZLr;az>IjPN=W#<*`3ED;-=f-+$BzLYcd}Nd?7}}K;Wt+ zM#7>ucIm!2g=>0aM0`jlU=8Dv$m)!~mcGGFXwVF!IX)w8f*ov4GpQ9!`gcsnl z=AuKkP3-XKltAT@r1ReQR6em|cy@c3J2P7pps0bFI32)a#Xc9_#vk_>`*x}Wr2XmF zpzd0Th z&eU3_h=&yRCLhS&Y)vcEph(uZf$qW(T5S^jur%L^opCIA%>rS4h;h!VHg4~&6F~w- zxdOs8C4;)7oVN7(gQ9rMhGkhB9U-<|lP3xiA_|=mN(Oh=W)3PN4f{|Mr9}5ec>quZ z+eLM6c8Ku2=+=g03NrDJ9W+q7@9nZnLw70YltZs#Y2GG?2}w zg)HO5J-f0K4e8i<=AFUb8qd+Vh1HeL5xkN9drmz7m}{$e)oUrPGX`#$CF1~lbqZx; zV1!@cMa6tNGC^TKz~s-&H!^pPp9~8|w^1rQ4VwLfT}y|HyqJ>*~?3=j3SLb$1TjAmcZbqYwf! z+vf$of>p3kpT~?8%a;u{{HHN)e+{Fw4p>X&n|8;)gEH82DDE12p0C26P1f3BwisIf z!+xjce7Tj?T~q*RYVbQBI`6y;8y;{=#9%wB^@w#$4n|qC4`g;Da{vKB&cZfPiQo|{ z{f|J#fvBHi9_5P##G?xIFtKRwDveC&hh!m}^`Q&7Z;B}c!A6vLO^UGdb4h{{1*Xm^ z^~P!65sAbPTki3f)u}((+vMOnp(H5+2VptW6JQ*Nn?rJ`z|u_pp6N4AGxMPtO=Ab7 z8?`X{_;ilCCeSCF{Q&GJ)5}bE{44ax20I*T=ARVhRuL$GO*W_g#>Trd)2pfqwWPcj zEEpxJt@XH(@MMRi7oNE=a)oP54d-dG{Am0bMvT$Jp7cSf2W$+4(R?`sMQ0B>V@`#g zl76NjTX{hW@@?nSQAj6Nm=}{|@nq_{0&R6Bekg_z>yYLfL*tgO>+QWxZEW-a=f{8z z3v^P|0|mL;u}|(xa;n@n{2Ht~_+9gqp4dL_5_!>1wiI})d!kJjWElBuLIJdpLj!Lf zok`xCct`Q7eTzHP(2~)kNq7sh*lI~6+-6&icLJ}e2#Tg=5R+2O$GuiVYSwfR4ZHOP z97q=lPKP)KDf9k-B_Z8$qCR5wqapFzOn_{M+5QyUuOY)BPcXDFS1c#4h{J87$h?ox zL>^%v!|_0mlaI9~EMxcgH4|zUq~X4x5V`>#ZR$Z-psxhHQ2?bFy51O- zegxe)SC2h}7Pb`i0gQc85T$Jt(on`INPA9uh2A`)MmMmQGPN(~NUQ6TPk`&@15GWw zM2b2o9=z8T@&pmEFcwrAVFfKZ6-JgC5Vk0snL2{-M>}e~c75aR`E3*z9>mBPh$>8l z-4kSC0rR4J_i?jNg3kmGXP#GQgXzxP_Prx(w?)a(o#|E}u5d_(`h&S?6Xo7p>bt*s z-p68+sb$<=I5Zbr%BDSv>GKA36YlKEvk~@XOK4ULV9{d`b*ln+6B5KjN9ejTS__*i zl=lyFB^EjuJrUf2$GTEXuNj1>acWo8BfKaYlk&Efcv74|!#59M8s6Q7OU zu47Y!RG&+mYA3nKGJ&Zeg>8&y{1eA#jKrrNfMBVEtKO|XDa`5$ z1VZg@pHhW0#*C&U)3lKY%%O;XtPj^!Gu}6y1obK`>^KPg=@^>6Z>BdVG*7T&WogVT zLTEu)e=|Yilm=8KiR`*F9H;620Hg3{lU>*W%KNA@gf6fAAyiXIW4xwjF@vb)m$`nqAn>4m#$g9vkkx*$~KWX5#? z;YW}2<6DT9aP~t)e|z`E8UlqHKGhmA9GB}Z6gYHFtZH&dvrh188W9r-GBdBvA%Yfl z34_Z#!2pa$Kw{DlL32QYIRsxuOdfi)FlO`kYWd_5pkwm~H9y%698ciG!A|lJV&U{> za1TzDF*x+Vc1myKmr7FS?p!Kx_uL8!D-#{^lex_!b4iG2dQm?y5>Ris`IOUD z@WvU@OU;iS%gAV&Z8$^wknCqR2PQ*-unfgLH_9Ra50DiZ_vk11{9Qg%Gs0qg$|4BN zCOO!%k2d#w<^CD|Wsfl;^P2oxAWd0-@op&|y$T&IiFlznl`GjxvR%rvEtI{f6iQ?x zinB5v)RgXCA|Yext3hv`M-|^ARg&q(+$ph2{I2{!B~KvsA62z4RuG#C}>Im>C{>_y<0PVHBK zyY_^IaNj8(=Mbie6)YT^?I1!I@lKyqRGo;;uepCe<{sBIDLm2UCAsG3)(K5D^H4l zJv|t=wFN$NGdKq|+6fb?Jnbi>+I4UZ1p3Jk~Htj^nOik#BX0?P%CulOWIHxbDboxRmE!D)N*;V4800DziDg3zomI+8) zwi+21Z7FSMPyfE-E#&4t{kh{U)aE{&vEv_&4TFyP0(+Pm&(>{#ni+Kt5hKKk88K;gm6AC05dx7i9;v!RN>u=#`9uYJ1}M;qhQjb_V>!awG*6%(MUW=) z#i;+hSTZbYbc#=27tZ6(^4DD!2xw-2j_+4Me)gH=*9=T~z7^}jn7568XwAkkU_4Ev zlY`(poYBefIPH_(=9vMy`unCxcS>>wdkPb}@XYW_(oWB`w_Ni7xw+`X9X8EVx;IGs z&krg=vRAS^VG;)u`QkDcY{ZS2#oMb0f z{IsSjx<=lO_oV``z2_q2*AhinpeRc&Pd+c>k29&G!fDkZdZvEwg(;$z{6Zee1Q3i7 zlfH=kOfe`;FtC#ze2tRI!(_WD1sj#!^9(rW2($t(XY#lo*wAO)4K0-Sod9kQUPZ4* zAqL=l)+pvNE?CabSnp8!#Ga7bZT2^r;etiXku^{R-rBjD<8VFoS$B7>2|oED@5N&= zGG#A0KM^lYvfn-&~4_^St#KF*-)+O-u%{?sE~-Z2B+ak5m!Q_CX{xro47^MMI`;6` zwM9+b0pZ@j@TqHs__s7CCaHXJb+NPes(|y`kre2u9SoI1ow+S3CV6zMa!4?yC69S- zK&owSUy?~SV56}cZyms9sXwzDdbu$?*y~gdfSU>xD09{K!|P7;hz`S!Kw?Mp^Qym7 z72=bX%`xLl9=e?6gEyg9%zGw|Md`vdp&8AWl1#W`xCBP=Iu@{AgFE< zLc%hRcWL@xzGMr%^z@48$HZexTgXrI>pb^G$BDFXJ{*E_Q35ITV>6r41w`D(nr735 zB4U$b(})Y*`18$#QxVg2W?uAa;mHhl?oMjSn)9;fOeZsjNQFX2*TSH((6--!j+?u> z;(c6oWQt_pivbiNY$mnt{Yce%`zP^8s6FLk$f5c9O(bxYOfLpN-rdr(q6z z9o_sd8u$dW3aC_)hdm7RmVT^v+do@PoccaME<_l~t$LK`uzLPu09f?V?tz@eghNa) zh;9uo_ayJkh|WkUDsLXM2%+J9UYZcrFDlHA{DVT(iZ0CweBwV$7;s)3j{wM(+!`$f zIWBI6_PS1hE%8kr98-BJ9CAh6k2y7331g8e_Jx2rvQ8w*lSMS3*Nqkfu01q-+$!Tk z+|O4|rl#4v-B$$z?M@+;wD!9fr&5j7P}{1KL`mczWCa&LV566^MS!m=v?1RGMwblo<`%w;+1^RZD-C?#ugr)U>n2m&9^g7XV>V2Ji*c8hC-ga;JvFZ+gA zFZ-khT>26AQeMrGWd59q!B^Ynq1+7=-^4!kaBmPr;HCD4$kPutI@mwumPmJ5tl4G8 z`?~ichjBqdnu8Sv2I!AE+P}cNZ#7-DCza|yI(BkAlPMx5CRvDP$&A{Z)f#FFgtnUJ zYp^*F#ZN)oC<2I)6ZvxI`Qc)&@lopr>~i5=GTOMlGu8Ct&v4X3!(EEDQ$3tChAp(i zsU+quRWtGNQ2IDg$49LOjSn%Rv?#$@%4X1U?et)I^4 zV}e9*rk}@5%yQTfZAHidzDOX^pwR~dgxembDc*ZT-J;-}dM18l$8>r2jGc;X7wMhR zLIG$1USk1RayNHga=U-s-vsZPdPBCW@)O-dw5^E&?UYJ-3?2ur zOi?|;f%hX$xHVxkBREpWX&PwjNoPWJtqL;L#L)6!1 zZ9?{0HB)MM=_?}4QL6hftze%RkLn9~U~EVjd1M0G?LgF`orceugZ2--Gs$MIQ`(2E zM_kBS$SStSK((T4%ku@I&)CnwTv=HkroE6d=K0gynXt&*mQqTwP&CLeRV@z7nteZ| zw-fD)KdlQFP#fZ9I38)t!iFMw(qujK3Y&O;i!96y+z+EW?p@r<3>eB_VTK zdgJ^wSN&M*E^na@l!$Z9q9*%Ys5j$SO;+$s z$MmBJS;&up!46xXRL}bLCNkeWoKW+<%?U&sfQcZ1ZDU(p628r2uK;uu)K43l+0qwv zP0R6O!-f}#!ui;FPt-w5EvUb-`4!NVas|4l_#MuOAk;Oe$*@opv%3CZgktHGov`gpOqiqXn zVTXH>i#55l1TKBNa%tiK-FardB$5Z5 zUEqZ55XN$dfLT#ebviP}<3^BRPA>{j5oQf5cuK0at>i!ia;c74vHvJZ^7#gxfoU?= zBMuRx46(5Z{%f}Z93(9En--cJnlb_)|NfmWAxthd1wNBxS|(7qi3BNZ4ca0USo?y0 z_9Mk&d^d6Zh(eY%D{!UA&;6T7v0e@__H0?x@p|+emo=Hs$h>3oT4a>_&G~_-r zK=mwOpfO1W7mV;yUyJob3(zI%o^~YZ%%BTQN3}%>P9X&c)QR|@eN-u;o}#Ad`;&Hz z47U3u>>&b`296aq3;23Y$Tl`{nPjLmBn$J!pFFYsarwrag5ujg2U0B;&-!-!M;KjY z#&!P`z`1TYExG|+3AIaD< zq#jhe81yUWY{iFqvgwBXOul;t(~e_G2mLs&7_LQW80GJbp(I;uu)X}5KwQGsnaQp( zJRwpLBnnrAY)!JPd7lw)BXL&jYf@TG6>g1soUm1|aZOndDfhcEBb;g!1GNLszgG|lMZnF8qF6Mru} z;x$i2@u)R`M9@MJ;DHwv?o`EA&r47zL*MkhRpWr#TO9yL1&iW53xs#sAf{JmP~J(y z6X8xnDn!9XJ6`xxq(HUP9Swk&ZfjI@m5e0D8T-SS3(2kH7 z1FQyW1f`H`@u8M-I2rci3)g+%YsuV2-Rtnp{EH`#s_&4jR)p9Ju(?0rwWg5eN_S30 zOF8{j715gu1hXc3KQG>rT^NG1`51n2MkTej6;JXUMem|r({XA~_T1?VA3b7HB`;W` zfEm>Q@N>{QuV+p?;I+?AC-sc5tX!>vZRd>ShS_HqiA0u|;5A3?-EMFMfiVOyrXL$3 zP~TKcrfZ%j2Wg(*0ra!XcVHFkab={hp?Y>tH}lFWXonanmQl&tevL35BaU{+Qh@&R z%5F$rHSv!i-*@V*l&Efq#M&n$MlPrd45HjEpxT+=j#$8A>FECDR!EpP1)|l^`-+Js zF138ceDLK(pSyEcWgvX9G~n~asZ%8-AoLf+D<<7|Jry80;OZRQ-|#Kx04fk1W#l1c zk%*sh^U59#EK6tkq^&qRxG^k+sSTq1uSNb0vY3{*R0UdZB^+CteYmccvjZ!- z>(w4t)-*Kjp7J9E;Yty-Wo;{x=Mu>%BqcL>>Mmtd$-SR~@#8S|O?sg$`LaFVQZeH) zvMP^!;hJP-RPQ*9^{+S_{X^BJFo&e${1=HMjw(HenLIw-Z>$`Q>na$RZWcs+* zHd)0~&;^a-VCcn1YeCyEAjWPB;gZ4?+NY9X-pJU!XinuE=n| zk$@tshhPZ&nAh%XAR+~!e1C!n?G0G4gl8ScP|9nU=rVb$;*U^n180V=lLxbNVS)z} zZOJ`5nFz`p#!;n=1TM3TaDGlm&|8V~R37a8Z z7=C{9M6*be)k!MLV0aU;r{PrtM|7x3dIdVzFVW@NOGnDd*CYsMXnjP9Fg0jL>*`NQ zp5vTlu7Fc--|D4DVlJr5sh*V+j7Iv009NI#d#O_a;$7Mz@T|a@xxtax_nGL*tdw=s zOF&3nbwt_*FzzfHDB%Xo`~Tp?h1drWa>eFTv~H~qU{1Rc+aSdX_B0a6`y6^Q1%8yA zE(VCwKr?+Kp%p&P$bb2Ywr$KHDV{b3U&&f0;7i)W=Ix2wky_mb?-UCYPg@h=;RSJt zN8f_4{glkjb?k(MVL3ORjGBS{_m=cCY0;2|!`zmcyM0{J-HKl)xpx5ES=BsW0Qc>i zDo$BUC4rr6N0G2ty6+SL0#mBj5-9;hdZ%$;yY(sk3vNA0%5;z=&j@t@+U@4*OFkP! zy3qfI?WW{^D0Dz@=%MtZZ{x_D>)Ba9bu&30L7I&uFSN2D$MI?^mC4Lj;#)k?NuP7R z#Ej@GWZ!??0MU6_c~UaT2+h3Dw?OjeyhsCM`Mas-11>P;y||i7cv(Q#e$Wcqr}8&x zmCyo%KL-9ZD8s#F&UPX9N`uF0QQk+cK1($yU}R| z=Wd(Y{xrt+Q^p)BRp$b|}jssR1 z23JL}JdECJ@H%x5HPXzzI?vrg&-}v(66#z$8f&mDQCx94pPQD(gLLqqD#-jEQfzL} zVVf#C6K2)u;b=J~IMHsW;!K}VQgnMTT!3Uoc_&P-g-C-6z3^bFNOK!z@Irm+a1VS^ zy`7*Ry^r16SgJ9d;CpV?a(XT!0-kiRQ4>f^Bl{$m4IO|hXnNv{ppRlTZ=LuG*+PCW zOkgQX1GmV__uN~+QfqkZVybx}N`^z{%y@q(Tgo~=pBPQsv`5pvp zR3nt!@X-KC!FlY5=PWpl3qAvjj_`Xf6cx@ayiYQ5DRJO=<}u_PJF6_P#6lW$Qou(~ zcSLwHRT!uk*p--MCoV|h6(1b)_qxG3cX|CICKc`0IYGWPHI7afi!+HDqPTF=_vb!g zgLfSC=lc&~Sb6Z7_Oi0ib<2h3Olw(FPLIuKLnCFha%L^Yrt(tRw7=`~lFPV|HR}yN z`}-}=lI_iJOb8y-6$OuqKjqJH|3n{FL7HZmYHyUHWnKlkINYBc+oDKD!06ub5L)O3 zHMi;Hm-9MT4Mu9B^yxw4r(b95w0==b^3Su#w!Xxf_lT z+7(P;^?l=c7MU^7xN-dWHKXaLe(~L{*D{!*6)EAl3V-@nZCOEHr;e08+D$KAe@}*y z2^qYN-kTG3YAj`taew4OvaK#j3NR4lWS(28!MXyh-i1T^qjBN|xX9rLo&DPDjLra8 zb%Y~RHcmrNwpJPA?|Owz6SJ9ia&?Qr%Wm|F-Z)L)V&T8xy|D7Q01Zpuf7rb0D@odJGXnJ`|mHLK@7hwSU0A@VNTt%GKgzz_T9A1XI*$xV7Jv}r1 zyb~+n@v*+7Qy9>Uw{o8batL09*P*jxdS@Hpokqq1-+-6l=@?dS!_a8p&}%$jQY(7H ztC*6){8?VY{9THNs&2lKzmAA`ved3nVDhQFNR49+Mwz-IM z4&S5QMc2B812FV!*!HNy1FhK2Lm2yy^jJOr0bYdvEG!!Nkh{SI-Mu&XRD0)G@fDNQ zpm*}*k-0%%1=vdl=gJ=+5X&r^3KC}nV#<5+aDl1@eS)XDm?)qW6&~_&q3&o7MsCUE z2fajYbC8fdKQ`geU+Ct&%%KY~zRtZ;=WNs*<1DCdP=m_r#kv9?yqBwS8Fg`IgB#-` z`paunn@Iw-V{rhK8=873YSH@i_X?nMSl;#uYrDR%40{*tot&}`1whe89Vq?^maLOU zIPK9eN1j~%k{5%BsG?|GwZtSO2iB7-wZ6WlK16l=4zT< zV}nu(_=Fv*#G@$JN?2gmEM?9t==3|Lfn^NYVjM=|`ar8sACokQ`x3u@IQ;i5FkZ06 zx;7G@O>K=mSXD1a*^IWDELXY7AO+ncM+r+TaH7ryn_IZ#kOeB?tFb|JFB%>b!~Z}0 z`xhcM=@l9_f(dKFzv&xaAkYgN9!}sB(&09JNKZY~#0z3=fg)S8+O#Bvp2oJG^ ziTDWE9NBh~Sxq^t2Ib%20DD1S`pgdrJPjzX2+u2UxXirzZ z5FYjj{kVaGd!6Zm1|tNXmf%$pSYU_AVV0{9T1&O4&eOMKi>P{-q6R4H`K0{k@Nb6g zWrz&fjH(EZISQ7F<0iZ!49DSq)dFdhq(~5~n|IqK0A41Zrb#J)r*L{drya_OL1Oj^ zE+Yh`GU}Dns!WN@WfMNPdeXC2RJXOJlDk9-oy8oPHr_z&_u8r=fEIEeg{TPW2Q$kt z2zvd{nj!nRLP*LzX@1ELxFQfOC!|n+m9{oBi;d4o`=34%%TKfmJoOj8|3Nq9ulv#|XOqMi+Uf zB2$+$?n$>Gf{x-*JH+bkeS zYBLN#P)icO!?1zEG#bvb29Gy9!|N7j!u0#tAec2BfT76=XJ9~2+VgVGlW5!P%%37w z#Y7f2HKL%2CqpM5E^@!<0{dmY+t>_U7XzI`^$|i9lImn&6Cy?Y?4xHLJsRT@&neN< z{S+q&j!X<{DA9wZQ`XgIPy8-8CeU<4#-VTlVXsjdw)B09L?n4#vm<@(+#`M=yR74! zM06WH+#{K_9aDdgIgx#p!dS*dw-Dy>w@xMk-Z!LlX*E<>q-@&ttD)8R#-@% zlH@`(?_xA`5hK9vc=?BC-KkIZZrA}j=|VqGZQ18o8g{DO-b7+a?zKe1JK`Gg6FYS= z0NzMN24#lO`W+=L;SIZc798dlA-0o#6GVUn1_l{&2@md_CcSM$_ozav=`#qin8p~p)T(6iZ- zn)()H`55dz`T;!mx6tbwtUAg-?H6)<=IZ^NY1Qy5wH@9mt;oyg?G|^;1mYEGx6!7w z5y@1dQv?MzRu!4mz;Hk!b$Ip-SxCpsc0C(!#E`@^pDdh+huB!2cs%JG-$@5{SzIf{ zefaxbhtw_03{Z$}uE9L7!9{ri)3{fWqzTyOE#k9Z4i_o#fvDi;G*iP@`6B<0UTgd> zusji|1d~H-m5hyrf?|mF(9pHs;8mO3ox_+>M>f1ZOFS{{Jyw*xjlAD$6BVRKiZnco zi;z?(n`3oParb`X4~_0v{cNg)2GsWveGRoJfN!y5?UMhSsB} zxy-0K2k)z)1QiP?^8TD^>*Smnb7X@1Qmv)ih_cv+Vs?}-~I!& zMM?*6w}C8B*;SO7lqNSM*8u|nt|>%vJ!DdlSrI?lJ@%jP7zneEgaTP8I}ZLm*XgP# zm>1aGq%%8dDrKYpi?3GMCiq41nGg`jXn=)efChsg4xB%6w9mlupwN+}znIbah(+n!@z8e(MST>ej`5W@eWNK z7wVW6?kLv*B}~0=8w!|I!s5TD&>mwRZtq}`Z6E#_bdU=v8Be^$XGpl2G1zDS&6`0M z3NEe?dd?bql3lzTi=Fu_Wo1U zhbpJc=fB;BokmG!f0K~Dt^z{*^zaY-m@-uk4m8fy)z(l`Q|p2b2L5jA?T7#2aFkFf zPpneeL%}DTw`w{MPiQFS(G0QCAX*%(hc&%;27@zn()ALbbml%RE?#Q0(V~6OLjNJr zVyKHWOVx+CRC8j)2gh~xYyQf9H0~atU5k~J*AkK=oAPdm20{e^Q6x)K1dOb)FAFcO z3atlF(e{7V%!hoj$@Q=aCvQ6|QD{9|*hw}cD))8G7E`2l&G9>Ab;R8#{n_pG2lqKF z;Pp$=(N6&;zg(#6PVWkHK#9|!UHdqm-0+N;$)}QW(=`?*m*hh)!x5D44-jjM7o`NME9dCqn~E^6@^}zWlw$B-&bVU>q`$}#O~c? zCq?F$w(=K3p%&eRp;fSGDOY@+*+pZ)dml(^ZH+bXpj10#+g)M!q67H?m-xkVD-pqj zNb`n6o-@^HGpPZu>3z#u4aaOUR(hY&B%F&~r$!Sgizp$}pMzf34ZZBG{U}bi0yXjZ zy}lC7YM>Le$se_d5}I}aRDx}|8+TAXgf z)oL!(@gs@?cAYIwc{&FMC^BCYlA%XGnh&+Qo+`YN5O)Gx2AE@z0U0p{BXRijzGe^j zJP)7M6g&OAlp$aGN$R4lh`I*ot9GTQnOBZL(oX`=lMb~L+Hqq(bE=S56IEjw(S@4> z??sgg!c8aEc&p)+kvFX1IvL(`bmZ>YXn0~Q1WFAuJz?~G<;@O9eYK_8kU}sOMykSd zzUayRN1ZT;(n=hC>jS+znx$$VC~>tL;JfYGX>f(Xu z^r4IT{OU;D$JpArnrkM~T#;xx>6q05c&{e-}|*5 ze;W3DI>P$-6>U^FmeE)>Sok zmj!{**E5>wsFg14J!?LVZSj84F&qj#Kae_h$|T5I_pRU3=3X5)N{I$^#vD@{q(IR; z^OsP#O)S?sa<;K6Z)um#q(8}k^11jUb|%b8A|dY6Z^C zWQitTw7+^cl&4HahuYqiKXf0b!Tkuzf!xmVC4(*kNw?8t7AcveSS{aPGjtLUBh8di z4a1e%dX#NMElVJ-x05%bOt2b8-&lC0T+Cp!cSW0tm`-*Ryf=Oa>k=sEo93MeA5*f3 zW}+y&F0RHWclRVYcXs5?rk#`7-|@$7H#~LcU-s4Qz0Rj)$yNnZ91K=a`(d2y=oQAy zJ1Q0Xg4%8_WtiRd+}8D9c3dbzctk5A;mwvUY9UE9xq{V_Ahj9Z7eG>W_;Tm5Np-nM zT6F{xi`|UXI_1amN@7AXLxWGU5qLF>`vUX@^|G&Z{F_H3Js~X>WXyEuUt18mzO~?S zy(|4X^1^1Ue&%UM8!ohCTcS62*tgQ>QM?k~j8jsBasptINo$&p3j(dh=aAGG(AqY+ z(_T0WN4Oz5L5DNZcJ@!J0qF1N9oR< zec1!d`ULbRUC|EQVlach3^}&S4AABDl~q@SWlVmT>G1PF2kRsQ#pH?kOn zqt7@8SI8tsMzP74QnJmvCzX@1@M@EJ8heM2w1g-W70k!L;hAenh$J{uCPC~z-rdjv zJz;oU-}^cVhSYgo1b?Zng*P1A!VOcMa!;A79u%$sTqF8d+cI2F{1ICku z4=#SXH6#-E{PKp4Gl$VNo8Ok*bJiUu!uSm=cjJ#t>r~$C+SC-D~-{r!_PDE{$Dr@#zdw0#Cw`TFgr8}vnYKk%1p&i^6v8`(2 zLTkc9LGF=-V~DXgtyoKzL8rW<7b=)hhGctFDtg#^>>|9d@hV-DHz2j5%O`m9qN)Z> zEqdI(DxEu@&27HkYOx_E^6mSa)j3OHxfj&4Qf82{Qz(q((`$NPH>U+|lGeeq;JE5V zS~(@VP5hD{7Wo!W3sTg3bVwo#`9(z-MU~q{PVsQPk25HJ)%Q{|d*Qv^A!Vu2Y^u|k zow_0Av%TIj|NNQZVRU6;rei*N?2#-M3NlS|r!!wnPQ6I=D}MVX=^x`i9R=dp5gwY) zMGB!~BjbXRAj?F=Nb5&t3uM6+m-oi126a?x$Cb9wG4@n5vkI!q^^Gp{XEQBh^F)Z* zS7}C8?A~8n%-G3nxmBYCw&}FR8tFCWY!rbVqPX@vZN?|fyq+$`8eixhe>9?Ko?}K< zJ24k;sbIDyV@)pp zj17Soa##2(cRQq^p(3a)S%%jPd?VkqV)pib=$cRz<;}b=kfZhe%c^FL!rP-QqnP=K zOsbwpasOETDr5k9sA}`K%$8A??lHN`GQ6DJBDdDPw&06z{)`)iAX7Qts6V3fUP)7y zvVp_ONvD02f-RM-*wvRm)Aa2@x4OIc%chp3#W|8IVMTOd{P>*F6B4xn2##6x_UTha zdmel0F_iQK8S-gLVs6DwOJM6-E4cqI|7ZvlSNPW>p#^%0cCYQMXZFwAHoJ9Iy6%!t zLNqwWumSC__DYRmLY{Wf;+X4PLg;vLd3a*9t;gq*Q}3v^9mlW*4IB_n@AM0~1nMSF zBrLDq_(D4z#i3+6z9~?10S&Jl?X_((k}!`CLnR+1D8MCZY?09rC}{XI7F z20321fn-8$9Bk`+{hq3t`hhOeh=lX$kQaQ~vCxsJ_kexVd$98I~!XnV4=@3xcX1 z$9f1Rl~pN>OkgDN*BD0Co^T5;7$rM<_KwZ1j`|cmDL*FN9pAp_LK)q-)CT{IoH zi;Y`t`*t()X+^N7qWveHJuMiWtIB<&06x&4@AwwOu!WFSHuwJ-!xna%YopfLU1gP{ zryadg_tUNpomeO2ywvc|r3^G$ z16@HbV?j93rFG+cvb-mb^7-Wa7jb@3Zuihj?RT49UyDc*{8Tw z?`p+c{d=?Ls(!gWn;VITg-D09xLH(HoZ_f59JwIXd$=4?LzO^v7%7{`M#?EitccJ^ zE6t9nZ%}ws>_gQ$er6p2EPAR+>pp-zQnNr*+10b(GxpvvBu?WZNp}=`6W>hPn^98PGb0pSR}he} zN*CBp%$&pm3@CT%WFmG)f)3;duJ%H+ATDCs!9M2trxyI&qTh?n#r0BZ1yrhGgXOLm zsq?{{Qly0RO%u_%#Lz}e)MnkZ_82RR?MGPf?|^bo{g?w04(-Jhfj~_I1uK8BcrM(< zlS$~R$5>WQ@4QNDj9KS2P*ow=AzKY#O=ut>wvdK!>=lqeLSe}W7_`grQ1%6?h_^UYB4H ztlq7qsz7Jg9As!T=kxjao;r`@Mtuo)IXEByN0gGND2nP~_b33vZ?sQ0y)HF2*DP#R%iszz+i zPaH-I!q)>aADE}zHMFoLwG}E~=cjOB=v3+SF%byTjwT;Z-J29$T|bb`pnXChExP9L zSEf2(iFWWtgb|Y7L#a2mw6`UPPaEK1J9;5N(CZq1O~tDd85g&uk_pFXDxYy|>1_UD zn@ovq08W=*{_%rgU&8ff!*%#tQV@Tf0ST*vrrE?M4jjDk@~;|?OPJ{1^y;S9E?<;) zUhK+r4lh?DGhgi$#JavSGhvqw@GT^jxDkyy`|58NCz+#cO-mKFAv<-x0Z2}D4ttJ7 zNCdxw4+?d)d=UN78DkUa(s(NEK|~}NO9)b z{wwY|qRw?NGmNZrn%n5@%*Q2eba(vKwQXy&$RbfZH1>$DnQg6xpq#&q6$nKkmN&FE z0P5r6$EXJtBqq}sJl1%7`f6U=v`I~xdEjZ$7tpqrPC)V#k-}${c0CS4nl0?!bo^%~ zpc{Sz=ZZguSD+n^!x2g3R+Sq^3TYyfG5xXdpXgx|Qe1Mnr)o4L$@m(f!xC~swb%gU zi}qZ>|X03agC83mj_-S=}8f29*aArnHrRl4R)pB2fuEJ z(K7Mess19=_KSwMX~G{n{j^xgQu9NX988C#L%X3|;sSP?K7!5`|H%|=#n~sd-q^6e zt+r!dv5VhrPkq>PBeFg={;6qdp}sZiPvkZ#b0fOh&dNOdn^%RwKG;3dh~xu&Au~nM zSX1LHh@C`VRNFV_hUV1RrX%ezd}l(5NMq|a#5uUV!$m!s`7yAI^RW^oz*o7xxh@-6x2p~h%h`Fy^^mR(00IvYqTaQ zH+Uo)esUV^1%C5-tqF3%Yw9R_uI`tNCOK`?)TV@l3(bhzaavwBpo7GNQ0?UG!+=wf z(w+fKx7T?>kle%2-c4fSOJc!?wKtGf$YvXt`<}bgb>tkU=pumfQ3rb9`F!9HqPbaM z{(%c(K?{N-{mj|k_&GMq4L92s`xc$_$@;Q2h2-<%J6vl2r<3_p%N(k@^&i#)9M5y$ zo%Cv3QB(CY!S)YE(Uv$OgV-6@>JJ$_x;~-5cXy-&r+ZA{y4Y?ic6)6892W=qQE-68 z@5;VdQ3_G-7Zdy#6WFbwyLcCI8uD;t8Cb4M6ffcivl&?yz`S?H=k$Z6wX(#OqxpRF zm@k2WTi@W#-*o97!7K)abqHGP4CM}Cjvf4hm(~=z<^}x*?}>yIWs_xq!nLisHB^jF znb2f_TZ`|Z>j7zDakGcSE^bTAk3rzjICN5mvHD4>nvhiMp|ey`zk<%7YC&RERcAVq zffD*l?r`+(2NlhH9fd>cyjI6+BTGtar;ZV+=bDHek`9#ZhW4ib{-lk|D0a?MkeKJS zt)^>s?h|l6tg+rY0vQf^`uZ(XoBsTjR;PIKnPw1^s8?J)C`w+&e|G zp>u-q&=+*|^rwlXH1gzWuaG(kxdq9nF6dg&LpYd7>y1?|P8X*0L-VgJN!+!|wv3_(o=!)*=t@LjCkYswY)PM7AWrK@uHb!nd9 zKKqdONV3Z=Kky>Bg3ygJwqe@;mzsVvImgGq`oT?F=lJRGzw1>q1{(l!g5nuQ7kGGz z5BeGm`)Z|nFD=(ADpPIpwY8Ws8%!pn>r4InMz7fUZIb5+@KyXotG|W*X48CMNYd&H z7bo_oe9A6N9_T*ovduCWgFg&l=B3we`BHY3L}FYdt_Gu~1%aC#umy~0a?SDzZUt#f zMne4@sX*F%gqghUD+O%(|9xr(rWA`4VhVpqDqrl4<=<$2Vwct)_D5jDq)e zpIOv2&e%R5x$;C3c%y#gO83UTufS#$I*!8$_(%9D^tX3H2eiRWa5UB=s~(E6B9~=6 zz!5kKFThq+GgnLYuiio4lrY-3=Q*+9*$1*HHnD0j0_l~;x)?=sVdrC5+P{()+AcVp zHae4gRU1A$<81Ss3K$qunlph?&Cu6MU(+68f*+)$jq1M`*^pe@(?7n42%}o+vCuvb zezQ2`SzvmK3Pbo`m=3@ofPfHc-67*3kM z=i(}8OD4bqQ-$H{UTY*xO+`T1Pxerd*>82W(+dU27xsfCqd!D`9-V`gJU5&QbkZ|s zgkL|fO~1COExMBLu=9n;u$)up7v4k>g5irGrc{_aeEY|3!QopA!b+~o>JiPVhN{qo z4LUvK#nZgXGy6Ef*kduB3=mV?EPdWSppPQODE@EP9ojfK8=Kx&gBsiXqV^nOpSP@| zX^((gEd68^*oMRq@|Z`>AK_s4FdK~}*hs6n#XEIT)b$6^YL2(-aAY=RdQ6j9f)vxp zvkAIV&Rqfyhne|6BisLuDQzumpn@$uj6cBZtcN&xpNj=95Uq{+o37jg@m@aNI=}wz zP;xEtTE!RBgZ{RWYP4Dotq3O+m9r*f=}4v|%ua)U#Y} z^{gkKB zBHmydPH+t_B+4WFhpbJl>&a-ap`p2z#&L8o7f~^|a(lU4ZULh#-c|wYK;o_tdamhD zMSU`o{uMr{%Fnrix^S{WCn_#eQCNR9M#yC{ z5y<_0^Tdv~GZ;p{^rU^#Q%U@3%hVehc@}K_ck6GjM&);)dR|wv3%AeD)lY&U z6qzw|O+G5%2IdWlCVneLNu!(~9EC+y$==rRBu)#llVvwiQy}O9gUzC@+8kLz);TNS z0E-?id|qpB7fs{iGN(imW2?7ul&t}@B+w@`=ZYv}ju_mVKV?HeSkj;&0Ar6b;g_v+ z-;Af9c1K-j1AQSV+0YB;+@4PE@EFSxdtin@{}WN5td8nDF+x#|vGh)2uZA|lO;1+f zBb}H-jygnx{KdwoYV4Y@V+ib84Dx9E1?>a&m2mr;w^UVhK(^m6?w{C<*D^iqgU3(# zQ(WydSK1C2hyk93Q?TGK;2PX&%I0%%G|6C_PnktGOQ>A9jW5KovJ9MuJyD-_0iK>j zi4`akb<29Xl;z1_qgSAWNBD4-9}!v(dia~V*DTs5TLW1p)Zlf?Bf8CZnG7K{w+ts) zM6kTxm(FmEFi1wH{66C1TSP}F@I5g4YFpfGTV zY=@x|v%Y;;THwxO?14QlgwH|QPVsXJ*I&Zf%?+P|rU%SxAwfobL?(0}VO|OPITZwH zTJ2zpy}Hn;T%w6^CDC&GMIxegs~KU#O+XKCHU$;@f3nB441nom5h6Wd-KK4~Wk?7M z%y?wO-jZyGuwlu|LOzKS1$ZDTgP_1WQ<69FdqkGPwQC-)6eouI*X@ufA(Z!=h4b!; z3#G2dzSrme*eKPNevA^thq|SnFxnWCEB-qCP+j|kBI9%4eg^D%6Y~f*$l5s1dBz7q zD24F=NQ$Kjg`xfo_DHB6wU-2TW$m5eCNxmWrbw5SFqqEkCGpfTp%LE|)KvN-nA#Qg z3{khTu?IQ{Ma^35q=2QxAx~pE4E#FaCFx=@>mW^_?S!wtlLeM$4+tcgN>N73SUkET zdKHaR84Q9M8<%_G$(S%_Xdnj_S9YMTCr@V|5tL`6Fe`~os0$Ef2di1rNZMNz0HUzq z*#sX3$AWs-9b0sUmUPV1TSt&|b%R3A`uv$rM*JY4e67$_PW%;tK)s!C8e{N%6v2jb zXrGzGAyyD*JNCoEH}QSsn5`4)@5UP3QxZBKBw@sz>|g^+%3ke|zcR?vP3dp14mH0Y z8h9mN9vw)U&2{N4nZoee?7mmfz_+JdOW*_?VXfDv$(6HSbO;=1(|6 z540dIbKI#oVFg?tCJtbnf`$B@a!vy0OAvh4)Ecj_otI)b$!iFv zM!3FAwn`az+JO6e&kG~DRTTe#SbY5ZFZX5T`<4y8H7_aiw}~)%ME;&F<-AEdG0tfE zF7J2xwbSUBsA#jbe_SX!peJF-+`hjf`-QDQdZUiR!$4aU|DMbXM$*w8YLVSUC;+3Vt2a)7$+Rzog6aS=Z*6;`QsY(nAxsv2)i==;N!c zH|>oyrne&@fPZU?$gz^{r#*8oU9XitZM}%&bA5X&HQJl8T0ntaZ|d~aL@;V9;^w$7 z1Curb4O6v*;ZN2@`_P%iuuJ09*xp6J5i#qjWiNE>q?bSDw}~NWMD+Cqb~vwd)1kPE zDa2*RDk9tu#0cw+3PN7egTuMW^Q20JejWTS4KhsRLGX_{gZkN@k1Pu znt%c3kQUC-cp3Tc{BS08<)b@j`;e}jsUeICW65Mfvo*$|y3b!XzVJKY^&1Hvo*3~=N^!?CNn@>S(^|rs65$l}Nd3A%W28^yXze8Z#R~Vw_m`~w|g~QRQ zncueG&OLrqT?@VXb^h7d$g}nL!kha3{zFO>n!x_*+8X!AKQCsV&CIQ=$!ib=t_>*G zLOKHfA%L-Wuy=KEP-+rq1^C{u`B0B)3$;e5kdbWv?n1>U6v#VdTfd;vmQ}*SOZWie z)swsHp$W*)UP zk}2SgpKz@MgfFvcM1Aa};DydUQ9IdUSG=2m@e1U;S(3!I8}wM0q%NaOB8X#^jC} z-Tt-j`Q1o&OM3?+0dZ}s#}^M3(Q;h!=6Qx41Q_i2bZ9KsYTF!Cx*NN@)8jLCnw^~N zxao1$H0k&E`EAa4&CNeX%UZWe6cDR{+&JgrsM-38j85b_jBk{fgr=vq^A)_qdPjsj3G!+s8UT90_lTP(GNP z&HY%ARW+JS; zz0~~hT&YVWH8t>n{zc2Gah7!$#aJr1#+oM}hsJQ-61a@ZtMsJWb`*?6)v7$Ag>!IT zu6u94c=Khoy%vf#%c20O+0d?Vfk`fLp4)m8!d3=O*Bg-?nd~T9uQ_<1IJ_U9v>+Hs zUcj=}5wKAsd)Jad7U9;5;oZcXZmKACq3e5S`W0&l?U4Va#BrtDc|ztWk~Q4t#P zLilt7VB9gioGKCzmkfehYmGM8qe0Pvg`8t-Poo2kjj{219Q9tXFIM}VTP7kobU%@k zT3T7Oj7d0)e9;CP5I=CYi;X7i>#UoRi<&>;zwrC#^oM4w5RBvP&EjyG}94=W@|1cGywkA;odn-KRzHO?U_|3`rO@UPoj>TH)5U zBQm^br`Euw2GRV-mxi0eL|lbtC3J(Ct)==Jwhs3XV$0LfTmm8F6Ds6jT4Vke9KJFw zDU;Y9ILwznB9XF*`HePI#@y$OytZfGqc65b7#g@P>C=1<2BE+l&tA;Udb0!f9jg4q zOo#)5cI+Z-<2a|3hCkP7GO6KfoPg(GEipB6vYMUjW&+wb2JgX7;Qzq0daQ^tXi3SK z_n?=4Fky70LQ)P=Sfe3u?-Xm)zV;6HoIbF{Pz!JrUedKr^J|`(+(`DCTX(SKKP1m0 z=jFVgW^VM}oZHs6Ft@+tJK};!qedx=W& z!j#fWVpAZ5rJBS>K;Pl~N|{{WZ@HnycH2{uE%&iYaDKyE*}<4y*#Fqo&7p$-|518$ zQWv+#1IDe1M4!z)T)M6Hy7D0v$?v?-Q=XSJv2@8)ID+c47nIcA8{vB(N3edZw0s&} z1r?&6QU9Y1#b2=1J65YjWyJ=#beo_Psz_nn2=aCG1Ym{obZrGeY*u}p7*U=`mmFAPY6`GUf`lWnrPgNb_VhgG11GQMcaeTlgc(Y0HI41rnBz=@?j8wm*twryH| z@D+zCqnzIb-gNCRR62t(+duvNlG{%8o1u4$x7}mWhd_u)i5|GFy$u@$VbjN=Fc^hB zQy1~Xc^7$5)1^u>qO6^gH>X}jdb2+voQ&EA0@8QqCYs_We4PV}ummy;b01;WEL~ju zzY|WftgL)y322wZ6Y3)^>~;yrKjD4y3Q6w1&s2%_IG5H^>j!fO_HD5~v$cD3_F1MD z_@gxuI8|5U;(kd`dbd`}y5zE*59cn_jahko$PsWiRFBVuWCfUdQ6N!?L#nJLBkM+K z2mi}Gxb1vxIm8P znzoeSgf7&k$7V|6luu{kh6oz*C8-cY^C&#`&4Mf9anvg7FA+`~ioDVB5*-$pFgE97 z&DFgfldJ6y{Pz#3S*K%AFhNa0m9AK*-6?rf{ld;JwLtd%{T3rsSbW`qKFt4qOSWEV zP3t1g8VGfO)t_BM=JYDi<|sh$Pd@6d-lTfqQ zQ7Db%h*=!+K}hZc{P17-D>OyN{X_1#rDoI>379~gh&X6AHUKw2RxT} zB~eN`B_g2T_!0OYxqdxY=@36`xKT*GrU;83yQkPt^~y(AXp#Jd6)_ z$uMq@uioDK*l0TLH4-@wy{&%0{aPjOm8__QiXp|4WFakvE6O{`V>=~kl$gEszT%@{ za|krB0g+Mzk%ljRw&3k37Cz$|He$YY2?Mz-`gYHzBiy^+!{IuGFnp5|%a>DOQrPyuFb z9mM9)>sz%8d!QrDmc*WZz9@@H1}wmP7v3N{11cFNxIfu1sReKBltOl}B{utkt=tax z>kG$b{x(L+6+4z8xO9#ez0N6?ZRsgKndmS$H1rt>!dmYB`FSTfUhalx0iA^OA#voE ztD~u5ix?r>JJ=3Hf3rlZH7pKr#V7JB%4aCv>oZ7{MDuD#LvWW;Vxdq>Q=R!Dg9v!p zSo|35*w^I9D-cPy0?uvi6s4#W?eQ#WGC5ong+|jm6;j@4_9hZ}jAB25=6qoq&5gttU2wR)CdXSR4d&cAiac4 zb`A4oi!QJuc|4U;78K~3KKLiqLlY9{tqeGpp@*jc4iBfmTD-xPB()VyiQZpE(>d)O zznjiT`StgoS35aQGfPS>a~jK{v_o@lK*!L9qJi1rG{g7^73Q~0V$Oq=mSg376THJ9 z;QLcoMK^1|9C^-Su(&oltrR$2r74>)d zqq$y+Vw{&%5_Gu1qo$?`PU;f9F|2Hcb@ZW^LU%M`r{wwyjg_^2QIKe7HuystL7PAi z*-EcF?6A(0cUzP8mJt##+BTeoU-M0-{v~UC8kxrw-AghwSgA%^mNE2#GcG5>)3`u6 z!&JuIP*#o5ON9EB-b9^&*&q;e{<~r>eVfXU*g7&YeCVV3m#JIucW@L2H2jlQybgE~ ztk!>JFRww53Kgpb!22IgGp?N0Yl_nXG45_8Fxk!3@6e3f!p|G<)?)HeB}OBI>4SXg z>k5(rqOGa4V_D}x5A?=3_aiF8*$V*Ct#~tT+7UdiMC%_o>C$%;1AFu1`*LzFF$e;? zzNQ@j=Pfn>SD2?-cv_#Yjd?mrFdMr-dAcKR8Xh@2GxsIgkUNu!o0RPKSc5(76}sZ> z=*~gZC4HXr5d1#=3|{Psyezu*Z3^XNfyyejltI#a))O*XWe=&Si=&ng+8}L|>f8W< zjE6FkwL5GOEh5T!**^ut)=WO|CB&}n64nTU8^NYKh^)X2gUbkJP-fbzZS2;z^l_IO zN-&x~AiEe|_sNA(vlc$k$sFNF-Pv~^U=qS09zdo9Pm9v&$Szb4M7!&+R^rK+3dw=_uAd+ zn2GEUWLS(^#PbX(tZ?QaFxV0tWz)H=FX5J1$gpD=GJD%1;+~jLY|nzI6bxcTVd354 zQWr1>Ul!u!S9wyCU1`#2MSFLWii<`NDU9)Am zwk=v4T9Wig%+IG4(LR%-eq!3;qD62h=IJsf6Bo)QirJwV&LW6M{!-**1jkB+jnSg<8h4?KA3FT-_Xm zu&o)I!Pa>U?!)~X_rs(SsODho$8!cVz-ezgvklV$c$d1c8+N->`i^*R($a`;WoD%bqBv~h zC~N_6C?f;CFqh!&5A%WBG)-lQBO)V&twurZWk;O^4^4xY5L;(dqarVEyvhrph1?D= z3FC0ZY!q#!$&i_$uR9=z3_O(ZsQ6VTgrThumaee^N{G^=l4` zc2N+?aq#3OMXp^qWM}-3M5885@%9Z2_uNiXILf)+08M{&l?BzJcd=f07j^cpI0aN` zRkJT`sq<<)GSZ+TZqcr+s!ExM3noD%1W#ER9ZGa0T(_z|5{;_gkp$M}lA%6}l?Frb z^hI;Q3r4GHB7!f&J#+!y=^B+^g?Ci|AGyjZjzfRGbQ2wvH-xbalKfE`R7+$d*4Uw&0?o1WD zx^zDTZx{J|mB|gHFcwvs;l1{d{SA0A!iRwAv!`NP( z0?+i;LwXZ~c_)}-0E78)p;75fFoIKBevo+-ZCZRzwJZLLjaYwWRu~R*$w{3YQsIz@`A#KiDRMOHq zc%mq8FfMt#koK{*uYcfhA|;4K-&Xl?cXXtRz;xlHG|oh^fl0ZAGLyizYoa<38D3yJ^Sj|<9Fi>W?@ z)^P>w?X7>_YhR8zJ{q%)vVU)jX++V?2k-r>FoD$ckb zS@W<{Ut2NRxDvpM8V(0xHD5eWhvAQ0Wd6IT@|U5^sklB7*&(c@9e&?JH93dnHhk<* zJ1UK0Jlx)O6h5)$xDo?xTSl$_0m3kVR$c_xt94QK6M zJn2@e`;Nv+Cam=kgZRMszO>a|c!Qmqd6%*s)|U}!Y7UIh7T_Hm@RWa8xTLB(-4x_R z&b~M2;{;XOJM|PdD-^xXtd&P-YITJd;sF_lr4}Qm#(9$9-Yk*qo~c9|vkc(CpFD#L z=7*=_oLoge6P+S9S?+lJzmx-$kLHP`BZcuuFC~drO0bu>s!2k``uNOsz)yl)L&jP{ zN31r}$*(=ik}=VG#>OS#&09qsnY9Hu5=_E_j`#g*t@S;Ccd|ES`?YMmOy%R!kl7`E zhz|V_mB>sbv-q>ulpI~sI%N=b3p0QeeauN;$5XoUg-G2A!Y7aM^*pAe=mY9O zpz5LHU27(Y2sT4A%o*Q-plytyQ_Ov2;vL=INTzobwI`JBl2vAqO+zGdS}>;9bb8Qg zdbQ6NJA=Xj-@!8onCi~aADi6#O8hfPWq@*qA?jJS5LQID2-tDu771lOGg%IAF`?3L zCz&OS*|1?kwm6_TvL%O0a*LA<=WuQr4_jO?%3Ja{Lbl{XS+b=7QNCPdB!tBNwcu9YdFlm2{gp+xh`|woC;4g#xTb+YaZ6?eLkTP_iE+oi;Pbt>{`#W@m{; zPy)k1WP%Ya2rD=ftda<<5h4iapLYa-TR#VL_ii>>ZbeWSN#Rm^TQ;QWCgEGFEEaVM3?5FI4+g1*{T6bM>^JO31g@FnDRAIPS} zu||?D!_(Y!w@dr|HKdO< z%yH9yJ#5WwvEU!~Y~Ot|<~$m0v7n{Mx#*TE@aR9Z7jB)$(`a@&Wybq{74-aWdL5FU zTGrLkMw5nfG>;<-$Y3~yq*C9sFaRMaLV%6|*{mp|CeAP$MxUljz$CLz_(MdNGy2pC zB8JAKSSJy<`6T0y;XRx=hZq(+q6wCQqWX~s<{E8hWvfC#AbN9vhPSzdU1;MP@JsmJ zm&w|i-#4T(m3ZA;l@g+QRT>X2*UsZGIGWVtm4}z7cJuFSZB;m#1AnvbegHEIVyy0B zwc<WNXbG)i;+@Gtu5=?qd31PSy689{i9J97Aj~B!%6#{Je zi_3Et?f$H!mICmjW@DPhx|$N#sM+%6YdxhuYSPEvJRd|R=+i9cMg z+T{UHLQm0COvh@08`4U~K*d z3vu9EJ&VsSMQ}|cTzeJVRR*aGYg?7}(ANTR=nwbH;pVp3V>X+M-`i^K>uw-of9@J! zD@#ASP}XYf`M*1*6f4YZT<*Be=!>7X0SA!=teZ$h<2g+hF6hFv7Ud6FlgFtl%Q~)qT724S+o{|C zICt(0{XTxaTm1rXinh?0g)t?ufZ9|>xqtgO1XB8caVHf|FofV6VEVq`OgY6I(Gi3u zCaG2E1X9(a3uscS(vAsNi;hj+czHVn(bdR{Q#CLED4+?bfhJwVX$Z!n4_Ag`#)WW*Q;8?DtXEfvMAGdZBJm#S64Hln} zhfsne!H|)mnbRsIp@>tD{n15*_0sczbzUW;@?GO>XlZgnrys*6`3>C1038?N|7Ay! z6rrpEdj0$J{dWhGUHNKcaBv9ZDMs$Re>Xqc^KIhm?M@)@WW9)iz3dP}P1twx9+|{N zBe0%CAg~f-S+TRM>6_+BOy6xu70BVH%~d2D&m}FIwasE07t)Qp>DKI4r6qnn2!L(D z1n~x7GlABDEklhMh=2k?zz0B~UV77ObAg17XknVHH~&PGV5c8~D~V&Xm0~9HL4H%hsR%f z@}iaHZ+73{PK}suZw3Ap${sTRPn&JNks_XlFa|2cHx6^_rbvTckJR7&14e(xwe-$O7AU& zkjC(Vg>}jtOj+p^f1AeC4fHRo$mO@TTs2$pqotN#49Of-R%??Qj>AUpcnk1-7BJAy z`Yi#QePkl6Sc;fDKS%_8t~Tz*Rus`lv{3-LcC05f3b|A|Nt#5qD|U~x>yn;A@6)P; z!S@r#fM5t5+cuO*9Lu1n$~5B=ZSxG%oblAM<~}%otNv58+A8;1B56GL3E#6k=eY~~ z&G{pc-8|JQr~EqEF6mN{XfxR(#stRb2(b)G`X6<&TIJe}MCdeAn8rnF=;~Uh+7fNI zI**i^9JVd9_HXNxAEDXU_NpMi`Ct_&*0xI>aYutX;-7mi^&bzTfI@8I4i`0shQ*c@^*iOusXkesEo04K-`9 z>{T*ky1Tk&Oc|LfDHu-~lKE0$^llt<@71 z^NyxSTjvS#1Ya0cS4L_G@>FGUi>~>!n>vqq|4cY$G58Az(5Sl;ZBtSrlUoSH)=5h4oBvq4sHM#?LJuIfE513YEj zNoCcjxg`cu4%fmPGIWHR%tR0;h*SNxSS#zIDwei+v!4v8b|%w>M;NjZa{qmFEBE@C zkjzK#5-Wn3!ePT=LSTxQX&EAU?S8Yu^L~HAr2?H>@mKyd| zmwV&PbwUs@x7oRMc`Jp(vs#Q{_}`MbO^5 zZ2^Lg!74UUrc|cbrC6+NaB~()g1;ha4qBVUBgEn@$rUR}fq!lvgoBR&-^xt=7l<+a z%XLMC_4Cr!!*y!wC2w4XP+K@wRY;K91t{?$P$W@9QLr3LY!8cs^!XztMz*|q5cX>W z8x+Pf<4JCB$cjtI;HuoSpl;j;fnD@#kP(+_#AYA;@Kna*Xn{8sw?zwv1E549oxg-k z|1DC1NHc%%b(1zgOW~rrpAw_@aW+FkO98P4&_Znr(SzZTl}u|Ef^gTJkbn5$N-^tV z-vtnLe8Yci%@T6PQ(Z7*2NuJ;5v-z0RaOwoVAd6a3r*rd; zSyNOiUwmKmMZLYe%W?m9<5x2%=oJ2WKkHpDOTOQXWxiUT<}TOX`c872*=prJzNY*W z5#@F_dHT4nRFsTT?$H@t$(OWgG&NF}jLhHOV>?*lk4g7X z%9X%UNNMr!BW%~DIZ!pe+F^`K%loP8QYKWkG2Q9!+-a28PjwCt+AX%brCnXuA6t|y zc>354OGWo?BfaUuuH6ftxC{dZsU)=axF=@^hT>k<$^hQs^#!af%MP^VU@#54Fo#^U zn(LKI`SzDr(=g?R!W1!9dALTu(~VMxb&QZtPezT4NrezBJ(@ILJ|dH!G|E->29M}4 z`4Zjt`;LNe$A0|8qsi?)m@3{Y-Rf!Ku4*Uoj9mZA$$F*2SkE4+G)CJYyXU&Ax33ZM zeLS7lI4SnR9Wb-|&>7=ZXP#Zv>iDMxkH>n@WXw< zDq(B4=P!sk!SYRAj{4~`g(=!N%3mldn)3`B=+WMePSq%b@C#J{$RcloM!5Rq9Wdpl z&YG5UsJ@7+IyPqnvl9{e$dZF9WaUM0mXbRj3tO*TPi#Eh(Yt3Ce=k~DqKWLM_j=z# zt@sZo^M?$d;*8B$@bXL33C+gX+|y1g)_4M8%Dbfw>F71!?5;}s>Ye(O=2Nje;38=! zz+-7`aM!6o>dhng9Ci=0>E&5rn=HMMzIyhhCiF9vCc@KZZQ&m?HM(eM`uX}6p@9{FaK1+kE`ihT1Ugb3DH1op^=%!MPmn7Vd9e$UO{pKBc=77C$i{H*cuQjf-@}tFy7TIG z2i7K{k@qF=BFn8RNvG`^Cobb-#dN=OaG>`oFPid(;d31S^NhMGrI8XbA} zFSeLPv@*i4>f*Lo1GVL{Jf-rTM(&#r=GHXff^i9>UzIdR+&6lxwCee>srbj+jinAj zjtg$0MSP@|D1C~KWl$h_ow#p;}w#vjF0At`k)zswLn~J+n}yd2~qlAe%wu1- zO>uvh{gP_dO<<{1-Pi#4_o1nXoAcg|-p6mZ#HTWJYv z3U=>;@ZG0MQ}CXKv$`X;8QR^Ai6ck|f*_Df7}H+BN7(P!JGp+p9|GrD0Dd;+wOc0b zenoA9@g;{5ZUG&2X4%$UOO*NXe%9p(as=&*O?J(+%Vh0K9rC$oY{~-PR zfm2d_-#!k-TbHb#p39PoRbHhQCpP@S9oJ8Q1u{H?E`F6zO^5d8IQ$<}L;A7={?yR3juYnRLyvRn%(CbnUu@)+@%#6-i^` zlzY-NqZMj2E8dsn>xRRJfn@nxRD)7EuU^8t}&SMBs+wM}Xy97~noWk=LSg8FT zi3GPy=c)`6^Uwr({Fo8*MB{wro==>lI{6Hqyz^wE4fSNWPEt)u8CkKNB%qhn^@%pj zvE8#aLv&RQJhB9xG)6WYM;DK=Jn;Q61>fW2c0bjqC%lXHN*&=N=cEywj|)^N+|-y!plamG%eDivI|2rBWJ5;K7mzUe%2%;sDqs8nd8A~EH~B5+^GY0;QONYE%F1`S9fLqqv# zYLx8mWVyHu+N=j&{7B~KSn^QpvX*p=Xo($mXkErN6kjE9#bJE&2}%K)j_ydz^oUq^ za0miW@XRpkv{c7Hk0VL%@ml{Tge}@8n5J??(qtO8&8pr1SnI}O9swzFMh!`+Zdg&~ zPT8L}t##tL>PO&l6(NQ5^m0s9dF*rEa`htSMJtxeV5qWgMG<9LCP%V+bd1cpJdL18 z&^lpFdQ&G$pD`7TE3W!LmS?B^eKeo=kyNncQpS@H)8=5xx2|wzL*E?uZNi>LJ(KuH zS*?#Ch;Xiyp11*4OK^gky2n3ZjN=zxZ8#wcnUiynNJ%l*tfT(Yt&W2>E4w=^tcgF& zs)NRf(EJDNdXsu@vWXsuF~gKX8{q&9BUw9@b2=M~mg;4N22LM&xh30(3%2Sx@xZi# zJ8TW4`!Brc_cTGAofK6(8Ybw5kvgLg$Hav#kRmE{tdh&eZF``s>n@@N0Wp8Ng)HM6J}#XV-7UUeOe}@@^pfq19V{`d{M?oeGWJ@ zyda=bd(PL4#-zM(MgBdPZJZWN)}kI>?&;kK+VA^iimm+XVSqqr!MHunf@l_(OdWwW z(GY0nl-6Vm#`;N6?n$s1%XE`ZVt!A=V_vdWT;YiADj3Q%)p|Ry{d+-DR_tV}4sHJ% z6Yzm6OVk{HewQ?YD27(tB!+8`Skm3I89B4#(%XcO8j#$)C#&~YG=a{-VcN51 z6G487jEpyL5k2`uBRHS-yvco6=2|J&&e*xKtjpHIL|P0&;_=lq>L$WNF%D$G{dfT! zGr6e6Zim34S%Ug)`q8?Dsae>Bcp16et;9cUNcw(d?!8Hm(A2~Pb!xM_x=o}*B0~5w z^24^*pd&8Rb}NAI^=0Bt=vRLk`EwUS&;kBLuPkg(yZ4pHQB@e8RU2lkVk+sL^A%)$ z1Vm)##BDqAfO4}PPZ7eEe_I^-^7`5zWu#|#_N?bU9f+AGXgNPKzl)D#&O`H$i?=%i zocx+yh|8L^VB{w>Tt-m}FG;i2EyKx)&IV3#mX10~g`iOG=wlWIztdsL)9_?a{Jr(TcN49T6d+O3* zpM-1L8BDwq_F{jlZE*5>QAW^JGt=FLgTkEeNgWM-|CA+$`F%kI%iG3DxQb~ zK0BB8KPPZ;r4e8dTY~<($sx59{n>fn{L6+wHqm54G1B5RrQ1~XLWA~du-fXqgUn)W z>vsLa`fMk5OY{)7L@FvNAGWeK+>4`$a09$8dq^g-EC#I_woT(qw_N+Mv5ZQwIO5ze zsVz#g2x2^H(>B^pgDC%%F?=}*kIQC0l$z{=c;Wj7%mVYRotc%DMD|At1qf)@=XPA6 z+RKHOj%LgO{Wm`7Bj7E!5w99v7f z5_fDm|BqiPo4UVv3i>qDi~Y z1T#k)NrS9blkO^lr#N5v9{R+sb39d1jlEwxv;g zJnPy3kXOC6RnhyiL722! zc6C9MwY6kdTnwprX=#$^xE6fSvu|Lb))#RoLawmEx4k085)DzHOp-eDv zP9T<|ckuN==UQ?QQtmipma6n$V*NGvVYg;1`2 z#8a;x+lpyD?GLjU9WOfVT}Xx*m5#;7OZPc^TM-A zb;c}g-Sb^9t~F8g@j$l(V@U+1PE(09GfPZ)UTe1b57;?~85*&=L&@q!Gqu?(y*Kq+ zG8C|as(?b1y|ZTvd(RL&PFQKUQXsd9bm(0o z+qfSv#Ut>kfKpplZ*<#7;KS3yqzR&2Y`V4rBpwpbGLvet8?@q}@XsZQg4&f*v*R`k zV$s3e7LZgau5Y}q8=PGrIAwv*OZqef_t15ONK8c0E(#@^t<|@b4s&z}NyuhU;tmgD z(-C!1imQj$3Gu_)X`#EO>ATy>Y_fP2o2b5)ifP&^`fONOE@%s;hb6MR=*JRr z8Bo7g(&t{*E%9GMwLgevrkDQIT3P_79G&gi##;BumtOJP7gunl(X1VYc&f$kOn=k& z^*OhMsEDE!XIasd_T?oj5Qf2)8KW=Q{Qc=r>={@;bNb+e~f0>{_AC z3L(QNmjbZzp}x%YGP%F-UypHj!3e8i= zN4Ft@p+(PkjZ4W_3KC@TMOsHaTggS*|FXC4_FXlVTY29Q=4OW^;wm3Qr{+v)D5zEV zAvo!*ex}Z%kkZ=yOgrh$e-M)*NvWmyhj=+?L5oca?IQd_V>U#3PE|zM9*cg@fdQYJ zq?O@$_TC>UTtkLjs8dH~H9TkYBF}v#J|(KVg>p~5l<3vd3no8#a_$kmC=Q%M;yHxJ zUJ%c0sgv8IIkKt!t2Z7s!5q^%Cr#4PYSnHgG0Y*g)^0FYIQ-0}ozBlAFZbbB##v}$ zU<9&WBJu_wIC8jJQ6{Z8&Qn!vb$aPt-kSRQPYWgrBbzUcB!OQ*@4yc;VGL33z%pDu zMb#ALA>3~A%DY2`M$Ss{ifwOK%)|ru_SLPkYVdt-9Ttw~ut`!_PVi_X$9%?avp}G! zIjR&A*v5%G7VyAMPA5E^Bj{TV9)i5W)J&-;bHEKb^~T%orI5*fm$vOlIa={N-PCqx zq+9-Bm|J$ZBXocNymw!8VUIPU_xK@u)b z3l1B_#1B}iR)t0s04LrX@$A!*amBcyJ9uZ@B<+;%orGI?F;yGSTxGBY%E$nq1_nuq zi$_P=*waDXGtdGhgiPRr=;7UQvF)ZiAqqgYgaK`}NhJ`TL<(2pcR=4h)mBgiGX3-0 z(;xE)%6KFSE?_MBV!!P*Se+g23wyeGI;6`gm0h%V^;^uK?H7lagp}8boS?G`3IPPo~7^oyBru01d`ht z^y9*+4_&qq^rJI1fPJ|f^rXqW1-ssXx+3nu?0F^ma6(f}ItqI5PvnQ1gcSOwD&db_ zCq@#0exVe4V=WPgDKPpc0C~;;@{ZHd5AjnkG}RvXg^{=ix`!C_N!;><#@i2elA%ci zbkM#oij4Eqk{yuHAA$e}G^3Lmkay}f|K*zg`0hF#ND*UBxWRSHMF&V{^VYLjKB&R|xZ)HGT`(yMdqQLQGU zX59|BVy}Is-}QlI5?ptL}C!X(8#!@=eN0POT;?(ka!P(R;E|?|1KSSDmM^ zFz%^S22PlgJ>6^2JPVH_kXtMzRH89p?{C!_`|ReV>J_q7U9m~s`t11Ckn-WS(Kb>w)SRgKr@PO<=t~>(I|^@-$Qpenh;>L%B;|W zW4qxlWItbLjjyDEVBwFvZ#K~1A5DrdmK2N>3#ua zyfI$QDZ)90Nfr+Yi;F~hOWZ{R?%v@AsH(0j^W4u+tkL+AWNM|f zM2&j@M)CCX$ehzdl^@zW(EFFE#M=h|w>&f71pF%5bOY07JEJ~8(~!_qfj9RrkgF{C zzxQ~&iK`4=AVm3g#ua@8h389U;Y`ZNq%)L@o!bOE-3EXLL+c=L6u~Fg;ddO3SOMvckM3Flg0|} zpA?y1)Y&86{|=u~Ir$TPFYe0ki-r(!xJ_}*-p_?kxD(iQhK~>oIvK1Ma?4F4Ivas< zZJKs*8YwfR{9BuU#&sX3+XH`3Eiklfqe@};>iNJJjU%Or_XZ&h@#e7|RVeo$ z9)sFA`4k}X747f%;qD+{zC=w#^oPJQEbY%O^oJ6Q&LIPL#rN!Q-#~RYATD9XN+0|{ zer^ZzR)RT)ySG)-n%GI?CwT@Z+6Y1-^}1vka!)+vp&2N}jACL;*LOYXkuc5SqBGrM z)CW4M$>&Z<%}HIX*)4mIM~i$?@e+>X^JRS=y&(vjEpe?bfT$Ct5-~_3__y_h7Oj)@;d<| zSg6TVB(&BD2KjDzyzTbA%Q^N>EVt1Lso|GRInA26Vmddx|9EeSNlGJ|hofFwu~YN! zCrbx`AFB>lPy6~BEB{n&xNPd9vd`?YW2lYWH^q_q7*H9|vng~G+s*ZIfVnoLDzbUc zbx=Z5hpMPKc^wql{E;KV&pW}=8jBb6`Fj!)(HFjVz4xo$emINY1}uT!{h4D@#x^eN z?-)(f0rhp=lvzR2qE?Yroz-p_`)x`;EaR9bD~=QG~ZalQpb<5T^tmL z560_*Mz5vYk8+VkVk6+ZkVoOGLu>N}QudM=w%ofWBEIiePqQm>RLldt7qL}EVy1BNKtRJai91L=!HaNAVGhlJKKw}}ECJwD6$ng*G7iCzDbu-MncH$^v0%=XuGW3bY{*FxI9q&k|d%lNQaaBqUH#jxN zd^(jDR$$t+TY;}b&6^Vu2GfJWu^sG$^a_=SZ5M$8kCf69z2{E-CQbU5{3CO$Cwky)4W^ojgtDH_km zvVd3)^u0Ij^iV2bn%uSE07-z-kpS=Wy3C}9YowEzI3)X!? zfn^@u{Fo*0{e@-tLP@!1qlt!@!G)b%i0C{YXg)Ko1m9r@o~0xE{kdxxCB^A9q{zOp zqQ%#U6X0D8vXBnvi>QHU^Wa7^|BeYSKw`v_?A_ioMwHyRWil;q*Q@?$ke-~jX4q5? zeZe$>Y}Pt!Lv*Y#qkTzOW;|F(g0wd*gS~Am#{8fA@E&?IO&ZcBpGXem;kMvY*m*|<{2gE`V zT~+!_l~6NvXvnDOGTJ*BTj?16C8aD!3fy;eI%$cl_w`D)4}2t~r^M_~g_vcI?u~2@{fyijV20jyz!igAD8`spy!;_FpqDD({OSb!|$q){R zWo}FEouFNqqu!_Ms^2G{{x>OkX6#*0l;DuG!aRfuNQWD|H|{NSKo(7R+mU*`1vda| zLw}6^2{^mqF3myI`Ba?$+WRIWpgIf;6vp?{9TSs4Lzt&I3oVh&Ly4R^m7}S z0|f{0;5SbY`P&mSOI^zVQMLMURYIe$^6zIo^EBKO3)Q?Mk3}%= zvdduCD_Aq0*ii@>TeAFcR8X~`3*Y9J*-(M(2&Ul`aIY!5PQqLhEtx{MnqW|r z1cJGPYpTB44lI}|2GMW8B6WG6iG>Z>m$+Kj6Ei+DUKgF&mq?)amWnG zbs1@D>jT>Ne7XL`D%K?#MqIT~)|b5k&% zp=&!i{*_X@0926tyKJ6-f>1fi}cl!Y7I@sVHD!C|1&I#~ek&b7md5b%4v^DTtbOX_ASEv%jX^#l7 zbX`6>7|9{a-(&=%+W6O)zxo0i}&w<(-;dlY(42sSh1lTFJ zsZG2urBm)-J19QKRORv6YPMOMB?oeUI>Wtf!UtquEYC;g!Yft5q9}85ZIBZH5oF{H%)Ly+|bKJ|)&p1g5NTtxjZ6#8E zh?(}&Y@;-qLpyBd-Q>!LA}QRPR#g4C##A@!U0!@i-iagiy^KdP>a#OPWE`d7jP-Qs zBsyq%l){Uiu@m%P(L*Tjb~JKzuFCYTt?)%gfE1QgjtalIbZA`Mo$<5 zZaM&;Xc0-3-Z=REc(fZ$@zpf?e?9(1uGcH23;K(MtC!xxmMqIlUp#WbYA^LEGD7DWhh6Xvy}|$cnJbxTMIg2a5!9SyC*4i z(9-H;9uFuj-|3albI$Mc69K(vh0z}q(p{lZj{3k*a}bKwz$4rsC$11zn@3QWWEUm1p||K#GbX{)Ten<`vXfK7?XCmq!FR&6KYwmAMXbMYK!Z+fzegOwBh ze%e8!Qiea#G#{)>9@l6@Y}1c!;+h!VTy2ocQ3B4 zY5gsD(oz4e zzlO8}#mt2f?bhiGC?UUCLJ|JF{WJQ)(^&XRculqEcdfmlpE8>u<5cNI#&1YPNB3{G zcYRe~aBRPY8}sobu(Y}ygvIAy$)P@YrHC!=OQ(t4F~rBQHw8Rl{4}w6&!-)D9!YFSW)YlL-K*NKk(yfIkeu4az zauVYp`VD2*AA?CAfR}d!!d%K(Ja||7?bqIL?um@-Qh_flJq_!18srw zz=rd_fc>t5_7z6-%h4&J;@0adz$?ET9e+J&j4Vtx@*BettHF{Mrv?!NqF1T6mpeDE z6S=B{X_H!Z==Tn}F0HjVsXrXEuZi{+rX>B{O}vtX#>YqZT;X%5lgC31C8*j@u(VhP?Z95?Q6uueVJw)pP5^A$%;b~aidL8G=08iO-4 zvb^&C$SC}1qv)F9pniv3;$G%iY;pgRcTZCC%nRio*dTYckeXhUQ?V|7drm7JW0uM> zzst(61$YDv@U-)}=M{l|hP1alAv!$1A>y8!)o@ewvh-M6-sYK4mLE?o?}$7^)9e>! zwT8#w*yJHoiHS*tDT}V8vWJnTvZ)D&B^Dvzt(~0%AZwBPzZZmfoC2DpNIT!7?9UI> zy$w<-4136gdYdD{@B|E08Fg(_8!K{XykXSl$vBd439QTL1G;24d@L%eSa_*=ak_h; zn3H3|TMM%^hUVncsHjO4^YGE!!W1=2YoH}qr7E+fk?}Hcdq?0sLK*1Y=M}c|(TJW& zU^(g1>;3zRFRsg_?a?p!iHy>jkV_3Q*yz37anj~~gz^WmJ(UjHK zx9z9f2fw&uwjMNBzn4|pa5}ijoA}Br{pHm=ZdUis6Z-FpY95}F-mO0mI!Gy#f73#2 zTf&!$*Tik;QXQfdLe(ZO?%0wtyK26W;GjtsNG2p1jK)*`V(4`@B>sh;1c<%I1udw* zJTrdKdBTt^5|KE-Ucn)b9S(=sIrwt-_e-O{3>3Bh^DO3!U*UtISpxnHbeEM84#lvgFjksm(GVf3Z8sD~e!slIqX4$%!_>`IMEYJo!){hNqaX z+3#eGc|?evWjn`F%-pyu^V9mF7%iF}C1`%kn_$Vxvhj9ch1XQWZruqkCW1k;ASE7p z*ZZd_`s9+8@ttbnOKCcIcYD9C3wh`(DAWL(_3BZ;JwX^D2GiMZbZg*yAbl#uDH*w{ z4{0+SVxlcrhnzU<#<{HmqpPm{yL%`em+Qi`o?>2pI&~PCiJiJ%&Axe(OdX zsEgjba8L#?b#k~XDY6x&`MT||gPM$90qm^!tWI+xqN$QO%52gR<-!Ts%`@V@0;eAHuiLSdo3YWonTD-&_omAd`ai_dbRUJ%leElvf;S>BjcX`I+ zsERwKLqbDHXP!;`jvMMgu-%c^@%#wep@yhdNO&hEThgI-yXFM+oJiIj!I4hcC zFoZ;Lg1Bb=mzMwJ&P;;<1UCjGJNMjvpK=aXbZ93F5aGm~Iztvtq#5eHV)#eBlDuro zCV6LsZi5RX?GR|s-xdF0jbeqILh?))N7yiG3e8ZbYYqnON2j^dwt^EcQo^5|3T|)M zj{530Tj!ReKl;Nj`D^KbJFK?n-t7+UNfzH)5K8W5g;d?gjn?M!B#xlA@~C%8TmNvv zZ>Llyp@J}vNu}{S;_XKmRSh^YhpHvICv2WZ;9RifWTR~f@s3w8lEc(TQn2$BiS26y z11prAWy&EJ`WBclUaDae5Gjvl>;u<2BxLvbu{8&hv+EgP-$;40) z2-fMsb1i!~R9)HAAL~iA{bm=1H}Rwu8iacN5ZY@5u1aZ|YCq5kBx5R(%G+u>0Qkek zFPxns;w^+?aDdn-mO~KR5x0yViA+E+ALBjb?UR$08W5Wux^INwZc!UFNZ8fXIRRZx zO&Lozb2L@Wfw7>?csC~oO1t(+eQEx*8fyi0Q;a$8ET5+(X>Jec;-GBc=+pj^6iFu_l|pzl+<9%42Ubhg6Str-%q40?n-he8QdER4P$X+FDeD&lbwp$pZPA_kcNr zn{VA$)RWmZ3o0=ih6__R$-g)(&FJcyO0Tf8OrX^8fJ?;*KR;yCz!}crn_Ji|e$vZ~ z7MK%n22%verm=Ufs|ZBpCSt6gse`Rgi^OPh?PCkVNdM<%xub!<1RM8B`?JLqJC4fs znT0RUh^TWc$#6`_i#*~vGz=aEkDL6L9JCH|8oD+gft^56nJM~ixjO7hJ3Kty@zju8 zwDB)-{S$aIh6-jDjT8|}%*_OM$%OwYdZCp{1co!$jaZ~!gX3%yY z6Oshsa;18l1xRuPFb4ZTEcVG%9tH?Yv106A;k$v999diHW@vt{$m{=cM~0dl!Djdt zqMKy`%M79_u%NWt7qw2bH=E7()p$5B5)b6Yk95^w(667;=M`0U1|SU6@h;5$NO7d{Zzr!r26-QTDrn@>q^Rl%_IrbhnlgJ)BY=gH%sa^5%Bv{a zsbjM?4)<(p*y+eg!EKCBo#or>*X2+!qs)-{=KJ&9(nnj&C#>Bn)!A0H;nU((3Lmy# z7?aVl8$zF+u_(pSoUsu=;8~;o;-UB83h;EhXjNg)CN@*lB`!x~HZ}_5eBpTEHUm)f z?xa;Rz(3hKc6TsSBJj(UBr#$;Qgo=%_j14_4JrxD8DbZ+v<1d zwD&9u74Y9R%>R`Ra4Xik1lAuBcW{;V{7>@ngeN$#Zz(|R*G<0U)>))3AG0g5O}vUG znJLg(^3osF0%kQYyq|67A`{)n*_eVHc3>cbT5040H&}CqQR40tL;AGL9~pT#inEwB zaoK7m3+I}F8@Hfip3^~*kPqer*ksO-Pp@DMJYk@Px{0qPZnPyS(ogFVcs84wG}0}@ zymJn>^=`PpVxMr>n`X{@_hqcD+E25PPt|BNP4{;1aCX~?N8i}4uk0)}p!#W1uk_LG zZYx2NQ1j_52A;#kiFUbeq}bmg1G0np9Gfl)6k- zx?e+;QczO%gvAyz;h;EE`OgUNb;gcybY_ojx>jtvs}w8Cqq3?LE4rE#C7ANIcwzie z(mIhU((cVpjDPIFxxF>$U7Xks9-Zew1czFuC~RR2qsLEE$*hA~J~U5TaTk(+GU$eVha2$GhG%9>i`$7038qH-Tg^;472ZqUJju z|Fy8Bnw;-@W~|F&xN(JnBGmNyce8s*%X*_hirDm`5;;_X8q0Ii`Y8purhL+bF9fNk zcZ=apTh^c@gJsWnZ%9RrJdpF~T@t{oeTVewuP}|31tAAj+-RJMOzbey^aqi?1UE`r zo90VjXiO14CbarvRl_I&LgRF7BW!+k8xp(Tb6ijA{SFrB<(@{L5ZK(stL6HC08c=$zb!3_4YyJ)c4qT!nXW{l zE0ZziVwpNXIEa9W$F#H>r6o%#7andFeA1;|%Vtw0VPO&~l`v_kY;iW0_Q}j_DgI)ae=b4fnJER$K9d2)$?K?6g&u4}?Mmr=RL0JaxFCEBw^(t#Ww4wdzfnD8~ zb*X(HsMlP7J7k{z>sR}^Kze6nJ1cl&AcDYRO>^8i(3&(m%QlhPGB8fzpib?bp44M(*XET zzoO+i<)8d3#@-ymx4i83;(!F36O^M?1UkjzEB{Rd?wsBxv}OUih1MzPwwM8z*DNIT0c#w&8|Z+CN;FR>EMCePu?XyB_L;lZc$2A)kpY zshiDC`E4EHlf`kex6{|$H#ZYZywbeL>{N$?XP;E39u7%_Dk?nGwET72_Q~WJ$m6i< z{YH9Fw7?}GKZ?fWCj?Jk`Zn1o7zv4!(miYn3oBznHQu18-LPA+^tVp~GcT$|snp#n z!{ZXG7+zjtMlMxMjjNz|xnxApXk`?2&q=kY)W>ZuVW@xY}@Lc|KzksthY?jH6|U zUj%`wJTKeDx2jkQYP3cfbtJzxB+)0wAXRT>mDz||-8W-K4XBN)2cBO_EErY%T%b%$ ze&x@K_OBi=pQgF-%Jh~SlQ>T+;afk(0%B4Ys#wXfhdCUS>!jZDWK^n!jj21Q1_#j2 zB?Xi7&(h54CeIXmEiH#-*u9nr>l{mWdWR29L~mYx46!=FEvI>pYm9?fhW3gb6Y1RP)ATs9fcFtZHtMfs=3!;A^$aS^sO(+I7xx_2&gY*i!-;v4l@JcRWU{R^qirQeGJ-WwL_$dsy7;E|z~k>%kV#-)(e- z71;k^h8gTz#*FeQ3%-NrO%_n*#DCDW8@2w$h3W6L;VzDp{+q09&LtwkH+)w(*$0`T zP~-_rN|;s_#e7h1k3MY-?!U|g6T|!aSlraEU&JmT#tBh0G4lR77hQIia7>Fv_V=?g zGTK?b%uQ^6z;7iY)kCRejOeIl2~uyTO6ELlZoY z5&eDLl|yIFfKKiD$86F`tPwdao%HY?%)R)X{^g@ZybelvQY>? zera&^RONJh?e(*>967Ax>b#K`oyePRnn2bEr&`$BMwrB-fKyxDYvi4@2KOtgwmKz+ zCI*#mmXf>$+FNXoeIE@V{#h_JtbPCP{ri1|Gc#Ao5WgCxx>L1e~I5MmWVHZ`ZF!6nJIB+5io328$xq0xB z`zmoExdu5DLE&jD`NC^{F~k8b_dJ1nrlpqtP!0a{7R-%Dw{>2^Gt&ptocW>lGKf9N zDfMsC&OxNQHYMfo8N-2ja9v?HnS04yVV{_LVPD{L+)H#)J#Q7wMN4wG9q71Tq%*OZ5!tZN^7_=zCc;19oN0Pn_dahu+lnwoePs z?qBeQ$uRU*kT7UB$JAWbVPd`|ksnwc8Iw%9QV=%&vLejpN=P!O-*j5_vlwPwcO}$E z+JxIqasU+cxmmmWxwxp?+8hudHYEDuf`(4}XGOYNvpOvLJm5c%bzLPOh>SL}V4(4_ znZ!H$hczz#cxxB0b-T`9j)vCGVQ?$;-j3O$@$UXJ<&Q^RSPvOK_(_j&<{eQ36R*R7 zHTP)e?o;3Q>$tYk@2LBc!|o<;P!xwKq@Ib2hP`*luSwe7)XXnGpmTN&hELP&iHxsi zW^09Z&`qkSVakGsBxSmrM)Zafb)&U>Bb#Du)0L z;UEs<3;0qNbR(xtN!)q8ykkT9rz&_zpw(({cflmO) zpoBU*2Qx~S=kX_r!nje7pJQ%%kb}i`u!}41wK2-a#uBN&A78{7;4D}lC7AO0w@HrZ z5o*%qP?D}gG~(y>Q9d8azMqkJ;&mCUM_l!OaSt)j7iSabLnJ1}W+*1D6sIn4ZOdFy zY7yTHP))!9Xtar}$REBA#|yk+HBFXjhDw!NW|{d+iY*cu�zBE;A6`RoYnYVbGchb9$^iIU2 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 literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/inter-roman-vietnamese.14ce25a6.woff2 b/docs/.vitepress/dist/assets/inter-roman-vietnamese.14ce25a6.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5a9f9cb9ca0cd78b6ea2f3e5c9d2838dc8895598 GIT binary patch literal 8492 zcmV+{A=BP>Pew8T0RR9103j>@5dZ)H07h5<03gEv0|eaw00000000000000000000 z0000Qfg~G@2plRuNLE2of^Y_4KT}jeRDl`*f;ca13aJRB4KTl60X7081B4(8f)W4( zAO(aP2Ot}wL8BwA#{rDwTbk^j37MN0nnkm<&CYCgamAG{BQEv-@{h({JoW2WsiKJ{ zny6DpNHPoG)7pQYy0^RMEdaY!8%0bCP)`3Bl0b67#zmoxM+wMNKk&@$|J=(RT-bHH z&ZRfSMH4riXiQO2mtGhuDmm0S*_?%n8{4L$t(=MqgOqF)PiZY%M!9Mg`Sy%wXsdWi zi&vE7_{K|0QofPlA|)dwE)T@Ldw-UVjnSme!@vrsm!}gjPXlfXhXJSKzO~;D_{{Ft zj#v{*BuL~hh*>+q?$fMk0}-VxizyHmlss&T2(Vn%$U|B3849(nV*F&`?B==1_Ccqdm|ZONTW&&@StM@DVh$ga-iLzu~Y&GUY_3sURj%X_ncfPmoA3C17NwajDXbzt)aEFj@Hu#+DKbyD?gcrUjTvlky0JwkaT2p z8AY2Qu-I6`8`6=EbfhC4=}1R9)LA0?t`iZ766832kO=LeFLgp3u?_&16bTh}*?wY` z29u=(+z0CbsIRUF)!9(t07}m;w`r94SH>0B--x_ovEiXmZ)gc(sTKfsm$@cOl_kKB zN)2Gol=8c&Goqr1n?d6e5Jt%HJd<)iXHgQ)^Rhmn93`fF;Kl{9m&So$tpP#T0KFe7K@E#vfJ8{t0S5CS zV4r0~E^7FF25T$%Y^d(U#(j8H@?`KvynmwSL7-2301rqk_+P&ibaEe_Wl#Eizfb8? zhcppoL>neROy zplht+UGz3~5sWb+6fE|u>f6a8;ijibrcN!R z%OtvX+N^2PENMf_Qh3-^ZZBP0X~#^do&u@bUbbu<9d(f8Z;AjxmY~QZqKntoYS(Di zuT}zdatJqJdZomZdPuNFvMCpctqloDU1yo2=sWVGFV@xOZs z8Je~B$nL}1Z$Ztb6hwWg5$8fQapIDgi53Qph^mk*Hojm4My|x$^mrcA%T`Sw%dY^} znZTQ{7W1K8YB{;I0Fw~8eEfiYFyufL?gUqb%oUWvLO~8<`P~D}eM2AkS6`i^g#Dt( zs7erIq=p4jf=yCgC)NEzzVhZKFM99dw$7%-d+enbyZcUaUTOK=Qz`MmVcC*x((=No zf=eB6X&VM<(ju}X3Cu>1$rdt2H7O0#$CpeKG|Q8X6ar`_F6r@xQM)B!XfbODc&O_Q zYuK=*qg3fxHX8EAGMe{pF<4BgBpdBUCLh^A!qyp`s>or4AgGzw9IG?7!)~nCUHi02 zR=O_GM(k#zdYSbSujOV(`(?9{=^5o5Nh@6-on%Z#U0)fldj0x&5kM!L@R5=B~ zvSP~{r#D|*3UxTEyXk4ArojO;^ z83*hm!k#W19N#u`S!$4EzN@o}Usi<>v{*o09>D?P1H{Uf4v~WDJ}OFq@w;d=_t=G# zE%!2SG|7D_ELvRgPWq?7BKmsp!@JY%061j8VVu9pYxG_w!Z$mfzG$EKp_Abu98A?< z-y@*>`n#7Ib_*@bmHh>OtL6=E6MuZ}oM=+c6W?`V_sp3rAg1Q~`(FGHX1(FMh%HY* zhCKBpziR8y@4u_2$xBmx`7>MAV@;%O@4x?ttt-(3mNQHVe+Lh>hyC5hH&lIih2v0w z*?~XBIz+|)Sp1nvk2<4n$!**fOAv8ReOGv?z?*U6Lbes-*E z?bVuv&jtEM7j>-gm3rEC|L>!8GDPg$vGZ)rrjc&nw#^^tB0uT*UB!C~YB%Jckm?K# z`_7o4(kJjuJ^z+IefzB~<^MU~b82&=>E+^d5^#ur$A9IC1OM9mcQf{8zn(YT2XlOaA8EgPb28~R%>6Rd`Af}br*}^MPVWj1b~Sx9^pyGe;E`=V z9JHV6Onqm1abu5kTkGVS>x-v6`R=K|bP$0JN!Y+y21{<*s8DR)xTK3OuMSePASCt3QVw$5(AEq846U_kcCO$xzWTefN|@I83w!$aq#D8jekW+S2#lO31#a z0f;h%9lCR|c-}>Li>*KbBw)jieH((n|B54rsjLtfns z$=v;w4V;%RhF|P#vTS@TAEZcjUtDnZ7vb1}*c%rvg!cX|UcA1sy``aX+~dazV^<6H zwRaxBipRFREF3v-`HfG`{Vy-FcwJ*tlf0@m4MVJdZbr3}%PaOg+>rm|f4^*BzsjUs zfy3;>;i%=x+rCeJeA^OTT&HVkXNNQ@-HhZs`uqbP?xlA*L62Q_ibXqGp&NP=*eq^O9O`zjCtX$b1JNT10; zWdB}Vu*d*N#7M6P80jS}lcZ$TV~nbl{@N#{WsN7&?W>Yp; zaKmrtVi3`pRYGE`}^zOw$bWb%$ ziQnIwTGk;Z!)h6adRfb~kECc5r)t@f+G%gSE+g7?hafW)btanagbSWC8wvpy=MJ7_ ze*X6=v*Xv-bDs^N005u@I3ivu6K3IRcRqnoRX!i2C?b`tPRVR1@eDJ=Ap0$cjSY}N z&5Pm+P?Jx1c+#`6g*7&kICA0PL40khY-&E88iKVLV9peyYdMfz%0vi#dU_Q zMmKJXfgk6&EIhV=o1&={9FEpTqf@w8#e}IQWWVG%xp}#K8^3`Wl=$nnVy-$RGifWc z1|sd)BW@hHx{H`7l8B*Wz=KQA(uTNv#-nN&;1s2fiNXkOU|ayJ^VYLQ0MyPUVwFWQ zI4x?}P}87E3v&64-vTNos%fCG!H_rO#9f`PQI$(k=wx?5#L3zXM6~Q-1G=~b4qza0 zS6pY)b)|kPX_WXVt5>^>2Nyu&(P)VCcA*5|wc*3t0RV=fYf(8?rU`=Ck>7zLRJ2 z^OBG4DErHE<#>6wcuSysS8mjzT3TmSMO{;G)%%UhrdnB(Hbv7kUE9(2x98d`?cL!x zrJPDmHRmJF=bZoJT<6@z5uC&y!XLrc;m!Ed_#yly{2sTHdx+b^?dN{TJ+Sl(} z_r3V*{4M@a8hn@o2oM1RGXQ{gt%^Zzt(A!l3`XUQ$tFdCwzfYbhcxL7hmA%nji`}~ zdl}M?XaR!(1~3sMC=<}qSe}tHq)FkpoKadiH={rR7ZBhAfSKqRGt#gk2NSYK;0XXl z5LC{zw*X9K0P#sUfGAHC$Ym@yi-Z9xC{6%@o8Hy~svJC_DgcU}MW3rwnLA$LgwNvUxz3#2p?C`sQ&L@KfbuCpEVuVn)+ zhjp(fzo-4!{-8~`wf8zLOLi4T-q^x}{~Y!RldOBki-#E51D z;*5QQ98TCCQ2{$Uo1pePMKb*sCoXh;_T)L{mC%2)#{L4r`2e?10AWIs}%D7cM)J8`7>|HI{^-K~ z`~&!H3K+oF%eE4@@q&WUHr7jVs~o!Xm$uWAk~?8t!#gDsx?KU?rcI{f`L$dEW_&~la&8Am z@?1DTchW&s2!#$DCxBOj-R+$k(`GvWG<`}{qP6yBme=CKn9y4v0v#KsWYCFR#V!ye z1Sf3;Fb!4UYSuT2D?n$K1nAmpw*>LIEAO2N`+)>?E{Q4aRDUUN({FrChiA-lW#+*24fC;3RAro57J;ybWtb_Ui+n7tg40{LiL)*lc4T}1d;naJ(?vaQ{=>li%GA7sVy4m8M~!XD9q7PH{r;?nzlR$x#- z?_y{%R%AmC`U(f{^L`cd%*dzC+ih-}Z1yG3-LiP`(pHzfOU|^pW2R#N)25?*fT@bX#D>Bjl1R| zwHfh9A3UqLgI2Gvo_4rzaBN&MbJ_2seV5~}Q9>6-uvHla0{dp{-TB%r(XJ(Mk$YsY zYM<14e#X~hS3n>*B`03?@S%sWkn(g3(}%`X*o7o840lp5klv zx^}8*=nkC_vvSJkfz*EcK;<_&M6z|indvep%PAjL)Dn82dmse+eie>@n9v1#Wx%_rut1);n&qm>u9ID(=q6k#DK zcus&+PEBY`3h-j0zq4JXTJ2@m14PG|moJ;5X{Qsy`W#+I6i3t{8^Z2a9*B`pQk>~5gEur>|DYp{w5AMiy?&}b0 zGA5tI{`~9o%w3GkpS|@*zQGpk+i2ec?3*JFPm~++OVLP9v}V5ox~nmA{~B>v$!xc> z7;U@4;-z5bnutQn9Oe-;x5PwVJXv58m4U*}!xRu8fGsQVpN}Zkn;?(;j919PMqsX@ zQ8|DEY&p|fKM{7mlgr)ti#?_9YOan>oT!#V4@a`JLQp)x@A64!wo64J}ETfgGJqe5F)r{N;AKFDTj8uSL1Uy zwA&et&*{)^_%-WN0}$d8kB5ID;|qcdadL?UmSy77!OAXjiH=~=brMP zfL5=C$LD8;-R?-_77-kCGehZ@t5S4biNGhmHH&_UKn?YZCRe&ehX{Y8iG++2)UJ3t zj4oG;PFw(s{&fZ3jr+)r^A|@kR3xF9jtB?Ea>nSVi@9$YT-}18go5d?&TY|UPFmy) zWvZirs~H=wefj+$e)sy<9_Jtpsi0}65+af!bCCz({78enTM*tv1zaM;nP?OEEpl+- z>ZndzVdFWAqjJ{v@PlHz^i7&B-7P6m4U{6h#2jPcS<%GCL)|jbq3k&t`Z{XFI%uZ0 zpJE{pivnmm0gh<+vXw=qQsjSK*rhieL@MnPhjw!z zj!S8#J$rk*w-irciA2onjU}uKNRknT@cGryFEtWI!e$ytS9c>Z zpI=d!2BNT#oJ4D)!#`qNPWHFN$SKJ53AMEk2EFz_9}WcHa=ULyYZpJJJ)zz@LAdo+ zUr*&txE|>QmJ1<|8_H`6J#I8!jV}pM&Mb-${H3d>06#%ysF^yVTF9zD$Qz$ zw=+g0;v^-=5sBt0%cUdWtU*|yf=}yv65wlsd_|bkc<)B zKx9dc^{DrQN=qkaJ$sJP#%VtP<-@b^)7JV?OJzGE&)s8$Bb^(xjKwgD_8^5}>Fn!} z7RqEoE0|7#FeBKPXdWC13#Tm5wC*cb%E60cd;)cX1-m-LLa$nY-G#9OZg;>sZX2^( zEI-`t^qVd+wKJ)7@^edzn)ea0S{lq{WcA=Le!u^hP97G<4Rfe)J*~7Grt@_~rqoZ@ zFDfdI9(|!&*6MLLxMKG9d$0C5kG^rDZwa%)1U`MaD@Hn(v`qFxkN0u(_I-?+F3$X! z<2^8@z*-GWUB#R{Kb{dYXG^B#xUJhUW|723Kw{x%205rX^N%&pEE@qJ| zpUvmT<3C4!42KDVoBlhS^%b{btyAr%r|;`xn8icS%{6PzocUMJQfA+G+UBfY4|?xNGi80s-MeEJcw)>?`o?XX8z;_Px+~5Jl6CB7FFRLhgO9VhW~F=A3uA!U}Jnj^|FB z>73KT!6*vD^cZdd+=}Bs5=mS@YG`mswX4SEkzOxJ21u9J>mtPIDEi=4Q*W-5QBK*M zhcR34QZI@x?*TovT2QG#K!dpn1X4;Uq^v6F#YqPa2I$6)lJ2M_=efg+$z-X&(_)c8 zAVQ5RaPg9r(~r6DnFHQzg>GC^FvJ`Ei!Vn{oOtc%GRELm*La#M>IXR0#7Hw_A5URe z6^2nbe)~?5P~L11PMIQEFuBCaE*8h6CW(p$^CA(RkK;Hc6xArfT=4zOO}OuUvR;yO zkfb-A9y2)YHby&D^K;NG^@x-gyt{Kx3oWLF&6h^uogboCQdS!5 z(JnC1;4ON!tmDa*#Q^&8a1J*wahPt7GeVeNUM{WI)NR=#2RpXdc{tEQy(E^XY(5rr zqjsR*6?}hS=*(cP$2*kzZy<f5&+Pk01)`@QF`0@L`kO=K*aX5dtz~l49AG-2TI$o zIxGnfH7A)0N7Xc%AdAJYbvjLhGaUmnTYGhF*-j9V;ewesc7tm>K#m60!Azw%uHJ*g z@-W&oRM>+PqmKb{ktFTvB5G%I>?fVt!cl3zn3WTLJrRt=`%>6f0lF>48E0!}NY+r^ z3h-t%6D}#Dz<-Uve^lD^xfK=|SE5yxqD@I-86OBkf*ge~GY)rnmCIY@5-do}1>h3U zhY>urVN`*~!z?qkmt*E|p1F>fv32J{3V{$3VG>+4JeKj|;UakMS>wiuAY2R)VBrTS z3drzy@Srq2f#RUzxlr(eMO53tXpdc5G&ATR@NW2Lk@N}F?%>wG<+h)wTkRT4W0xIT zZMDU^Q0^%m40cfdq}AXWTQz^#?KbIUb?087&Qc3T=&Q6KLz~P|x#hXGlGv=yAnI$e z!+x{`W}8W((tHawYtdnb1FkoNFuZQsV!I_e)m=7CQyVV(H~HA@Nxcm|Wt+7lZo9OA a!Vc~9U7SGB8$q3Ii#9CnAx#qS0RRAsKuhfa literal 0 HcmV?d00001 diff --git a/docs/.vitepress/dist/assets/style.d1d977d1.css b/docs/.vitepress/dist/assets/style.d1d977d1.css new file mode 100644 index 0000000..f0bd8a5 --- /dev/null +++ b/docs/.vitepress/dist/assets/style.d1d977d1.css @@ -0,0 +1 @@ +@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-gray: #8e8e93;--vp-c-text-light-1: rgba(60, 60, 67);--vp-c-text-light-2: rgba(60, 60, 67, .75);--vp-c-text-light-3: rgba(60, 60, 67, .33);--vp-c-text-dark-1: rgba(255, 255, 245, .86);--vp-c-text-dark-2: rgba(235, 235, 245, .6);--vp-c-text-dark-3: rgba(235, 235, 245, .38);--vp-c-sponsor: #db2777}:root{--vp-c-bg: #ffffff;--vp-c-bg-elv: #ffffff;--vp-c-bg-elv-up: #ffffff;--vp-c-bg-elv-down: #f6f6f7;--vp-c-bg-elv-mute: #f6f6f7;--vp-c-bg-soft: #f6f6f7;--vp-c-bg-soft-up: #f9f9fa;--vp-c-bg-soft-down: #e3e3e5;--vp-c-bg-soft-mute: #e3e3e5;--vp-c-bg-alt: #f6f6f7;--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white);--vp-c-text-1: var(--vp-c-text-light-1);--vp-c-text-2: var(--vp-c-text-light-2);--vp-c-text-3: var(--vp-c-text-light-3);--vp-c-text-inverse-1: var(--vp-c-text-dark-1);--vp-c-text-inverse-2: var(--vp-c-text-dark-2);--vp-c-text-inverse-3: var(--vp-c-text-dark-3);--vp-c-text-code: #476582;--vp-c-mute: #eeeef0;--vp-c-mute-light: #f3f3f9;--vp-c-mute-lighter: #f9f9fa;--vp-c-mute-dark: #e3e3e5;--vp-c-mute-darker: #d7d7d9;--vp-c-brand: #4565d8;--vp-c-brand-light: #708fff;--vp-c-brand-lighter: #a4b2ff;--vp-c-brand-lightest: #ecefff;--vp-c-brand-dark: #4565d8;--vp-c-brand-darker: #23459f;--vp-c-brand-darkest: #132f59;--vp-c-brand-dimm-1: rgba(112, 143, 255, .05);--vp-c-brand-dimm-2: rgba(112, 143, 255, .2);--vp-c-brand-dimm-3: rgba(112, 143, 255, .5);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d97706;--vp-c-yellow-light: #f59e0b;--vp-c-yellow-lighter: #fbbf24;--vp-c-yellow-lightest: #fcd34d;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-darkest: #6c3d08;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-lightest: #fdd6e0;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-darkest: #9f1239;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5)}.dark{--vp-c-bg: #1e1e20;--vp-c-bg-elv: #252529;--vp-c-bg-elv-up: #323238;--vp-c-bg-elv-down: #1e1e20;--vp-c-bg-elv-mute: #323238;--vp-c-bg-soft: #252529;--vp-c-bg-soft-up: #323238;--vp-c-bg-soft-down: #1e1e20;--vp-c-bg-soft-mute: #323238;--vp-c-bg-alt: #161618;--vp-c-border: rgba(82, 82, 89, .68);--vp-c-divider: rgba(82, 82, 89, .32);--vp-c-gutter: #000000;--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black);--vp-c-text-1: var(--vp-c-text-dark-1);--vp-c-text-2: var(--vp-c-text-dark-2);--vp-c-text-3: var(--vp-c-text-dark-3);--vp-c-text-inverse-1: var(--vp-c-text-light-1);--vp-c-text-inverse-2: var(--vp-c-text-light-2);--vp-c-text-inverse-3: var(--vp-c-text-light-3);--vp-c-text-code: #c9def1;--vp-c-mute: #323238;--vp-c-mute-light: #3a3a3c;--vp-c-mute-lighter: #505053;--vp-c-mute-dark: #222226;--vp-c-mute-darker: #505053;--vp-c-brand: #708fff;--vp-c-brand-light: #a4b2ff;--vp-c-brand-lighter: #a4c8ff;--vp-c-brand-lightest: #ecefff;--vp-c-brand-dark: #4565d8;--vp-c-brand-darker: #23459f;--vp-c-brand-darkest: #132f59;--vp-c-brand-dimm-1: rgba(112, 143, 255, .05);--vp-c-brand-dimm-2: rgba(112, 143, 255, .2);--vp-c-brand-dimm-3: rgba(112, 143, 255, .5);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-lightest: #a7f3d0;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-darkest: #065f46;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d1a336;--vp-c-yellow-light: #f8e3a1;--vp-c-yellow-lighter: #fff0c0;--vp-c-yellow-lightest: #fff7dc;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-darkest: #6c3d08;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-lightest: #fdd6e0;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-darkest: #9f1239;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-local-nav: 10;--vp-z-index-nav: 20;--vp-z-index-layout-top: 30;--vp-z-index-backdrop: 40;--vp-z-index-sidebar: 50;--vp-z-index-footer: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-c-code-dimm: var(--vp-c-text-dark-3);--vp-code-block-color: var(--vp-c-text-dark-1);--vp-code-block-bg: #161618;--vp-code-block-bg-light: #1e1e20;--vp-code-block-divider-color: #000000;--vp-code-line-highlight-color: rgba(0, 0, 0, .5);--vp-code-line-number-color: var(--vp-c-code-dimm);--vp-code-line-diff-add-color: var(--vp-c-green-dimm-2);--vp-code-line-diff-add-symbol-color: var(--vp-c-green);--vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red);--vp-code-line-warning-color: var(--vp-c-yellow-dimm-2);--vp-code-line-error-color: var(--vp-c-red-dimm-2);--vp-code-copy-code-border-color: transparent;--vp-code-copy-code-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-dark-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-bar-color: var(--vp-c-brand)}.dark{--vp-code-block-bg: #161618}:root:not(.dark) .vp-adaptive-theme{--vp-c-code-dimm: var(--vp-c-text-2);--vp-code-block-color: var(--vp-c-text-1);--vp-code-block-bg: #f8f8f8;--vp-code-block-divider-color: var(--vp-c-divider);--vp-code-line-highlight-color: #ececec;--vp-code-line-number-color: var(--vp-c-code-dimm);--vp-code-copy-code-bg: #e2e2e2;--vp-code-copy-code-hover-bg: #dcdcdc;--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-tab-divider: var(--vp-c-divider);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1)}:root{--vp-button-brand-border: var(--vp-c-brand);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-dark);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-darker);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-darkest);--vp-button-alt-border: var(--vp-c-border);--vp-button-alt-text: var(--vp-c-neutral);--vp-button-alt-bg: var(--vp-c-mute);--vp-button-alt-hover-border: var(--vp-c-border);--vp-button-alt-hover-text: var(--vp-c-neutral);--vp-button-alt-hover-bg: var(--vp-c-mute-dark);--vp-button-alt-active-border: var(--vp-c-border);--vp-button-alt-active-text: var(--vp-c-neutral);--vp-button-alt-active-bg: var(--vp-c-mute-darker);--vp-button-sponsor-border: var(--vp-c-gray-light-3);--vp-button-sponsor-text: var(--vp-c-text-light-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}.dark{--vp-button-sponsor-border: var(--vp-c-gray-dark-1);--vp-button-sponsor-text: var(--vp-c-text-dark-2)}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: var(--vp-c-border);--vp-custom-block-info-text: var(--vp-c-text-2);--vp-custom-block-info-bg: var(--vp-c-bg-soft);--vp-custom-block-info-code-bg: var(--vp-c-mute);--vp-custom-block-tip-border: var(--vp-c-brand);--vp-custom-block-tip-text: var(--vp-c-brand);--vp-custom-block-tip-bg: var(--vp-c-bg-soft);--vp-custom-block-tip-code-bg: var(--vp-c-mute);--vp-custom-block-warning-border: var(--vp-c-yellow);--vp-custom-block-warning-text: var(--vp-c-yellow);--vp-custom-block-warning-bg: var(--vp-c-bg-soft);--vp-custom-block-warning-code-bg: var(--vp-c-mute);--vp-custom-block-danger-border: var(--vp-c-red);--vp-custom-block-danger-text: var(--vp-c-red);--vp-custom-block-danger-bg: var(--vp-c-bg-soft);--vp-custom-block-danger-code-bg: var(--vp-c-mute);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-details-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-hover-border-color: var(--vp-c-gray);--vp-input-switch-bg-color: var(--vp-c-mute)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: var(--vp-c-border);--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-mute);--vp-badge-tip-border: var(--vp-c-brand);--vp-badge-tip-text: var(--vp-c-brand);--vp-badge-tip-bg: var(--vp-c-brand-dimm-1);--vp-badge-warning-border: var(--vp-c-yellow);--vp-badge-warning-text: var(--vp-c-yellow);--vp-badge-warning-bg: var(--vp-c-yellow-dimm-1);--vp-badge-danger-border: var(--vp-c-red);--vp-badge-danger-text: var(--vp-c-red);--vp-badge-danger-bg: var(--vp-c-red-dimm-1)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand);--vp-local-search-highlight-bg: var(--vp-c-green-lighter);--vp-local-search-highlight-text: var(--vp-c-black)}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline dotted;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:1px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand)}.vp-doc a:hover{text-decoration:underline dotted;text-underline-offset:2px}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block a{color:inherit;font-weight:600}.vp-doc .custom-block code{font-size:var(--vp-custom-block-code-font-size);font-weight:700;color:inherit}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;color:var(--vp-c-text-code);background-color:var(--vp-c-mute);transition:color .5s,background-color .5s}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc a>code{color:var(--vp-c-brand)}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;left:-65px;display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;width:64px;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:"Copied"}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-c-code-dimm);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-bg-soft-down)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-7a7936a3]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:600;transform:translateY(-2px)}.vp-doc h1>.VPBadge[data-v-7a7936a3]{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge[data-v-7a7936a3]{margin-top:3px;line-height:20px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge[data-v-7a7936a3]{line-height:20px;vertical-align:middle}.vp-doc h4>.VPBadge[data-v-7a7936a3],.vp-doc h5>.VPBadge[data-v-7a7936a3],.vp-doc h6>.VPBadge[data-v-7a7936a3]{vertical-align:middle;line-height:18px}.VPBadge.info[data-v-7a7936a3]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-7a7936a3]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-7a7936a3]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-7a7936a3]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-1bc323a9]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-1bc323a9]{padding:96px 32px 168px}}.code[data-v-1bc323a9]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-1bc323a9]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-1bc323a9]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-1bc323a9]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-1bc323a9]{padding-top:20px}.link[data-v-1bc323a9]{display:inline-block;border:1px solid var(--vp-c-brand);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:border-color .25s,color .25s}.link[data-v-1bc323a9]:hover{border-color:var(--vp-c-brand-dark);color:var(--vp-c-brand-dark)}.root[data-v-463da30f]{position:relative;z-index:1}.nested[data-v-463da30f]{padding-left:16px}.outline-link[data-v-463da30f]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:400}.outline-link[data-v-463da30f]:hover,.outline-link.active[data-v-463da30f]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-463da30f]{padding-left:13px}.VPDocAsideOutline[data-v-c834746b]{display:none}.VPDocAsideOutline.has-outline[data-v-c834746b]{display:block}.content[data-v-c834746b]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-c834746b]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:1px;height:18px;background-color:var(--vp-c-brand);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-c834746b]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-b89b6307]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-b89b6307]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-5774f702]{margin-top:64px}.edit-info[data-v-5774f702]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-5774f702]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-5774f702]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.edit-link-button[data-v-5774f702]:hover{color:var(--vp-c-brand-dark)}.edit-link-icon[data-v-5774f702]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-5774f702]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-5774f702]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-5774f702]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-5774f702]:hover{border-color:var(--vp-c-brand)}.pager-link.next[data-v-5774f702]{margin-left:auto;text-align:right}.desc[data-v-5774f702]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-5774f702]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.VPDocOutlineDropdown[data-v-0bc40447]{margin-bottom:48px}.VPDocOutlineDropdown button[data-v-0bc40447]{display:block;font-size:14px;font-weight:500;line-height:24px;border:1px solid var(--vp-c-border);padding:4px 12px;color:var(--vp-c-text-2);background-color:var(--vp-c-mute);border-radius:8px;transition:color .5s}.VPDocOutlineDropdown button[data-v-0bc40447]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-0bc40447]{color:var(--vp-c-text-1)}.icon[data-v-0bc40447]{display:inline-block;vertical-align:middle;width:16px;height:16px;fill:currentColor}[data-v-0bc40447] .outline-link{font-size:14px;font-weight:400}.open>.icon[data-v-0bc40447]{transform:rotate(90deg)}.items[data-v-0bc40447]{margin-top:12px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-a3c25e27]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:none}@media (min-width: 960px) and (max-width: 1279px){.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:block}}@media (min-width: 768px){.VPDoc[data-v-a3c25e27]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-a3c25e27]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-a3c25e27]{display:flex;justify-content:center}.VPDoc .aside[data-v-a3c25e27]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{max-width:1104px}}.container[data-v-a3c25e27]{margin:0 auto;width:100%}.aside[data-v-a3c25e27]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-a3c25e27]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-a3c25e27]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-a3c25e27]::-webkit-scrollbar{display:none}.aside-curtain[data-v-a3c25e27]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-a3c25e27]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-a3c25e27]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-a3c25e27]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-a3c25e27]{order:1;margin:0;min-width:640px}}.content-container[data-v-a3c25e27]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-a3c25e27]{max-width:688px}.external-link-icon-enabled[data-v-a3c25e27] :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.VPButton[data-v-fa1633a1]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-fa1633a1]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-fa1633a1]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-fa1633a1]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-fa1633a1]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-fa1633a1]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-fa1633a1]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-fa1633a1]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-fa1633a1]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-fa1633a1]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-fa1633a1]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-fa1633a1]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-fa1633a1]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-5a3e9999]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-5a3e9999]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-5a3e9999]{flex-direction:row}}.main[data-v-5a3e9999]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-5a3e9999]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-5a3e9999]{text-align:left}}@media (min-width: 960px){.main[data-v-5a3e9999]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-5a3e9999]{max-width:592px}}.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0 auto}.name[data-v-5a3e9999]{color:var(--vp-home-hero-name-color)}.clip[data-v-5a3e9999]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0}}.tagline[data-v-5a3e9999]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-5a3e9999]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-5a3e9999]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0}}.actions[data-v-5a3e9999]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:center}@media (min-width: 640px){.actions[data-v-5a3e9999]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:flex-start}}.action[data-v-5a3e9999]{flex-shrink:0;padding:6px}.image[data-v-5a3e9999]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-5a3e9999]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-5a3e9999]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-5a3e9999]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-5a3e9999]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-5a3e9999]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-5a3e9999]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-5a3e9999]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-5a3e9999]{width:320px;height:320px}}[data-v-5a3e9999] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-5a3e9999] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-5a3e9999] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-aeb6d69c]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-aeb6d69c]:hover{border-color:var(--vp-c-brand);background-color:var(--vp-c-bg-soft-up)}.box[data-v-aeb6d69c]{display:flex;flex-direction:column;padding:24px;height:100%}.VPFeature[data-v-aeb6d69c] .VPImage{margin-bottom:20px}.icon[data-v-aeb6d69c]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-bg-soft-down);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-aeb6d69c]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-aeb6d69c]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-aeb6d69c]{padding-top:8px}.link-text-value[data-v-aeb6d69c]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.link-text-icon[data-v-aeb6d69c]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-7e232fde]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-7e232fde]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-7e232fde]{padding:0 64px}}.container[data-v-7e232fde]{margin:0 auto;max-width:1152px}.items[data-v-7e232fde]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-7e232fde]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-7e232fde],.item.grid-4[data-v-7e232fde],.item.grid-6[data-v-7e232fde]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-7e232fde],.item.grid-4[data-v-7e232fde]{width:50%}.item.grid-3[data-v-7e232fde],.item.grid-6[data-v-7e232fde]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-7e232fde]{width:25%}}.VPHome[data-v-20eabd3a]{padding-bottom:96px}.VPHome[data-v-20eabd3a] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-20eabd3a]{padding-bottom:128px}}.VPContent[data-v-3cf691b6]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-3cf691b6]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-3cf691b6]{margin:0}@media (min-width: 960px){.VPContent[data-v-3cf691b6]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-3cf691b6]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-3cf691b6]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e4279f1c]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e4279f1c]{display:none}@media (min-width: 768px){.VPFooter[data-v-e4279f1c]{padding:32px}}.container[data-v-e4279f1c]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e4279f1c],.copyright[data-v-e4279f1c]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-e8ae7d87]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-e8ae7d87]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-e8ae7d87]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-e8ae7d87]{color:var(--vp-c-text-1)}.icon[data-v-e8ae7d87]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-e8ae7d87] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-e8ae7d87]{transform:rotate(90deg)}.items[data-v-e8ae7d87]{position:absolute;top:64px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.header[data-v-e8ae7d87]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-e8ae7d87]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.outline[data-v-e8ae7d87]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-e8ae7d87]{transition:all .2s ease-out}.flyout-leave-active[data-v-e8ae7d87]{transition:all .15s ease-in}.flyout-enter-from[data-v-e8ae7d87],.flyout-leave-to[data-v-e8ae7d87]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-693d654a]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--vp-c-gutter);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-693d654a]{position:fixed}.VPLocalNav.reached-top[data-v-693d654a]{border-top-color:transparent}@media (min-width: 960px){.VPLocalNav[data-v-693d654a]{display:none}}.menu[data-v-693d654a]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-693d654a]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-693d654a]{padding:0 32px}}.menu-icon[data-v-693d654a]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-693d654a]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-693d654a]{padding:12px 32px 11px}}.VPSwitch[data-v-92d8f6fb]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s}.VPSwitch[data-v-92d8f6fb]:hover{border-color:var(--vp-input-hover-border-color)}.check[data-v-92d8f6fb]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s}.icon[data-v-92d8f6fb]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-92d8f6fb] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-92d8f6fb] svg{fill:var(--vp-c-text-1);transition:opacity .25s}.sun[data-v-a99ed743]{opacity:1}.moon[data-v-a99ed743],.dark .sun[data-v-a99ed743]{opacity:0}.dark .moon[data-v-a99ed743]{opacity:1}.dark .VPSwitchAppearance[data-v-a99ed743] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-5e9f0637]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-5e9f0637]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-2a4d50e5]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-2a4d50e5]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-2a4d50e5]:hover{color:var(--vp-c-brand);background-color:var(--vp-c-bg-elv-mute)}.link.active[data-v-2a4d50e5]{color:var(--vp-c-brand)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-e42ed9b3]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-e42ed9b3] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-e42ed9b3] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-e42ed9b3] .group:last-child{padding-bottom:0}.VPMenu[data-v-e42ed9b3] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-e42ed9b3] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-e42ed9b3] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-e42ed9b3] .action{padding-left:24px}.VPFlyout[data-v-6b19ffdd]{position:relative}.VPFlyout[data-v-6b19ffdd]:hover{color:var(--vp-c-brand);transition:color .25s}.VPFlyout:hover .text[data-v-6b19ffdd]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-6b19ffdd]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-6b19ffdd]{color:var(--vp-c-brand)}.VPFlyout.active:hover .text[data-v-6b19ffdd]{color:var(--vp-c-brand-dark)}.VPFlyout:hover .menu[data-v-6b19ffdd],.button[aria-expanded=true]+.menu[data-v-6b19ffdd]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-6b19ffdd]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-6b19ffdd]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-6b19ffdd]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-6b19ffdd]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-6b19ffdd]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-6b19ffdd]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-6b19ffdd]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-16cf740a]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-16cf740a]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-16cf740a]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-c8c2ae4b]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-c8c2ae4b]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-c8c2ae4b]{display:none}}.trans-title[data-v-c8c2ae4b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-c8c2ae4b],.item.social-links[data-v-c8c2ae4b]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-c8c2ae4b]{min-width:176px}.appearance-action[data-v-c8c2ae4b]{margin-right:-2px}.social-links-list[data-v-c8c2ae4b]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-e5ab8091]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-e5ab8091],.VPNavBarMenuLink[data-v-e5ab8091]:hover{color:var(--vp-c-brand)}.VPNavBarMenu[data-v-f732b5d0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-f732b5d0]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.DocSearch{--docsearch-primary-color: var(--vp-c-brand);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark .DocSearch{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-bg-soft-mute);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:1px;letter-spacing:-12px;color:transparent}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:var(--vp-meta-key);font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-bg-soft-mute)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-2973dbb4]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-2973dbb4]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-2973dbb4]{border-bottom-color:var(--vp-c-divider)}}[data-v-2973dbb4] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-ff4524ae]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-ff4524ae]{display:flex;align-items:center}}.title[data-v-ff4524ae]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-c8ceaf10]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap}@media (min-width: 768px){.VPNavBar[data-v-c8ceaf10]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-c8ceaf10]{padding:0}.VPNavBar[data-v-c8ceaf10]:not(.has-sidebar):not(.top){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-c8ceaf10]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-c8ceaf10],.container>.content[data-v-c8ceaf10]{pointer-events:none}.container[data-v-c8ceaf10] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-c8ceaf10]{max-width:100%}}.title[data-v-c8ceaf10]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-c8ceaf10]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-c8ceaf10]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-c8ceaf10]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-c8ceaf10]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-c8ceaf10]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-c8ceaf10]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-c8ceaf10]{position:relative;background-color:var(--vp-nav-bg-color)}}@media (max-width: 767px){.content-body[data-v-c8ceaf10]{column-gap:.5rem}}.menu+.translations[data-v-c8ceaf10]:before,.menu+.appearance[data-v-c8ceaf10]:before,.menu+.social-links[data-v-c8ceaf10]:before,.translations+.appearance[data-v-c8ceaf10]:before,.appearance+.social-links[data-v-c8ceaf10]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-c8ceaf10]:before,.translations+.appearance[data-v-c8ceaf10]:before{margin-right:16px}.appearance+.social-links[data-v-c8ceaf10]:before{margin-left:16px}.social-links[data-v-c8ceaf10]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-c8ceaf10]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-c8ceaf10]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-c8ceaf10]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenMenuLink[data-v-08b49756]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-08b49756]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupLink[data-v-97083fb3]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-97083fb3]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-10e00a88]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-10e00a88]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-10e00a88]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-10e00a88]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-10e00a88]{padding-bottom:6px;color:var(--vp-c-brand)}.VPNavScreenMenuGroup.open .button-icon[data-v-10e00a88]{transform:rotate(45deg)}.button[data-v-10e00a88]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-10e00a88]:hover{color:var(--vp-c-brand)}.button-icon[data-v-10e00a88]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-10e00a88]:first-child{padding-top:0}.group+.group[data-v-10e00a88],.group+.item[data-v-10e00a88]{padding-top:4px}.VPNavScreenAppearance[data-v-0dc5cf49]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-0dc5cf49]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenTranslations[data-v-41505286]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-41505286]{height:auto}.title[data-v-41505286]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-41505286]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-41505286]{margin-right:8px}.icon.chevron[data-v-41505286]{margin-left:4px}.list[data-v-41505286]{padding:4px 0 0 24px}.link[data-v-41505286]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-dc785598]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-dc785598],.VPNavScreen.fade-leave-active[data-v-dc785598]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-dc785598],.VPNavScreen.fade-leave-active .container[data-v-dc785598]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-dc785598],.VPNavScreen.fade-leave-to[data-v-dc785598]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-dc785598],.VPNavScreen.fade-leave-to .container[data-v-dc785598]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-dc785598]{display:none}}.container[data-v-dc785598]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-dc785598],.menu+.appearance[data-v-dc785598],.translations+.appearance[data-v-dc785598]{margin-top:24px}.menu+.social-links[data-v-dc785598]{margin-top:16px}.appearance+.social-links[data-v-dc785598]{margin-top:16px}.VPNav[data-v-5bdc5df3]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-5bdc5df3]{position:fixed}}.VPSidebarItem.level-0[data-v-c356ab37]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-c356ab37]{padding-bottom:10px}.item[data-v-c356ab37]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-c356ab37]{cursor:pointer}.indicator[data-v-c356ab37]{position:absolute;top:6px;bottom:6px;left:-17px;width:1px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-c356ab37],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-c356ab37],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-c356ab37],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-c356ab37]{background-color:var(--vp-c-brand)}.link[data-v-c356ab37]{display:flex;align-items:center;flex-grow:1}.text[data-v-c356ab37]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-c356ab37]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-c356ab37],.VPSidebarItem.level-2 .text[data-v-c356ab37],.VPSidebarItem.level-3 .text[data-v-c356ab37],.VPSidebarItem.level-4 .text[data-v-c356ab37],.VPSidebarItem.level-5 .text[data-v-c356ab37]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-c356ab37],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-c356ab37],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-c356ab37],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-c356ab37],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-c356ab37],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-c356ab37]{color:var(--vp-c-brand)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-c356ab37],.VPSidebarItem.level-1.has-active>.item>.text[data-v-c356ab37],.VPSidebarItem.level-2.has-active>.item>.text[data-v-c356ab37],.VPSidebarItem.level-3.has-active>.item>.text[data-v-c356ab37],.VPSidebarItem.level-4.has-active>.item>.text[data-v-c356ab37],.VPSidebarItem.level-5.has-active>.item>.text[data-v-c356ab37],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-c356ab37],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-c356ab37],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-c356ab37],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-c356ab37],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-c356ab37],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-c356ab37]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-c356ab37],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-c356ab37],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-c356ab37],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-c356ab37],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-c356ab37],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-c356ab37]{color:var(--vp-c-brand)}.caret[data-v-c356ab37]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-c356ab37]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-c356ab37]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-c356ab37]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-c356ab37]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-c356ab37],.VPSidebarItem.level-2 .items[data-v-c356ab37],.VPSidebarItem.level-3 .items[data-v-c356ab37],.VPSidebarItem.level-4 .items[data-v-c356ab37],.VPSidebarItem.level-5 .items[data-v-c356ab37]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-c356ab37]{display:none}.VPSidebar[data-v-b04a928c]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-b04a928c]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-b04a928c]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-b04a928c]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-b04a928c]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-b04a928c]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-b04a928c]{outline:0}.group+.group[data-v-b04a928c]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-b04a928c]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-9c8615dd]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-9c8615dd]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-9c8615dd]{top:14px;left:16px}}.Layout[data-v-324e8308]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-978bd032]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-978bd032]{margin:0 auto;max-width:1152px}.love[data-v-978bd032]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-978bd032]{width:28px;height:28px;fill:currentColor}.message[data-v-978bd032]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-978bd032]{padding-top:32px}.action[data-v-978bd032]{padding-top:40px;text-align:center}.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b1cfd8dc-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:96px}}.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-b0e83e62]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-b0e83e62]{padding:32px}.VPTeamMembersItem.small .data[data-v-b0e83e62]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-b0e83e62]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-b0e83e62]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-b0e83e62]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-b0e83e62]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-b0e83e62]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-b0e83e62]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-b0e83e62]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-b0e83e62]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-b0e83e62]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-b0e83e62]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-b0e83e62]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-b0e83e62]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-b0e83e62]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-b0e83e62]{text-align:center}.avatar[data-v-b0e83e62]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-b0e83e62]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-b0e83e62]{margin:0;font-weight:600}.affiliation[data-v-b0e83e62]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-b0e83e62]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-b0e83e62]:hover{color:var(--vp-c-brand)}.desc[data-v-b0e83e62]{margin:0 auto}.desc[data-v-b0e83e62] a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.links[data-v-b0e83e62]{display:flex;justify-content:center;height:56px}.sp-link[data-v-b0e83e62]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-b0e83e62]:hover,.sp .sp-link.link[data-v-b0e83e62]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-b0e83e62]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-6927e48e]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-6927e48e]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-6927e48e]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-6927e48e]{max-width:876px}.VPTeamMembers.medium .container[data-v-6927e48e]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-6927e48e]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-6927e48e]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-6927e48e]{max-width:760px}.container[data-v-6927e48e]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.package-title{color:#000;font-size:18px;text-align:center;font-weight:700}.package-container{font-size:16px;border:1px dashed;padding:10px;text-align:center}.package-cell{height:40px;width:140px;display:inline-block;vertical-align:middle;line-height:40px;background:#ecefff;border:1px solid;margin-right:10px;margin-bottom:10px;border-radius:6px;font-weight:700}.VPLocalSearchBox[data-v-58c4b8ff]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-58c4b8ff]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-58c4b8ff]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-58c4b8ff]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-58c4b8ff]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-58c4b8ff]{padding:0 8px}}.search-bar[data-v-58c4b8ff]:focus-within{border-color:var(--vp-c-brand)}.search-icon[data-v-58c4b8ff]{margin:8px}@media (max-width: 767px){.search-icon[data-v-58c4b8ff]{display:none}}.search-input[data-v-58c4b8ff]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-58c4b8ff]{padding:6px 4px}}.search-actions[data-v-58c4b8ff]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-58c4b8ff]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-58c4b8ff]{display:none}}.search-actions button[data-v-58c4b8ff]{padding:8px}.search-actions button[data-v-58c4b8ff]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-58c4b8ff]{color:var(--vp-c-brand)}.search-actions button.clear-button[data-v-58c4b8ff]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-58c4b8ff]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-58c4b8ff]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-58c4b8ff]{display:none}}.search-keyboard-shortcuts kbd[data-v-58c4b8ff]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-58c4b8ff]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-58c4b8ff]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-58c4b8ff]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-58c4b8ff]{margin:8px}}.titles[data-v-58c4b8ff]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-58c4b8ff]{display:flex;align-items:center;gap:4px}.title.main[data-v-58c4b8ff]{font-weight:500}.title-icon[data-v-58c4b8ff]{opacity:.5;font-weight:500;color:var(--vp-c-brand)}.title svg[data-v-58c4b8ff]{opacity:.5}.result.selected[data-v-58c4b8ff]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-58c4b8ff]{position:relative}.excerpt[data-v-58c4b8ff]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-58c4b8ff]{opacity:1}.excerpt[data-v-58c4b8ff] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-58c4b8ff] mark,.excerpt[data-v-58c4b8ff] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-58c4b8ff] .vp-code-group .tabs{display:none}.excerpt[data-v-58c4b8ff] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-58c4b8ff]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-58c4b8ff]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-58c4b8ff],.result.selected .title-icon[data-v-58c4b8ff]{color:var(--vp-c-brand)!important}.no-results[data-v-58c4b8ff]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-58c4b8ff]{flex:none} diff --git a/docs/.vitepress/dist/en/api/overview.html b/docs/.vitepress/dist/en/api/overview.html new file mode 100644 index 0000000..7e42a64 --- /dev/null +++ b/docs/.vitepress/dist/en/api/overview.html @@ -0,0 +1,28 @@ + + + + + + API Overview | Lancet + + + + + + + + + + + + + + + + + +