Я знаю, что есть некоторые вопросы и сообщения/статьи по этому вопросу, но из моего новичка, а не точно. Дело в том, что у меня есть основная программа, слушая порт и перенаправляя вызовы к определенному обработчику. Типичная структура:Использование глобальных переменных с обработчиками Http в Golang
func main() {
http.HandleFunc("/something", specificHandler)
http.ListenAndServe(":8080", nil)
}
С обработчика нечто вроде:
func specificHandler(w http.ResponseWriter, r *http.Request) {
somepackage.foo()
}
Тогда somepackage, который содержит функцию Foo, имеет некоторые глобальные переменные, в основном потому, что они необходимы для функции для совместного использования (например, при использовании очереди приоритетов, реализованной с контейнером/кучей, которая получит приоритеты в функции Swap из глобальной матрицы расстояний, которая, конечно, может меняться). И многие другие примеры. Итак, глобальные переменные ...
Проблема заключается в том, что эти переменные разделяются между всеми вызовами обработчика. И это плохо.
Как я могу это решить? Должен быть простой способ сделать это, что я еще не получил, потому что он выглядит как-то так привычно ...
Заранее спасибо.
EDIT
Чтобы сделать его более четким. Например, в моем 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]
}
Возникает вопрос, в том, как сделать Я продолжаю делать это, не имея всех этих карт в качестве глобальных переменных? Если они являются частью структуры, как мне получить доступ к структуре из функций очереди приоритетов?
Тот факт, что вы признаете, у вас есть переменные быть мод ified между разными вызовами указывает, что это дизайн. Похоже, вы хотите какой-то контейнер. Вы захотите создать структуру, соответствующую вашим потребностям, и передать эту структуру в вызовы ваших функций в somepackage. –
Да, это звучит неплохо или создает структуру для всего пакета и пусть она содержит переменные. Но как насчет таких функций, как Less (i, j int) из интерфейса кучи? Им нужно будет получить доступ к структуре, и я не вижу способа передать ее им ... – jcasado94
Посмотрите на каналы [chan] (https://golang.org/ref/spec#Channel_types), они решают * много * проблем, связанных с обменом памятью. – miltonb