Golang中Go-units的安装与配置问题
Golang中Go-units的安装与配置问题 我正在使用 Go-units,并且看到它有能力添加具有新转换比率的新单位,但我不知道如何在我的代码中利用这一点。
我猜想需要将包含新类型和转换比率的文件放在某个位置,但我不清楚应该放在哪里以及如何将其整合到我的运行代码中。
2 回复
在他们的 Github 页面 上,有一个关于自定义单位的章节:
// 注册自定义单位名称
Ding := u.NewUnit("ding", "di")
Dong := u.NewUnit("dong", "do")
// 一个 ding 等于 100 个 dong
u.NewRatioConversion(Ding, Dong, 100.0)
val := u.NewValue(25.0, Ding)
fmt.Printf("%s = %s\n", val, val.MustConvert(Dong)) // "25 dings = 2500 dongs"
// 使用数量级前缀辅助方法时,转换会自动注册
KiloDong := u.Kilo(Dong)
fmt.Println(u.MustConvertFloat(1000.0, Dong, KiloDong)) // "1 kilodong"
你尝试过类似的方法吗?
更多关于Golang中Go-units的安装与配置问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go-units库中添加自定义单位需要直接修改其内部单位数据库。以下是具体实现方法:
1. 安装go-units
go get github.com/bcicen/go-units
2. 添加自定义单位的示例代码
package main
import (
"fmt"
"github.com/bcicen/go-units"
"github.com/bcicen/go-units/database"
)
func main() {
// 添加自定义单位到数据库
addCustomUnits()
// 使用自定义单位
convertWithCustomUnits()
}
func addCustomUnits() {
// 定义新的单位类型和转换比率
customUnits := []database.UnitDef{
{
Name: "my_meter", // 单位名称
Value: 1.0, // 基准值(相对于米)
Aliases: []string{"mym"}, // 别名
System: "metric", // 所属系统
},
{
Name: "my_kilometer",
Value: 1000.0, // 1千米 = 1000米
Aliases: []string{"mykm"},
System: "metric",
},
{
Name: "custom_pound",
Value: 0.45359237, // 自定义磅到千克的转换
Aliases: []string{"cpound", "clb"},
System: "imperial",
},
}
// 将自定义单位添加到数据库
for _, unit := range customUnits {
database.AddUnit(unit)
}
// 添加自定义转换关系
database.AddConversion("my_meter", "my_kilometer", 0.001)
database.AddConversion("my_kilometer", "my_meter", 1000.0)
database.AddConversion("custom_pound", "kilogram", 0.45359237)
}
func convertWithCustomUnits() {
// 创建包含自定义单位的数量
q1, err := units.NewQuantity(1000, "my_meter")
if err != nil {
panic(err)
}
// 转换到自定义千米
converted, err := q1.Convert("my_kilometer")
if err != nil {
panic(err)
}
fmt.Printf("1000 my_meter = %f my_kilometer\n", converted.Value())
// 使用自定义磅单位
q2, _ := units.NewQuantity(10, "custom_pound")
converted2, _ := q2.Convert("kilogram")
fmt.Printf("10 custom_pound = %f kilogram\n", converted2.Value())
// 验证单位是否存在
if units.Exists("my_meter") {
fmt.Println("自定义单位 my_meter 已成功添加")
}
}
3. 创建自定义单位定义文件(可选)
如果需要重用自定义单位,可以创建单独的初始化文件:
// units/custom.go
package customunits
import (
"github.com/bcicen/go-units/database"
)
func InitCustomUnits() {
// 添加长度单位
database.AddUnit(database.UnitDef{
Name: "light_year",
Value: 9.461e15, // 米
Aliases: []string{"ly"},
System: "astronomical",
})
database.AddUnit(database.UnitDef{
Name: "parsec",
Value: 3.086e16, // 米
Aliases: []string{"pc"},
System: "astronomical",
})
// 添加转换关系
database.AddConversion("light_year", "parsec", 0.306601)
database.AddConversion("parsec", "light_year", 3.26156)
}
4. 在主程序中使用
package main
import (
"fmt"
"yourproject/units/customunits"
"github.com/bcicen/go-units"
)
func main() {
// 初始化自定义单位
customunits.InitCustomUnits()
// 使用天文单位
q, _ := units.NewQuantity(1, "light_year")
converted, _ := q.Convert("parsec")
fmt.Printf("1 light_year = %f parsec\n", converted.Value())
// 列出所有可用单位
allUnits := units.List()
fmt.Printf("可用单位数量: %d\n", len(allUnits))
}
重要注意事项
- 添加时机:自定义单位必须在首次使用
units.NewQuantity()之前添加 - 线程安全:单位数据库的修改不是并发安全的,应在程序初始化阶段完成
- 单位冲突:避免使用已存在的单位名称,否则会覆盖原有定义
- 转换链:确保为自定义单位添加双向转换关系,否则某些转换可能失败
这种方法允许你在运行时动态扩展单位系统,而无需修改go-units库的源代码。

