节点结构切片中的未定义属性

我正在尝试通过实现一个随机图来学习 go。我在 n.value undefined(int 类型没有字段或方法值)和 n.neigbours undefined(int 类型没有字段或方法 neigbours)上收到错误。我无法理解编译错误,因为我在 g.nodes = make([]node, g.nodesnr) 中创建了一个新的 nodenr 大小的空节点切片。问题是什么?


package main


import (

    "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

}


人到中年有点甜
浏览 175回答 1
1回答

收到一只叮咚

您的错误在于第 47 行for n := range g.nodes&nbsp;当迭代一个切片时,当只使用一个值时,该值 ( n) 将被设置为类型的索引int。您需要做的是将行更改为:for _, n := range g.nodes&nbsp;这意味着您丢弃索引但将值放入n。编辑n 将是该值的副本,这意味着对 n 所做的任何更改都不会影响切片中的节点。要编辑切片中的节点,您实际上应该获取索引而不是值:for i := range g.nodes {&nbsp; &nbsp; g.nodes[i].value = 2&nbsp; &nbsp; g.nodes[i].neigbours = nil&nbsp; &nbsp; return}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go