From 2bcfc340d749a3e50cc7af680c78bea70fb1a527 Mon Sep 17 00:00:00 2001 From: FishGoddess <1149062639@qq.com> Date: Wed, 7 Aug 2024 23:25:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BF=AB=E9=80=9F=E6=97=B6?= =?UTF-8?q?=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FUTURE.md | 4 +- HISTORY.md | 7 +++ _examples/basic.go | 2 +- _examples/config.go | 2 +- _examples/context.go | 2 +- _examples/default.go | 2 +- _examples/file.go | 2 +- _examples/handler.go | 2 +- _examples/logger.go | 2 +- _examples/option.go | 2 +- _examples/writer.go | 2 +- _icons/coverage.svg | 4 +- _icons/logit.png | Bin 43892 -> 0 bytes config.go | 2 +- config_test.go | 2 +- context.go | 2 +- context_test.go | 2 +- default.go | 2 +- default_test.go | 2 +- defaults/defaults.go | 2 +- doc.go | 2 +- extension/config/config.go | 2 +- extension/config/config_test.go | 2 +- extension/config/parse.go | 2 +- extension/config/parse_test.go | 2 +- extension/fastclock/fast_clock.go | 77 +++++++++++++++++++++++++ extension/fastclock/fast_clock_test.go | 59 +++++++++++++++++++ handler/buffer.go | 2 +- handler/buffer_test.go | 2 +- handler/escape.go | 2 +- handler/escape_test.go | 2 +- handler/handler.go | 2 +- handler/handler_test.go | 2 +- handler/tape.go | 2 +- handler/tape_test.go | 2 +- logger.go | 2 +- logger_test.go | 2 +- option.go | 2 +- option_test.go | 2 +- rotate/backup.go | 2 +- rotate/backup_test.go | 2 +- rotate/config.go | 2 +- rotate/config_test.go | 2 +- rotate/file.go | 2 +- rotate/file_test.go | 2 +- rotate/option.go | 2 +- rotate/option_test.go | 2 +- writer/batch.go | 2 +- writer/batch_test.go | 2 +- writer/buffer.go | 2 +- writer/buffer_test.go | 2 +- writer/writer.go | 2 +- writer/writer_test.go | 2 +- 53 files changed, 194 insertions(+), 51 deletions(-) delete mode 100644 _icons/logit.png create mode 100644 extension/fastclock/fast_clock.go create mode 100644 extension/fastclock/fast_clock_test.go diff --git a/FUTURE.md b/FUTURE.md index 92b91ed..9a8d5ca 100644 --- a/FUTURE.md +++ b/FUTURE.md @@ -2,8 +2,8 @@ ### v1.8.x -* [ ] 融合 Go 官方设计的正式版本 -* [ ] 进一步提高单元测试覆盖率到 80% +* [x] 提高单元测试覆盖率到 80% +* [x] 增加快速时钟,可以非常快速地查询时间 * [ ] 提高单元测试覆盖率到 90% ### v1.5.x diff --git a/HISTORY.md b/HISTORY.md index 742e586..78cd983 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ ## ✒ 历史版本的特性介绍 (Features in old versions) +### v1.8.0 + +> 此版本发布于 2024-08-07 + +* 提高单元测试覆盖率到 80% +* 增加快速时钟,可以非常快速地查询时间 + ### v1.5.10 > 此版本发布于 2024-01-19 diff --git a/_examples/basic.go b/_examples/basic.go index 6d3b882..3279126 100644 --- a/_examples/basic.go +++ b/_examples/basic.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/config.go b/_examples/config.go index d295db3..1b6d4ae 100644 --- a/_examples/config.go +++ b/_examples/config.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/context.go b/_examples/context.go index a4d45f0..5c2662f 100644 --- a/_examples/context.go +++ b/_examples/context.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/default.go b/_examples/default.go index aea93f9..b212885 100644 --- a/_examples/default.go +++ b/_examples/default.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/file.go b/_examples/file.go index 9589a8f..b507aef 100644 --- a/_examples/file.go +++ b/_examples/file.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/handler.go b/_examples/handler.go index ab7b775..4f34571 100644 --- a/_examples/handler.go +++ b/_examples/handler.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/logger.go b/_examples/logger.go index a7b8473..72517c9 100644 --- a/_examples/logger.go +++ b/_examples/logger.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/option.go b/_examples/option.go index 67b55de..ba4217a 100644 --- a/_examples/option.go +++ b/_examples/option.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_examples/writer.go b/_examples/writer.go index fa858ee..97839f2 100644 --- a/_examples/writer.go +++ b/_examples/writer.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/_icons/coverage.svg b/_icons/coverage.svg index 771e291..98346b3 100644 --- a/_icons/coverage.svg +++ b/_icons/coverage.svg @@ -10,7 +10,7 @@ coverage coverage - 78% - 78% + 82% + 82% \ No newline at end of file diff --git a/_icons/logit.png b/_icons/logit.png deleted file mode 100644 index da728d464039b11bee2ca8d43e3e2a18473c6adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43892 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 diff --git a/config.go b/config.go index c1bb27a..8cbe4d5 100644 --- a/config.go +++ b/config.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/config_test.go b/config_test.go index af5cb97..2f91e10 100644 --- a/config_test.go +++ b/config_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/context.go b/context.go index f831887..caa3372 100644 --- a/context.go +++ b/context.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/context_test.go b/context_test.go index ab8e834..76075fd 100644 --- a/context_test.go +++ b/context_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/default.go b/default.go index 373c7f1..8bcfd1e 100644 --- a/default.go +++ b/default.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/default_test.go b/default_test.go index 86b3dac..e07b04d 100644 --- a/default_test.go +++ b/default_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/defaults/defaults.go b/defaults/defaults.go index 04262c0..6c563e7 100644 --- a/defaults/defaults.go +++ b/defaults/defaults.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/doc.go b/doc.go index ecb06e4..ac5feb0 100644 --- a/doc.go +++ b/doc.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/extension/config/config.go b/extension/config/config.go index b8478e5..e85546f 100644 --- a/extension/config/config.go +++ b/extension/config/config.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/extension/config/config_test.go b/extension/config/config_test.go index cb8cdc7..5fea9b9 100644 --- a/extension/config/config_test.go +++ b/extension/config/config_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/extension/config/parse.go b/extension/config/parse.go index 20a24ef..883fda1 100644 --- a/extension/config/parse.go +++ b/extension/config/parse.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/extension/config/parse_test.go b/extension/config/parse_test.go index 85c883b..9a31f5b 100644 --- a/extension/config/parse_test.go +++ b/extension/config/parse_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/extension/fastclock/fast_clock.go b/extension/fastclock/fast_clock.go new file mode 100644 index 0000000..fb1f3ef --- /dev/null +++ b/extension/fastclock/fast_clock.go @@ -0,0 +1,77 @@ +// Copyright 2024 FishGoddess. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fastclock + +import ( + "sync" + "sync/atomic" + "time" +) + +// fastClock is a clock for getting current time faster. +// It caches current time in nanos and updates it in fixed duration, so it's not a precise way to get current time. +// In fact, we don't recommend you to use it unless you do need a fast way to get current time even the time is "incorrect". +// According to our benchmarks, it does run faster than time.Now: +// +// In my linux server with 2 cores: +// BenchmarkTimeNow-2 19150246 62.26 ns/op 0 B/op 0 allocs/op +// BenchmarkFastClockNow-2 357209233 3.46 ns/op 0 B/op 0 allocs/op +// +// However, the performance of time.Now is faster enough for 99.9% situations, so we hope you never use it :) +type fastClock struct { + nowNanos int64 +} + +func newClock() *fastClock { + clock := &fastClock{ + nowNanos: time.Now().UnixNano(), + } + + go clock.start() + return clock +} + +func (fc *fastClock) start() { + const duration = 100 * time.Millisecond + + for { + for i := 0; i < 9; i++ { + time.Sleep(duration) + atomic.AddInt64(&fc.nowNanos, int64(duration)) + } + + time.Sleep(duration) + atomic.StoreInt64(&fc.nowNanos, time.Now().UnixNano()) + } +} + +func (fc *fastClock) now() time.Time { + nanos := atomic.LoadInt64(&fc.nowNanos) + return time.Unix(0, nanos) +} + +var ( + clock *fastClock + clockOnce sync.Once +) + +// Now returns the current time from fast clock. +func Now() time.Time { + clockOnce.Do(func() { + clock = newClock() + }) + + return clock.now() +} diff --git a/extension/fastclock/fast_clock_test.go b/extension/fastclock/fast_clock_test.go new file mode 100644 index 0000000..7df9f1b --- /dev/null +++ b/extension/fastclock/fast_clock_test.go @@ -0,0 +1,59 @@ +// Copyright 2024 FishGoddess. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fastclock + +import ( + "math" + "math/rand" + "testing" + "time" +) + +// go test -v -run=^$ -bench=^BenchmarkTimeNow$ -benchtime=1s +func BenchmarkTimeNow(b *testing.B) { + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + time.Now() + } +} + +// go test -v -run=^$ -bench=^BenchmarkFastClockNow$ -benchtime=1s +func BenchmarkFastClockNow(b *testing.B) { + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + Now() + } +} + +// go test -v -cover -count=1 -test.cpu=1 -run=^TestNow$ +func TestNow(t *testing.T) { + duration := 100 * time.Millisecond + + for i := 0; i < 100; i++ { + got := Now() + gap := time.Since(got) + t.Logf("got: %v, gap: %v", got, gap) + + if math.Abs(float64(gap.Nanoseconds())) > float64(duration)*1.1 { + t.Errorf("now %v is wrong", got) + } + + time.Sleep(time.Duration(rand.Int63n(int64(duration)))) + } +} diff --git a/handler/buffer.go b/handler/buffer.go index 1b8e0cd..a00c1b4 100644 --- a/handler/buffer.go +++ b/handler/buffer.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/handler/buffer_test.go b/handler/buffer_test.go index 0317118..24b65ff 100644 --- a/handler/buffer_test.go +++ b/handler/buffer_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/handler/escape.go b/handler/escape.go index abdc0e4..c6445ad 100644 --- a/handler/escape.go +++ b/handler/escape.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/handler/escape_test.go b/handler/escape_test.go index 181f760..606e051 100644 --- a/handler/escape_test.go +++ b/handler/escape_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/handler/handler.go b/handler/handler.go index 326bfa7..0b37a06 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/handler/handler_test.go b/handler/handler_test.go index 3f64a91..1bc045b 100644 --- a/handler/handler_test.go +++ b/handler/handler_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/handler/tape.go b/handler/tape.go index 2a65adb..4ef8a3a 100644 --- a/handler/tape.go +++ b/handler/tape.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apashe License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/handler/tape_test.go b/handler/tape_test.go index 10cb82d..16f0997 100644 --- a/handler/tape_test.go +++ b/handler/tape_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/logger.go b/logger.go index c85175a..26805ac 100644 --- a/logger.go +++ b/logger.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/logger_test.go b/logger_test.go index 31117f1..56a6f15 100644 --- a/logger_test.go +++ b/logger_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/option.go b/option.go index 413dc58..1cca28f 100644 --- a/option.go +++ b/option.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/option_test.go b/option_test.go index 0232e64..717c83d 100644 --- a/option_test.go +++ b/option_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/backup.go b/rotate/backup.go index baf417f..38325ce 100644 --- a/rotate/backup.go +++ b/rotate/backup.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/backup_test.go b/rotate/backup_test.go index be59678..348a26e 100644 --- a/rotate/backup_test.go +++ b/rotate/backup_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/config.go b/rotate/config.go index d0d6539..d62dd66 100644 --- a/rotate/config.go +++ b/rotate/config.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/config_test.go b/rotate/config_test.go index 075d8cd..d7f8937 100644 --- a/rotate/config_test.go +++ b/rotate/config_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/file.go b/rotate/file.go index c1609de..17a3ea5 100644 --- a/rotate/file.go +++ b/rotate/file.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/file_test.go b/rotate/file_test.go index d408207..c227181 100644 --- a/rotate/file_test.go +++ b/rotate/file_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/option.go b/rotate/option.go index b98bde1..3b07a1a 100644 --- a/rotate/option.go +++ b/rotate/option.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/rotate/option_test.go b/rotate/option_test.go index 49991ae..55ac32d 100644 --- a/rotate/option_test.go +++ b/rotate/option_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/writer/batch.go b/writer/batch.go index 045e27a..05e21a0 100644 --- a/writer/batch.go +++ b/writer/batch.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/writer/batch_test.go b/writer/batch_test.go index 74847fa..76bf600 100644 --- a/writer/batch_test.go +++ b/writer/batch_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/writer/buffer.go b/writer/buffer.go index e136698..0878cf8 100644 --- a/writer/buffer.go +++ b/writer/buffer.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/writer/buffer_test.go b/writer/buffer_test.go index 5a51e42..8b7510b 100644 --- a/writer/buffer_test.go +++ b/writer/buffer_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/writer/writer.go b/writer/writer.go index 29201ab..942b1a5 100644 --- a/writer/writer.go +++ b/writer/writer.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/writer/writer_test.go b/writer/writer_test.go index 18ed04c..013ab82 100644 --- a/writer/writer_test.go +++ b/writer/writer_test.go @@ -1,4 +1,4 @@ -// Copyright 2023 FishGoddess. All Rights Reserved. +// Copyright 2024 FishGoddess. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License.