2

ええと、ランダムグラフを実装して囲碁を学ぼうとしています。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
}

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 

スライスを反復するとき、値を 1 つだけ使用する場合、その値 ( 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 に答える