golang实现ISO-4217和ISO-3166标准类型存储验证的插件库go-type的使用

Golang实现ISO-4217和ISO-3166标准类型存储验证的插件库go-type的使用

Go Report Card Build Status codecov

这个库的目的是为了方便存储、验证和传输Go ISO-3166/ISO-4217/时区/电子邮件/URL类型。它有一个开放API3规范,可以包含在你的规范中。所有类型都有自己的ozzo.Validate、json.Unmarshaler、Stringer和driver.Valuer实现。

安装

go get github.com/mikekonan/go-types/v2

使用示例

下面是一个完整的示例,展示如何使用go-types库来处理ISO-4217和ISO-3166标准类型:

package main

import (
	"encoding/json"
	"fmt"
	"log"

	validation "github.com/go-ozzo/ozzo-validation/v4"
	"github.com/mikekonan/go-types/v2/country"
	"github.com/mikekonan/go-types/v2/country/alpha2"
	"github.com/mikekonan/go-types/v2/country/alpha3"
	"github.com/mikekonan/go-types/v2/language"
	"github.com/mikekonan/go-types/v2/country/name"
	"github.com/mikekonan/go-types/v2/currency"
	"github.com/mikekonan/go-types/v2/currency/code"
	"github.com/mikekonan/go-types/v2/phone"
	"github.com/mikekonan/go-types/v2/postal_code"
)

// 1. 在你的结构体中使用
type User struct {
	Name            string                `json:"name" db:"name"`
	Country         country.Alpha2Code    `json:"country" db:"country"`
	Currency        currency.Code         `json:"currency" db:"currency"`
	Language        language.Alpha2Code   `json:"language" db:"language"`
	Phone           phone.Number          `json:"phone" db:"phone"`
	CountryDialCode phone.DialCode        `json:"dialCode" db:"dialCode"`
	PostalCode      postalcode.PostalCode `json:"postalCode" db:"postalCode"`
}

func main() {
	// 2. 在你的数据流中使用
	user := User{}
	_ = json.Unmarshal([]byte(`{"name":"name", "country": "CA", "currency": "CAD", "language": "fr", "phone": "123456789", "dialCode": "1"}`), &user)

	// 3. 检查是否设置
	user.Country.IsSet()
	user.Currency.IsSet()
	user.Language.IsSet()

	// 4. 使用ozzo-validation进行验证
	if err := validation.ValidateStruct(&user, validation.Field(&user.Country), validation.Field(&user.Currency)); err != nil {
            log.Fatal(err)
	}

	// 5. 通过alpha2代码查找国家信息
	if userCountry, ok := country.ByAlpha2Code(user.Country); ok {
            fmt.Printf("country name - '%s', alpha-2 - '%s', alpha-3 - '%s'", userCountry.Name(), userCountry.Alpha2Code(), userCountry.Alpha3Code())
	}

	// 6. 通过alpha2代码查找语言信息
	if userLanguage, ok := language.ByAlpha2Code(user.Language); ok {
            fmt.Printf("language name - '%s', alpha-2 - '%s', alpha-3 - '%s'", userLanguage.Name(), userLanguage.Alpha2Code(), userLanguage.Alpha3Code())
	}

	// 7. 通过国家拨号代码查找国家
	if phoneCountries, ok := phone.CountriesByDialCode(user.CountryDialCode); ok {
            for _, phoneCountry := range phoneCountries {
                fmt.Printf("country by dial code - '%s'", phoneCountry)
            }
	}

	// 8. 通过国家代码查找拨号代码
	if dialCode, ok := phone.DialByAlpha2Code(user.Country); ok {
            fmt.Printf("'%s' dial code is '%s'", user.Country, dialCode)
        }

	// 9. 通过货币代码查找货币信息
	if userCurrency, ok := currency.ByCode(user.Currency); ok {
            fmt.Printf("currency name - '%s', code - '%s', number - '%s', countries - '%s', decimal places - '%d'",
                userCurrency.Currency(), userCurrency.Code(), userCurrency.Number(), userCurrency.Countries(), userCurrency.DecimalPlaces())
	}

	// 10. 存储到数据库
	fmt.Println(user.Country.Value())  // 输出 'CA'
	fmt.Println(user.Currency.Value()) // 输出 'CAN'
	fmt.Println(user.Language.Value()) // 输出 'fr'

	// 11. 使用特定的国家常量
	fmt.Println(country.Canada.Alpha2Code())
	fmt.Println("name:", name.Canada)
	fmt.Println("alpha-2:", alpha2.CA)
	fmt.Println("alpha-3:", alpha3.CAN)

	// 12. 使用特定的货币代码
	fmt.Println(code.CAD)
}

