2

呃,我正在尝试通过实现一个随机图来学习围棋。我在 n.value undefined(类型 int 没有字段或方法值)和 n.neigbours undefined(类型 int 没有字段或方法邻居)上收到错误。我无法理解编译错误,因为我在 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
}

func (g *graph) addEdge() {
    e := <-g.edges
    switch etype := g.edgeCheck(&e); etype {
    case "present":
        fallthrough
    case "self":
        fmt.Println("self")
        //go g.newEdge()
    case "empty":
        //g.nodes[e.source] = append(g.nodes[e.source], e.sink),
        //g.nodes[e.sink] = append(g.nodes[e.sink], e.source)
        fmt.Println("empty")
    default:
        fmt.Println("something went wrong")
    }
}

操场

4

1 回答 1

3

您的错误位于第 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
}
于 2013-09-24T09:42:31.823 回答