这不是类型系统问题,而是Go中如何传递数据的问题。
我认为根本的误解是关于“通过引用”。在Go中,所有内容均按值传递,没有按引用传递(https://golang.org/doc/faq#pass_by_value)
因此,当您将一个
Node结构传递给该
addEdge方法时,它实际上是在复制该结构。
如果要引用相同的基础结构而不是复制它,则应将指针传递给它。
- 尝试以下使用指针传递结构的稍作修改的代码:(您可以在此处调整并运行代码:https
- //play.golang.org/p/Qsbi4LBXS4)
package main import "fmt" type Node struct { neighbors []*Edge visited bool name string } type Edge struct { neighbor *Node } type Graph struct { nodes []*Node } func (g *Graph) addNode(node *Node) { g.nodes = append(g.nodes, node) } func (n *Node) addEdge(neighbor *Node) { edge := &Edge{ neighbor: neighbor, } n.neighbors = append(n.neighbors, edge) } func (g Graph) String() { for _, node := range g.nodes { //fmt.Printf("nodename: %v", node.name) fmt.Printf("number of neighbors: %dn", len(node.neighbors)) if len(node.neighbors) > 0 { fmt.Printf("node: %v, edges: ", node.name) for _, e := range node.neighbors { fmt.Printf("%q", e.neighbor.name) } fmt.Println() } } } func main() { graph := &Graph{} n1 := &Node{name: "abc"} n2 := &Node{name: "def"} graph.addNode(n1) graph.addNode(n2) n1.addEdge(n2) graph.String() }


