doufocheng6233 2013-09-24 09:33
浏览 18
已采纳

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

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

  • 写回答

1条回答 默认 最新

  • doujuanju3076 2013-09-24 09:42
    关注

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 如何将下列的“无限压缩存储器”设计出来
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口