package ipip import ( "fmt" "log" "os" "github.com/ipipdotnet/ipdb-go" ) type IPIPFree struct { *ipdb.City } func NewIPIP(filePath string) (*IPIPFree, error) { _, err := os.Stat(filePath) if err != nil && os.IsNotExist(err) { log.Printf("IPIP数据库不存在,请手动下载解压后保存到本地: %s \n", filePath) log.Println("下载链接: https://www.ipip.net/product/ip.html") return nil, err } else { db, err := ipdb.NewCity(filePath) if err != nil { return nil, err } return &IPIPFree{City: db}, nil } } type Result struct { Country string Region string City string } func (r Result) String() string { if r.City == "" { return fmt.Sprintf("%s %s", r.Country, r.Region) } return fmt.Sprintf("%s %s %s", r.Country, r.Region, r.City) } func (db IPIPFree) Find(query string, params ...string) (result fmt.Stringer, err error) { info, err := db.FindInfo(query, "CN") if err != nil || info == nil { return nil, err } else { // info contains more info result = Result{ Country: info.CountryName, Region: info.RegionName, City: info.CityName, } return } }