package main import ( "embed" "fmt" "io/fs" "log" "os" "path/filepath" ) //go:embed ip2region/* var embeddedFS embed.FS func releaseEmbeddedDir(efs embed.FS, embedPath string, targetDir string) error { return fs.WalkDir(efs, embedPath, func(path string, d fs.DirEntry, err error) error { if err != nil { return err } relPath, _ := filepath.Rel(embedPath, path) targetPath := filepath.Join(targetDir, relPath) if d.IsDir() { return os.MkdirAll(targetPath, 0755) } data, err := efs.ReadFile(path) if err != nil { return fmt.Errorf("读取嵌入文件失败: %w", err) } // 如果文件已存在就跳过(可选) if _, err := os.Stat(targetPath); err == nil { log.Printf(" 文件已存在: %s, 跳过写入\n", targetPath) return nil } err = os.WriteFile(targetPath, data, 0644) if err != nil { return fmt.Errorf("写入文件失败: %w", err) } log.Printf(" 释放: %s → %s\n", path, targetPath) return nil }) } func embed_ip2region() { log.Println(" 正在释放 ip2region 数据...") err := releaseEmbeddedDir(embeddedFS, "ip2region", "ip2region") if err != nil { log.Println(" 释放失败:", err) os.Exit(1) } log.Println(" 释放完成,程序继续执行...") // 你可以在这里使用 ip2region.xdb 文件了,例如: if _, err := os.Stat("ip2region/ip2region.xdb"); err == nil { log.Println(" ✅ 确认 ip2region.xdb 已成功写出") // 这里可以调用 ip2region 逻辑加载它 } else { log.Println(" ❌ 找不到 ip2region.xdb") } }