From 3457bcbfcda6c36120f0879949ab3b2411db4576 Mon Sep 17 00:00:00 2001 From: erio Date: Tue, 31 Mar 2026 18:37:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(channel):=20=E4=BF=AE=E5=A4=8D=20invalidate?= =?UTF-8?q?Cache=20=E5=AD=98=E5=85=A5=20typed=20nil=20=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=20loadCache=20panic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit invalidateCache 存入 (*channelCache)(nil),类型断言 ok=true 但 指针为 nil,后续 cached.loadedAt 导致 nil pointer dereference。 在 loadCache 双重检查处增加 cached != nil 防御。 --- backend/internal/service/channel_service.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/internal/service/channel_service.go b/backend/internal/service/channel_service.go index 6dbc2624..e8758ac8 100644 --- a/backend/internal/service/channel_service.go +++ b/backend/internal/service/channel_service.go @@ -137,7 +137,7 @@ func NewChannelService(repo ChannelRepository, authCacheInvalidator APIKeyAuthCa // loadCache 加载或返回缓存的渠道数据 func (s *ChannelService) loadCache(ctx context.Context) (*channelCache, error) { - if cached, ok := s.cache.Load().(*channelCache); ok { + if cached, ok := s.cache.Load().(*channelCache); ok && cached != nil { if time.Since(cached.loadedAt) < channelCacheTTL { return cached, nil } @@ -145,7 +145,7 @@ func (s *ChannelService) loadCache(ctx context.Context) (*channelCache, error) { result, err, _ := s.cacheSF.Do("channel_cache", func() (any, error) { // 双重检查 - if cached, ok := s.cache.Load().(*channelCache); ok { + if cached, ok := s.cache.Load().(*channelCache); ok && cached != nil { if time.Since(cached.loadedAt) < channelCacheTTL { return cached, nil }