如何将函数调用附加到golang结构?

I have the following go code which I was wanting get interfaces working:

https://play.golang.org/p/A29etweYN_

to provide the following output:

Gate: Evaluation ID U0 NOR true 0 0
Gate: Evaluation ID U1 NOR false 0 1
Gate: Evaluation ID U2 NOR false 1 0
Gate: Evaluation ID U3 NOR false 1 1

I am finding it difficult to understand why the commented out line

//OutputY: gateNor(InputA,InputB) 

does not work - gateNor is a function which I want to call and append to the Gate struct

What would be a more elegant way to implement this?

type Gate struct {
   Id      string
   Funct   string
   InputA  string
   InputB  string
   OutputY string
}

func (g *Gate) Notify() error {
    fmt.Printf("Gate: Evaluation ID %s %s %s %s %s
",
        g.Id,
        g.Funct,
        g.OutputY,
        g.InputA,
        g.InputB,
    )
    return nil
}

gate0 := &Gate{
    Id:      "U0",
    Funct:   "NOR",
    InputA:  "0",
    InputB:  "0",
    OutputY: gateNor("0", "0"),
    //OutputY: gateNor(InputA,InputB),
}

gateNor returns the string true for input A=0 and InputB = 0, for the gate0 (ID U0) struct following output is working:

Gate: Evaluation ID U0 NOR true 0 0

You can't refer to the members of Gate within the object-initializer; you could do something like:

inputA, inputB := "1", "1"
gate3 := &Gate{
    Id:      "U3",
    Funct:   "NOR",
    InputA:  inputA,
    InputB:  inputB,
    OutputY: gateNor(inputA,inputB),
}

For example,

gate0 := &Gate{
    Id:     "U0",
    Funct:  "NOR",
    InputA: "0",
    InputB: "0",
}
gate0.OutputY = gateNor(gate0.InputA, gate0.InputB)

Or, more elegantly,

func NewNORGate(id, a, b string) *Gate {
    gate := &Gate{
        Id:     id,
        Funct:  "NOR",
        InputA: a,
        InputB: b,
    }
    gate.OutputY = gateNor(gate.InputA, gate.InputB)
    return gate
}

func main() {
    gate0 := NewNORGate("U0", "0", "0")
    gate1 := NewNORGate("U1", "0", "1")
    gate2 := NewNORGate("U2", "1", "0")
    gate3 := NewNORGate("U3", "1", "1")

    GetEvaluation(gate0)
    GetEvaluation(gate1)
    GetEvaluation(gate2)
    GetEvaluation(gate3)
}

https://play.golang.org/p/WC-jlV-jqd

Or, most elegantly,

func NewNORGate(id, a, b string) *Gate {
    gate := &Gate{
        Id:     id,
        Funct:  "NOR",
        InputA: a,
        InputB: b,
    }
    gate.OutputY = gateNor(gate.InputA, gate.InputB)
    return gate
}

func main() {
    GetEvaluation(NewNORGate("U0", "0", "0"))
    GetEvaluation(NewNORGate("U1", "0", "1"))
    GetEvaluation(NewNORGate("U2", "1", "0"))
    GetEvaluation(NewNORGate("U3", "1", "1"))
}

https://play.golang.org/p/TOPuwSJ-xe

Maybe not too elegant, but I'd rather define a method

to append a function call to a golang struct

type Gate struct {
   Id      string
   Funct   string
   InputA  string
   InputB  string
}
func (g Gate) OutputY()string{
   return gateNor(g.InputA, g.InputB)
}

and have

g.OutputY()

lazily on demand. g.OutputY() not much more verbose then g.OutputY and laziness can matter in case of hard computation. Also on demand you get consistent value of g.OutputY(). How another way you assume maintain g.Output after changing say g.InputA="1" ?