Dictionary 如何将LinkedList节点链接到映射值

Dictionary 如何将LinkedList节点链接到映射值,dictionary,pointers,go,linked-list,Dictionary,Pointers,Go,Linked List,我想实现一个图形数据结构,其中每个节点由以下内容表示: type Node struct { root string links []*Node } 基本上,每个节点都有一个值root和一个链接列表,对于每个链接,a只想存储指向它的指针,因为结构的内存将由映射分配和拥有: rooturl := "root" graph := Node{rooturl, []*Node{}} graphMap := make(map[string]Node) graphMap[rooturl]

我想实现一个图形数据结构,其中每个节点由以下内容表示:

type Node struct {
    root  string
    links []*Node
}
基本上,每个节点都有一个值
root
和一个链接列表,对于每个链接,a只想存储指向它的指针,因为结构的内存将由映射分配和拥有:

rooturl := "root"
graph := Node{rooturl, []*Node{}}
graphMap := make(map[string]Node)
graphMap[rooturl] = graph
当我尝试将指针附加到新创建的节点时,会出现问题:

u := "new node"
// if the link is not stored in the graph not create a new node
if _, exists := graphMap[u]; !exists {
    graphMap[u] = Node{u, []*Node{}}
}
// add the links to the graph
graphMap[rooturl].links = append(graphMap[rooturl].links, &graphMap[u])
我有两个错误:

无法分配给结构字段graphMap[rooturl]。映射中的链接

无法获取graphMap[u]的地址

我应该如何正确地解决这个问题?
我还希望在添加时需要使用
graphMap[rooturl].links
查询两次地图(但由于我无法获取指针或对其的引用,我不知道如何进行)

您试图实现的事情不可能以您的方式实现。这是关于可寻址性和可分配性。您应该搜索此键盘的语言规范。映射值不可寻址,因此该值中的struct字段不可赋值。另外,您的数据结构设计看起来不是很有效,至少对我来说是这样

在我看来,没有理由在映射中存储值,引用就足够了

type Node struct {
    root  string
    links []*Node
}
//////
rooturl := "root"
graph := Node{rooturl, []*Node{}}
graphMap := make(map[string]*Node)
graphMap[rooturl] = &graph
u := "new node"
// if the link is not stored in the graph not create a new node
if _, exists := graphMap[u]; !exists {
    graphMap[u] = &Node{u, []*Node{}}
}
// add the links to the graph
graphMap[rooturl].links = append(graphMap[rooturl].links, graphMap[u])

如果您仍然希望在映射中保留实际值,则根本不需要树结构。它看起来像是多余的开销。存储在地图中的信息对于任何操作都是足够的

type Node string
type Graph map[Node][]Node
////
rooturl := Node("root")
graph := make(Graph)
graph[rooturl] = make([]Node, 0)
u := Node("new node")
// if the link is not stored in the graph not create a new node
if node, exists := graph[u]; !exists {
    graph[u] = make([]Node, 0)
    graph[rooturl] = append(graph[rooturl], u)
}

由于go是一种垃圾收集语言,所以实际上不需要映射“拥有”节点内存的概念。您可能只需要在映射中存储指针


在第二种情况下,内存使用将成为一个问题,您将保留节点的多个副本,它是一个字符串,而不是简单的指针。