Skip to content

Latest commit

 

History

History
280 lines (221 loc) · 10.7 KB

File metadata and controls

280 lines (221 loc) · 10.7 KB

Changes

2.2.0 - 2026-05-17

  • This module now targets Go 1.25+.
  • Updated dependencies to latest version. In particular github.com/oschwald/maxminddb-golang/v2 was updated to v2.3.0, which includes several performance improvements.

2.1.0 - 2025-12-22

  • Added support for the GeoIP Anonymous Plus database. This database provides VPN detection with confidence scoring, provider identification, and temporal tracking via the new AnonymousPlus() method.
  • Deprecated IsLegitimateProxy on EnterpriseTraits. MaxMind has deprecated this field and it will be removed in the next major release.
  • Deprecated StaticIPScore on EnterpriseTraits. This field was added in error and has never been populated. It will be removed in the next major release.

2.0.1 - 2025-11-26

  • Upgraded github.com/oschwald/geoip2-golang/v2 to 2.1.1, which fixes an issue that prevented a unclosed memory-mapped file from being unmapped when the reader was garbage collected.

2.0.0 - 2025-10-19

  • BREAKING CHANGE: Lookup methods now require netip.Addr, return typed Names, and provide HasData() helpers while always populating Network/IPAddress fields so network topology remains accessible.
  • BREAKING CHANGE: Struct field casing now matches MaxMind responses (for example IsoCodeISOCode), location coordinates use pointers, and JSON tags rely on Go 1.24 omitzero support—upgrade your toolchain before adopting v2.
  • Added MIGRATION.md with detailed guidance for upgrading from v1.
  • Updated dependency on github.com/oschwald/maxminddb-golang/v2 to v2.0.0.
  • Added configurable Option helpers so Open and OpenBytes can accept future options without forcing a v3 release.
  • BREAKING CHANGE: Removed deprecated FromBytes method. Use OpenBytes instead.

2.0.0-beta.4 - 2025-08-23

  • Updated maxminddb dependency to v2.0.0-beta.9.
  • Added OpenBytes method to match the API changes in maxminddb v2.0.0-beta.9.
  • Deprecated FromBytes method. Use OpenBytes instead. FromBytes will be removed in a future version.

2.0.0-beta.3 - 2025-07-07

  • Added support for GeoIP-City-Redacted-US and GeoIP-Enterprise-Redacted-US. Requested by Tom Anderson. GitHub #134.
  • Upgrade github.com/oschwald/maxminddb-golang/v2 to v2.0.0-beta.7.

2.0.0-beta.2 - 2025-06-28

  • BREAKING CHANGE: Replaced IsZero() methods with HasData() methods on all result structs (including Names). The new methods provide clearer semantics: HasData() returns true when GeoIP data is found and false when no data is available. Unlike IsZero(), HasData() excludes Network and IPAddress fields from validation, allowing users to access network topology information even when no GeoIP data is found. The Network and IPAddress fields are now always populated for all lookups, regardless of whether GeoIP data is available.
  • BREAKING CHANGE: Replaced all anonymous nested structs with named types to improve struct initialization ergonomics. All result structs (Enterprise, City, Country) now use named types like EnterpriseCityRecord, CityTraits, CountryRecord, etc. This makes it much easier to initialize structs in user code while maintaining the same JSON serialization behavior.
  • BREAKING CHANGE: Changed Location.Latitude and Location.Longitude from float64 to *float64 to properly distinguish between missing coordinates and the valid location (0, 0). Missing coordinates are now represented as nil and are omitted from JSON output, while valid zero coordinates are preserved. This fixes the ambiguity where (0, 0) was incorrectly treated as "no data". Added Location.HasCoordinates() method for safe coordinate access. Reported by Nick Bruun. GitHub #5.

2.0.0-beta.1 - 2025-06-22

  • BREAKING CHANGE: Updated to use maxminddb-golang/v2 which provides significant performance improvements and a more modern API.
  • BREAKING CHANGE: All lookup methods now accept netip.Addr instead of net.IP. This provides better performance and aligns with modern Go networking practices.
  • BREAKING CHANGE: Renamed IsoCode fields to ISOCode in all structs to follow proper capitalization for the ISO acronym. Closes GitHub issue #4.
  • BREAKING CHANGE: Replaced map[string]string Names fields with structured Names type for significant performance improvements. This eliminates map allocation overhead, reducing memory usage by 34% and allocations by 56%.
  • BREAKING CHANGE: Added JSON tags to all struct fields. JSON tags match the corresponding maxminddb tags where they exist. Custom fields (IPAddress and Network) use snake_case (ip_address and network).
  • BREAKING CHANGE: Removed IsAnonymousProxy and IsSatelliteProvider fields from all Traits structs. These fields have been removed from MaxMind databases. Use the dedicated Anonymous IP database for anonymity detection instead.
  • BREAKING CHANGE: Go 1.24 or greater is now required. This enables the use of omitzero in JSON tags to match MaxMind database behavior where empty values are not included.
  • Added IsZero() method to all result structs (City, Country, Enterprise, ASN, etc.) to easily check whether any data was found for the queried IP address. Requested by Salim Alami. GitHub #32.
  • Added Network and IPAddress fields to all result structs. The Network field exposes the network prefix from the MaxMind database lookup, and the IPAddress field contains the IP address used during the lookup. These fields are only populated when data is found for the IP address. For flat record types (ASN, ConnectionType, Domain, ISP, AnonymousIP), the fields are named Network and IPAddress. For complex types (City, Country, Enterprise), the fields are located at .Traits.Network and .Traits.IPAddress. Requested by Aaron Bishop. GitHub #128.
  • Updated module path to github.com/oschwald/geoip2-golang/v2 to follow Go's semantic versioning guidelines for breaking changes.
  • Updated examples and documentation to demonstrate proper error handling with netip.ParseAddr().
  • Updated linting rules to support both v1 and v2 import paths during the transition period.

