以下是一个安全使用 ip2region 的 searcher 对象进行并发查询的示例:
package main
import (
"fmt"
"github.com/lionsoul2014/ip2region/binding/golang/ip2region"
"sync"
)
func main() {
// 创建 ip2region 对象并加载整个 xdb 文件
db, err := ip2region.New("path/to/ip2region.db")
if err != nil {
panic(err)
}
defer db.Close()
// 用整个 xdb 缓存创建 searcher 对象
searcher, err := ip2region.NewSearcher(db.Memory())
if err != nil {
panic(err)
}
defer searcher.Close()
// 并发执行查询任务
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
result, err := searcher.BtreeSearch("8.8.8.8")
if err != nil {
panic(err)
}
fmt.Println(result)
}()
}
wg.Wait()
}
在此示例中,我们首先创建了一个 ip2region 对象,并加载整个 xdb 文件。然后,我们使用 ip2region.NewSearcher() 函数基于整个 xdb 缓存创建一个 searcher 对象。接下来,在主函数中,我们创建了 10 个 goroutine 来并发查询 IP 地址 “8.8.8.8” 的归属信息。这些 goroutine 共享同一个 searcher 对象,但是它们都是独立的线程,可以并发地访问 searcher 对象,而不会引起竞争条件。在查询结束后,我们使用 sync.WaitGroup 等待所有 goroutine 完成,并打印查询结果。
需要注意的是,在此示例中,我们使用 defer 关键字来确保 db 和 searcher 对象在程序退出时被正确地关闭。这是一个良好的编程习惯,可以避免内存泄漏和资源浪费。




