我正在编写一个邮政编码位置查找包,它从csv加载所有英国邮政编码,我想只加载数据一次我想知道什么是用Go实现这个目标的最佳模式。
type Location struct {
Latitude float64
Longitude float64
}
var postCodeCache = make(map[string]Location)
这些是我的数据类型,目前我有一个名为LoadData和LookupPostCode()的函数。理想情况下,我想要导入我的包,如果数据尚未加载,它会自动加载数据。
答案 0 :(得分:0)
你有两个选择:
最简单的方法是在开始任何其他处理之前将数据加载到main中。如果您将读取数据的可能性非常高,并且没有其他理由可以避免立即执行此操作,为什么不呢?
使用sync.Once加载数据。类似的东西:
var dataLoaded sync.Once
var data DataType = nil
func LookupPostCode(some_args) {
once.Do(func() {
data = LoadData(some_subset_of_some_args)
})
// and here I know, that data are loaded
}
答案 1 :(得分:0)
您可以在包中使用init()函数来执行此操作。
或者,如果它不经常更改,您可以将CSV转换为单独的.go文件中的Go Map定义,并在编译时将其“加载”。