Я новый программист на Go, пару дней назад только что закончил учебник "A tour of Go". Я хочу создать граф размером 150 x 120, а затем получить все граничные узлы для каждого узла и реализовать некоторые алгоритмы поиска по графу, такие как BFS и Dijkstra. Я нашел великолепную библиотеку под названием Gonum с пакет графиков, которая выглядит перспективной для использования.
Моя проблема в том, что информации много, и я не знаю, с чего начать. Я надеялся, что будет какой-то учебник, который поможет мне начать в правильном направлении, но мне не повезло найти его.
То, как я настроил это в Python, заключалось в создании нулевых массивов для представления размера графа, а затем в итерации по нему, чтобы получить каждое ребро для каждого узла, но я не уверен, что это лучший способ подумать о том, как графики настроены в Go.

Если вы только начинаете работать с Go, я бы порекомендовал немного остановиться на стандартной библиотеке и не добавлять больше к кривой обучения. Попробуйте реализовать простую структуру данных графа с некоторыми базовыми алгоритмами — это очень просто и позволит вам попрактиковаться в языке. Позже, когда вам понадобится больше производительности/функций, вы можете поискать библиотеки (gonum или другие). Например, простой график можно представить с помощью:
// Node is a node in the graph; it has a (unique) ID and a sequence of
// edges to other nodes.
type Node struct {
Id int64
Edges []int64
}
// Graph contains a set of Nodes, uniquely identified by numeric IDs.
type Graph struct {
Nodes map[int64]Node
}
Наткнулся на этот вопрос в поисках подсказок для подсчета ребер с помощью gonum/graph. Я не нашел тонны ресурсов, кроме как копаться в документации по API.
Думаю, я нашел правильный способ подсчета ребер для отдельных узлов. Возможно!
for _, node := range graph.NodesOf(g.Nodes()) {
toNodes := g.From(node.ID()) // returns graph.Nodes
nodeArray := graph.NodesOf( toNodes ) // returns []graph.Node
edgeCount := len(nodeArray)
// - or -
edgeCount := len(graph.NodesOf( g.From(node.ID()) ))
// do work with edge count
}
Учитывая известный узел и все узлы, к которым вы можете добраться оттуда, вы можете подсчитать (например, len(graph.NodesOf(g.From(node.ID()))) количество ребер!
Чтобы подсчитать все ребра:
totalEdges := len(graph.EdgesOf(g.Edges()))