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