主要功能

  1. 在结构体中使用:可以直接在结构体中使用ISO标准的国家代码、货币代码等类型
  2. JSON序列化/反序列化:支持从JSON数据中解析和生成这些标准类型
  3. 验证:集成了ozzo-validation验证框架,可以方便地进行数据验证
  4. 查找功能:可以通过代码查找国家、货币、语言等详细信息
  5. 数据库支持:实现了driver.Valuer接口,可以直接存储到数据库
  6. 常量支持:提供了常用国家和货币的常量

这个库简化了处理国际标准代码的工作,确保数据的正确性和一致性,非常适合需要处理国际化数据的应用程序。


更多关于golang实现ISO-4217和ISO-3166标准类型存储验证的插件库go-type的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实现ISO-4217和ISO-3166标准类型存储验证的插件库go-type的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-type库:Golang实现ISO-4217和ISO-3166标准类型

go-type是一个用于处理ISO-4217(货币代码)和ISO-3166(国家/地区代码)标准的Golang库,提供类型安全的实现和验证功能。

安装

go get github.com/leodido/go-type

主要功能

  1. 提供ISO-4217货币代码的类型安全实现
  2. 提供ISO-3166国家/地区代码的类型安全实现
  3. 内置验证功能
  4. 支持JSON/XML编解码

使用示例

ISO-4217货币代码

package main

import (
	"fmt"
	"log"
	
	"github.com/leodido/go-type/iso4217"
)

func main() {
	// 创建货币代码
	currency := iso4217.Code("USD")
	
	// 验证货币代码
	if err := currency.Validate(); err != nil {
		log.Fatalf("无效货币代码: %v", err)
	}
	
	// 获取货币信息
	info, exists := currency.Info()
	if exists {
		fmt.Printf("货币: %s\n", info.Name)       // 输出: 货币: US Dollar
		fmt.Printf("数字代码: %d\n", info.Numeric) // 输出: 数字代码: 840
	}
	
	// 从数字代码创建
	currencyFromNum, err := iso4217.FromNumeric(978)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(currencyFromNum) // 输出: EUR
}

ISO-3166国家/地区代码

package main

import (
	"fmt"
	"log"
	
	"github.com/leodido/go-type/iso3166"
)

func main() {
	// 创建国家代码
	country := iso3166.Alpha2("CN")
	
	// 验证国家代码
	if err := country.Validate(); err != nil {
		log.Fatalf("无效国家代码: %v", err)
	}
	
	// 获取国家信息
	info, exists := country.Info()
	if exists {
		fmt.Printf("国家: %s\n", info.Name)      // 输出: 国家: China
		fmt.Printf("数字代码: %d\n", info.Numeric) // 输出: 数字代码: 156
		fmt.Printf("Alpha3: %s\n", info.Alpha3)  // 输出: Alpha3: CHN
	}
	
	// 从数字代码创建
	countryFromNum, err := iso3166.FromNumeric(840)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(countryFromNum) // 输出: US
	
	// 从Alpha3代码创建
	countryFromAlpha3, err := iso3166.FromAlpha3("FRA")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(countryFromAlpha3) // 输出: FR
}

JSON编解码

package main

import (
	"encoding/json"
	"fmt"
	"log"
	
	"github.com/leodido/go-type/iso4217"
	"github.com/leodido/go-type/iso3166"
)

type Payment struct {
	Amount   float64       `json:"amount"`
	Currency iso4217.Code  `json:"currency"`
	Country  iso3166.Alpha2 `json:"country"`
}

func main() {
	// 编码为JSON
	payment := Payment{
		Amount:   100.50,
		Currency: iso4217.Code("EUR"),
		Country:  iso3166.Alpha2("DE"),
	}
	
	jsonData, err := json.Marshal(payment)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(jsonData)) // 输出: {"amount":100.5,"currency":"EUR","country":"DE"}
	
	// 从JSON解码
	var newPayment Payment
	err = json.Unmarshal(jsonData, &newPayment)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("解码结果: %+v\n", newPayment)
}

高级用法

自定义验证

package main

import (
	"fmt"
	"log"
	
	"github.com/leodido/go-type/iso4217"
)

func validateCurrencyForRegion(currency iso4217.Code, country string) error {
	if err := currency.Validate(); err != nil {
		return err
	}
	
	// 添加自定义验证逻辑
	if currency == "USD" && country != "US" {
		return fmt.Errorf("USD只能在US使用")
	}
	
	return nil
}

func main() {
	err := validateCurrencyForRegion(iso4217.Code("USD"), "CN")
	if err != nil {
		log.Println(err) // 输出: USD只能在US使用
	}
}

总结

go-type库提供了:

  1. 类型安全的ISO标准代码实现
  2. 内置验证功能
  3. 方便的编解码支持
  4. 丰富的辅助方法

这使得在处理国际化的货币和国家/地区代码时更加安全和方便,减少了手动验证和错误处理的工作量。

对于需要处理国际化数据的应用,如电商、金融系统等,go-type是一个值得考虑的工具库。

回到顶部