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

er, I am trying to learn go by implementing a random graph. I get an error on n.value undefined (type int has no field or method value), and n.neigbours undefined (type int has no field or method neigbours). I can not understand that compilation error as i create a new slice of nodesnr size of empty nodes in the g.nodes = make([]node, g.nodesnr). What is the problem?

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")
    }
}

Playground

Your error lies on line 47

for n := range g.nodes 

When iterating over a slice, when using only one value, that value (n) will be set to the index, which is of type int. What you need to do is to change the line to:

for _, n := range g.nodes 

This means that you discard the index but put the value in n instead.

Edit

n will be a copy of the value which means any changes made to n will not affect the node in the slice. To edit the node in the slice, you should actually get the index instead of the value:

for i := range g.nodes {
    g.nodes[i].value = 2
    g.nodes[i].neigbours = nil
    return
}