我知道有关于这个问题的一些问题和文章/文章,但是从我的新手视图来看,并不完全。 事情是,我有一个主程序监听一个端口并将调用重定向到一个特定的处理程序。典型结构:在Golang中使用Http处理程序的全局变量
func main() {
http.HandleFunc("/something", specificHandler)
http.ListenAndServe(":8080", nil)
}
随着处理程序是这样的:
func specificHandler(w http.ResponseWriter, r *http.Request) {
somepackage.foo()
}
然后somepackage,其中包含的功能富,有一些全局变量,主要是因为他们需要函数共享(例如,当使用用容器/堆实现的优先级队列时,该优先级队列将从距离的全局矩阵中获得交换函数中的优先级,当然这是可改变的)。还有很多其他的例子。总之,全局变量...
问题是,如你所见,这些变量是在处理程序的所有调用中共享的。这很糟糕。
我该如何解决这个问题?必须有一个简单的方法来做到这一点,我还没有到,因为它看起来像平常一样......
在此先感谢。
编辑
使其更清晰。举例来说,在我的A *包,我有以下全局变量:
var openVerticesAS PriorityQueueAStar
// which vertices are closed
var closedVertices map[int]bool
// which vertices are currently open
var openVertices map[int]bool
// cost from start to node
var gScore map[int]float64
// cost from start to end, passing by node i (g+h)
var fScore map[int]float64
然后,PriorityQueueAStar实现如下:
type PriorityQueueAStar []int // rel id
func (pq PriorityQueueAStar) Len() int { return len(pq) }
func (pq PriorityQueueAStar) Empty() bool { return len(pq) == 0 }
func (pq PriorityQueueAStar) Less(i, j int) bool {
return fScore[pq[i]] < fScore[pq[j]]
}
func (pq PriorityQueueAStar) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
}
func (pq *PriorityQueueAStar) Push(x interface{}) {
*pq = append(*pq, x.(int))
}
func (pq *PriorityQueueAStar) Pop() interface{} {
old := *pq
n := len(old)
rel := old[n-1]
*pq = old[0 : n-1]
return rel
}
func (pq PriorityQueueAStar) Top() interface{} {
return pq[0]
}
那么问题,就是,怎么办我一直这样做,而没有将所有这些地图作为全局变量?如果它们是结构体的一部分,我如何从优先级队列函数访问结构体?