94 lines
2.4 KiB
Markdown
94 lines
2.4 KiB
Markdown
|
# GeoIP2 Reader for Go #
|
||
|
|
||
|
[![PkgGoDev](https://pkg.go.dev/badge/github.com/oschwald/geoip2-golang)](https://pkg.go.dev/github.com/oschwald/geoip2-golang)
|
||
|
|
||
|
This library reads MaxMind [GeoLite2](http://dev.maxmind.com/geoip/geoip2/geolite2/)
|
||
|
and [GeoIP2](http://www.maxmind.com/en/geolocation_landing) databases.
|
||
|
|
||
|
This library is built using
|
||
|
[the Go maxminddb reader](https://github.com/oschwald/maxminddb-golang).
|
||
|
All data for the database record is decoded using this library. If you only
|
||
|
need several fields, you may get superior performance by using maxminddb's
|
||
|
`Lookup` directly with a result struct that only contains the required fields.
|
||
|
(See [example_test.go](https://github.com/oschwald/maxminddb-golang/blob/main/example_test.go)
|
||
|
in the maxminddb repository for an example of this.)
|
||
|
|
||
|
## Installation ##
|
||
|
|
||
|
```
|
||
|
go get github.com/oschwald/geoip2-golang
|
||
|
```
|
||
|
|
||
|
## Usage ##
|
||
|
|
||
|
[See GoDoc](http://godoc.org/github.com/oschwald/geoip2-golang) for
|
||
|
documentation and examples.
|
||
|
|
||
|
## Example ##
|
||
|
|
||
|
```go
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"net"
|
||
|
|
||
|
"github.com/oschwald/geoip2-golang"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
db, err := geoip2.Open("GeoIP2-City.mmdb")
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
defer db.Close()
|
||
|
// If you are using strings that may be invalid, check that ip is not nil
|
||
|
ip := net.ParseIP("81.2.69.142")
|
||
|
record, err := db.City(ip)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["pt-BR"])
|
||
|
if len(record.Subdivisions) > 0 {
|
||
|
fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["en"])
|
||
|
}
|
||
|
fmt.Printf("Russian country name: %v\n", record.Country.Names["ru"])
|
||
|
fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)
|
||
|
fmt.Printf("Time zone: %v\n", record.Location.TimeZone)
|
||
|
fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
|
||
|
// Output:
|
||
|
// Portuguese (BR) city name: Londres
|
||
|
// English subdivision name: England
|
||
|
// Russian country name: Великобритания
|
||
|
// ISO country code: GB
|
||
|
// Time zone: Europe/London
|
||
|
// Coordinates: 51.5142, -0.0931
|
||
|
}
|
||
|
|
||
|
```
|
||
|
|
||
|
## Testing ##
|
||
|
|
||
|
Make sure you checked out test data submodule:
|
||
|
|
||
|
```
|
||
|
git submodule init
|
||
|
git submodule update
|
||
|
```
|
||
|
|
||
|
Execute test suite:
|
||
|
|
||
|
```
|
||
|
go test
|
||
|
```
|
||
|
|
||
|
## Contributing ##
|
||
|
|
||
|
Contributions welcome! Please fork the repository and open a pull request
|
||
|
with your changes.
|
||
|
|
||
|
## License ##
|
||
|
|
||
|
This is free software, licensed under the ISC license.
|