Awesome Open Source
Awesome Open Source

GeoIP2 Reader for Go


This library reads MaxMind GeoLite2 and GeoIP2 databases.

This library is built using the Go maxminddb reader. 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 in the maxminddb repository for an example of this.)


go get


See GoDoc for documentation and examples.


package main

import (

func main() {
	db, err := geoip2.Open("GeoIP2-City.mmdb")
	if err != nil {
	defer db.Close()
	// If you are using strings that may be invalid, check that ip is not nil
	ip := net.ParseIP("")
	record, err := db.City(ip)
	if err != nil {
	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


Make sure you checked out test data submodule:

git submodule init
git submodule update

Execute test suite:

go test


Contributions welcome! Please fork the repository and open a pull request with your changes.


This is free software, licensed under the ISC license.

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
Go (196,386
Database (9,553
Geolocation (1,020
Geoip (229
Related Projects