使用加载的一组数据转发包

时间:2017-07-08 13:51:12

标签: go singleton

我正在编写一个邮政编码位置查找包,它从csv加载所有英国邮政编码,我想只加载数据一次我想知道什么是用Go实现这个目标的最佳模式。

type Location struct {
    Latitude float64
    Longitude float64
}

var postCodeCache = make(map[string]Location)

这些是我的数据类型,目前我有一个名为LoadData和LookupPostCode()的函数。理想情况下,我想要导入我的包,如果数据尚未加载,它会自动加载数据。

2 个答案:

答案 0 :(得分:0)

你有两个选择:

  1. 最简单的方法是在开始任何其他处理之前将数据加载到main中。如果您将读取数据的可能性非常高,并且没有其他理由可以避免立即执行此操作,为什么不呢?

  2. 使用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定义,并在编译时将其“加载”。