【问题标题】:undefined attributes in an slice of node structs节点结构切片中的未定义属性
【发布时间】:2013-09-24 09:33:10
【问题描述】:

er,我正在尝试通过实现随机图来学习围棋。我在 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")
    }
}

Playground

【问题讨论】:

    标签: go


    【解决方案1】:

    您的错误位于第 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
    }
    

    【讨论】:

    • 有没有办法让n修改节点数组属性?
    • 是的,但是您应该获得索引:for i := range g.nodes { g.nodes[i].node = 42 } 我错过了您想更改值的错误。我编辑了答案。
    猜你喜欢
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2023-03-18
    • 2018-04-17
    • 2020-06-27
    相关资源
    最近更新 更多