2014-01-27 67 views
3

我處於瞭解Go的界面的初期階段。我正在寫一些邏輯模擬和有類似下面的代碼(我嚴重簡化這裏):Golang - 通過接口獲取指向結構體字段的指針

請參閱我的問題的意見:

type LogicNode struct { 
    Input *bool 
    Output *bool 
    Operator string 
    Next  Node 
} 

func (n *LogicNode) Run() { 
    // do some stuff here 
    n.Next.Run() 
} 

type Node interface { 
    Run() 
} 

func main() { 

    nodes := make([]Node, 1000) 

    for i := 0; i < 1000; i++ { 
     n := LogicNode{ 
      //assign values etc. 
     } 
     nodes[i] = &n 
    } 

    for i, node := range nodes { 
     // I need to access LogicNode's Output pointer here, as a *bool. 
     // so I can set the same address to other Node's Input thereby "connecting" them. 
     // but I could only get something like this: 

     x := reflect.ValueOf(node).Elem().FieldByName("Output") 

     // which is <*bool Value> 
     // I couldn't find a way to set a new *bool to the underlying (LogicNode) Struct's Input or Output.. 
    } 
} 

我使用接口的原因是因爲有是具有不同字段的其他節點類型FloatNode MathNode等,但它們實現自己的運行方法。

我已經成功地使用Value的SetString或SetBool方法,但不能設置一個指針那裏...在此先感謝。

+2

爲什麼不直接將Node轉換爲LogicNode並直接訪問字段? – Arjan

+0

好的建議,那是另一個解決方案。如果種類相當多,領域也不那麼多,那就不是很明顯,哪個更好。 – Zoltan

回答

8

可以使用Set通用版本更新字段值:

package main 

import (
    "fmt" 
    "reflect" 
) 

type LogicNode struct { 
    Input *bool 
    Output *bool 
    Operator string 
    Next  Node 
} 

func (n *LogicNode) Run() { 
    // do some stuff here 
    // n.Next.Run() 
    fmt.Printf("LogicNode.Input = %v (%v)\n", *n.Input, n.Input) 
} 

type Node interface { 
    Run() 
} 

func main() { 
    input := false 
    input2 := true 
    fmt.Printf("Input1 = %v (%v)\n", input, &input) 
    fmt.Printf("Input2 = %v (%v)\n", input2, &input2) 
    var node Node = &LogicNode{Input: &input} // Remember, interfaces are pointers 
    node.Run() 
    x := reflect.ValueOf(node).Elem().FieldByName("Input") 
    x.Set(reflect.ValueOf(&input2)) 
    node.Run() 
} 

輸出:

Input1 = false (0x10500168) 
Input2 = true (0x10500170) 
LogicNode.Input = false (0x10500168) 
LogicNode.Input = true (0x10500170) 

遊樂場here

+0

純粹的快樂:) Muchas格拉西亞斯! – Zoltan