我正在尝试通过实现一个随机图来学习 go。我在 n.value undefined(int 类型没有字段或方法值)和 n.neigbours undefined(int 类型没有字段或方法 neigbours)上收到错误。我无法理解编译错误,因为我在 g.nodes = make([]node, g.nodesnr) 中创建了一个新的 nodenr 大小的空节点切片。问题是什么?package mainimport ( "fmt"//"math/rand")type node struct { value int neigbours []int}type edge struct { source int sink int}type graph struct { nodesnr, edgesnr int nodes []node edges chan edge}func main() { randomGraph()}func input(tname string) (number int) { fmt.Println("input a number of " + tname) fmt.Scan(&number) return}func randomGraph() (g graph) { g = graph{nodesnr: input("nodes"), edgesnr: input("edges")} g.addNodes() for i := 0; i < g.nodesnr; i++ { fmt.Println(g.nodes[i].value) } //g.addEdges() return}func (g *graph) addNodes() { g.nodes = make([]node, g.nodesnr) for n := range g.nodes { n.value = 2 n.neigbours = nil return }}func (g *graph) addEdges() { g.edges = make(chan edge) for i := 0; i < g.edgesnr; i++ { //g.newEdge() return }}/* func (g* graph) newEdge(){e := new(edge)e.source, e.sink = rand.Intn(g.nodesnr), rand.Intn(g.nodesnr)g.edges <-e*//g.addEdge() }*/func (g *graph) edgeCheck(ep *edge) string { if ep.source == ep.sink { return "self" } //if(g.neigbourCheck(g.nodes[ep.source].neigbours, ep.sink) OR g.neigbourCheck(g.nodes[ep.sink].neigbours, ep.source){ // return "present" return "empty"}func (g *graph) neigbourCheck(neigbours []node, node int) bool { for neigbour := range neigbours { if node == neigbour { return true } } return false}
1 回答
收到一只叮咚
TA贡献1821条经验 获得超4个赞
您的错误在于第 47 行
for n := range g.nodes
当迭代一个切片时,当只使用一个值时,该值 ( n) 将被设置为类型的索引int。您需要做的是将行更改为:
for _, n := range g.nodes
这意味着您丢弃索引但将值放入n。
编辑
n 将是该值的副本,这意味着对 n 所做的任何更改都不会影响切片中的节点。要编辑切片中的节点,您实际上应该获取索引而不是值:
for i := range g.nodes {
g.nodes[i].value = 2
g.nodes[i].neigbours = nil
return
}
- 1 回答
- 0 关注
- 174 浏览
添加回答
举报
0/150
提交
取消