fix(id): 使用sync.Once与sync.RWMutex消除getLocalIP并发数据竞争
Some checks are pending
Security Checks / security (push) Waiting to run

This commit is contained in:
smail 2026-10-18 13:22:19 +08:00
parent 9a6751ef2d
commit 44111ae659
2 changed files with 56 additions and 19 deletions

View File

@ -7,32 +7,38 @@ import (
"fmt"
"net"
"os"
"sync"
"time"
)
var ip_instance string
var (
ipInstance string
ipOnce sync.Once
ipMu sync.RWMutex
)
func getLocalIP() string {
if ip_instance != "" {
return ip_instance
}
ip := "127.0.0.1"
addrs, err := net.InterfaceAddrs()
if err != nil {
ip_instance = ip
return ip
}
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip = ipnet.IP.String()
break
ipOnce.Do(func() {
ip := "127.0.0.1"
addrs, err := net.InterfaceAddrs()
if err == nil {
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip = ipnet.IP.String()
break
}
}
}
}
}
ip_instance = ip
return ip
ipMu.Lock()
ipInstance = ip
ipMu.Unlock()
})
ipMu.RLock()
defer ipMu.RUnlock()
return ipInstance
}
func GenLogID() string {

View File

@ -0,0 +1,31 @@
package id
import (
"sync"
"testing"
)
func TestGetLocalIPConcurrent(t *testing.T) {
const goroutines = 50
const iterations = 100
var wg sync.WaitGroup
wg.Add(goroutines)
for i := 0; i < goroutines; i++ {
go func() {
defer wg.Done()
for j := 0; j < iterations; j++ {
ip := getLocalIP()
if ip == "" {
t.Errorf("getLocalIP returned empty")
}
logID := GenLogID()
if logID == "" {
t.Errorf("GenLogID returned empty")
}
}
}()
}
wg.Wait()
}