Migration Guide

To migrate from v1 to v2:

  1. Update your import path:

    // Old
    import "github.com/oschwald/geoip2-golang"
    
    // New
    import "github.com/oschwald/geoip2-golang/v2"
  2. Replace net.IP with netip.Addr:

    // Old
    ip := net.ParseIP("81.2.69.142")
    record, err := db.City(ip)
    
    // New
    ip, err := netip.ParseAddr("81.2.69.142")
    if err != nil {
        // handle error
    }
    record, err := db.City(ip)
  3. Update field names from IsoCode to ISOCode:

    // Old
    countryCode := record.Country.IsoCode
    subdivisionCode := record.Subdivisions[0].IsoCode
    
    // New
    countryCode := record.Country.ISOCode
    subdivisionCode := record.Subdivisions[0].ISOCode
  4. Replace map-based Names access with struct fields:

    // Old
    cityName := record.City.Names["en"]
    countryName := record.Country.Names["pt-BR"]
    continentName := record.Continent.Names["zh-CN"]
    
    // New
    cityName := record.City.Names.English
    countryName := record.Country.Names.BrazilianPortuguese
    continentName := record.Continent.Names.SimplifiedChinese

    Available Names struct fields:

    • English (en)
    • German (de)
    • Spanish (es)
    • French (fr)
    • Japanese (ja)
    • BrazilianPortuguese (pt-BR)
    • Russian (ru)
    • SimplifiedChinese (zh-CN)
  5. Check if data was found using the new IsZero() method:

    record, err := db.City(ip)
    if err != nil {
        // handle error
    }
    if record.IsZero() {
        fmt.Println("No data found for this IP")
    } else {
        fmt.Printf("City: %s\n", record.City.Names.English)
    }

1.11.0 - 2024-06-03

  • Go 1.21 or greater is now required.
  • The new is_anycast output is now supported on the GeoIP2 Country, City, and Enterprise databases. #119.

Note: 1.10.0 was accidentally skipped.

1.9.0 - 2023-06-18

  • Rearrange fields in structs to reduce memory usage. Although this does reduce readability, these structs are often created at very rates, making the trade-off worth it.

1.8.0 - 2022-08-07

  • Set Go version to 1.18 in go.mod.

1.7.0 - 2022-03-26

  • Set the minimum Go version in the go.mod file to 1.17.
  • Updated dependencies.

1.6.1 - 2022-01-28

  • This is a re-release with the changes that were supposed to be in 1.6.0.

1.6.0 - 2022-01-28

  • Add support for new mobile_country_code and mobile_network_code outputs on GeoIP2 ISP and GeoIP2 Enterprise.

1.5.0 - 2021-02-20

  • Add StaticIPScore field to Enterprise. Pull request by Pierre Bonzel. GitHub #54.
  • Add IsResidentialProxy field to AnonymousIP. Pull request by Brendan Boyle. GitHub #72.
  • Support DBIP-ASN-Lite database. Requested by Muhammad Hussein Fattahizadeh. GitHub #69.

1.4.0 - 2019-12-25

  • This module now uses Go modules. Requested by Axel Etcheverry. GitHub #52.
  • DBIP databases are now supported. Requested by jaw0. GitHub #45.
  • Allow using the ASN method with the GeoIP2 ISP database. Pull request by lspgn. GitHub #47.
  • The example in the README.md now checks the length of the subdivision slice before using it. GitHub #51.

1.3.0 - 2019-08-28

  • Added support for the GeoIP2 Enterprise database.

1.2.1 - 2018-02-25

  • HTTPS is now used for the test data submodule rather than the Git protocol

1.2.0 - 2018-02-19

  • The country structs for geoip2.City and geoip2.Country now have an IsInEuropeanUnion boolean field. This is true when the associated country is a member state of the European Union. This requires a database built on or after February 13, 2018.
  • Switch from Go Check to Testify. Closes #27

1.1.0 - 2017-04-23

  • Add support for the GeoLite2 ASN database.
  • Add support for the GeoIP2 City by Continent databases. GitHub #26.

1.0.0 - 2016-11-09

New release for those using tagged releases. Closes #21.