golang实现ISO-4217和ISO-3166标准类型存储验证的插件库go-type的使用
Golang实现ISO-4217和ISO-3166标准类型存储验证的插件库go-type的使用
这个库的目的是为了方便存储、验证和传输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)
}
主要功能
- 在结构体中使用:可以直接在结构体中使用ISO标准的国家代码、货币代码等类型
- JSON序列化/反序列化:支持从JSON数据中解析和生成这些标准类型
- 验证:集成了ozzo-validation验证框架,可以方便地进行数据验证
- 查找功能:可以通过代码查找国家、货币、语言等详细信息
- 数据库支持:实现了driver.Valuer接口,可以直接存储到数据库
- 常量支持:提供了常用国家和货币的常量
这个库简化了处理国际标准代码的工作,确保数据的正确性和一致性,非常适合需要处理国际化数据的应用程序。
更多关于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
主要功能
- 提供ISO-4217货币代码的类型安全实现
- 提供ISO-3166国家/地区代码的类型安全实现
- 内置验证功能
- 支持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库提供了:
- 类型安全的ISO标准代码实现
- 内置验证功能
- 方便的编解码支持
- 丰富的辅助方法
这使得在处理国际化的货币和国家/地区代码时更加安全和方便,减少了手动验证和错误处理的工作量。
对于需要处理国际化数据的应用,如电商、金融系统等,go-type是一个值得考虑的工具库。