Golang结构中的属性未修改

Golang结构中的属性未修改,第1张

Golang结构中的属性未修改

这不是类型系统问题,而是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()    }


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5476301.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存