英文:
How to append a function call to a golang struct?
问题
我有以下的Go代码,我想让接口正常工作:
https://play.golang.org/p/A29etweYN_
以提供以下输出:
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
我发现很难理解为什么被注释掉的这行代码
//OutputY: gateNor(InputA,InputB)
不起作用 - gateNor是一个我想调用并附加到Gate结构体的函数。
有没有更优雅的实现方式?
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\n",
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函数对于输入A=0和InputB=0返回字符串true,对于gate0(ID U0)结构体,以下输出是有效的:
Gate: Evaluation ID U0 NOR true 0 0
英文:
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\n",
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
答案1
得分: 3
例如,
gate0 := &Gate{
Id: "U0",
Funct: "NOR",
InputA: "0",
InputB: "0",
}
gate0.OutputY = gateNor(gate0.InputA, gate0.InputB)
或者,更加优雅的写法,
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
或者,更加优雅的写法,
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
英文:
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"))
}
答案2
得分: 1
你不能在对象初始化器中引用Gate的成员;你可以这样做:
inputA, inputB := "1", "1"
gate3 := &Gate{
Id: "U3",
Funct: "NOR",
InputA: inputA,
InputB: inputB,
OutputY: gateNor(inputA, inputB),
}
英文:
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),
}
答案3
得分: 1
也许不太优雅,但我更愿意定义一个方法来将函数调用附加到一个 Golang 结构体中:
type Gate struct {
Id string
Funct string
InputA string
InputB string
}
func (g Gate) OutputY() string {
return gateNor(g.InputA, g.InputB)
}
然后可以按需延迟地使用 g.OutputY()
。g.OutputY()
的语法与 g.OutputY
相比并没有更多的冗余,并且在进行复杂计算时,延迟计算可能很重要。此外,按需计算可以确保始终获得一致的 g.OutputY()
值。如果你改变了 g.InputA="1"
,那么你如何保持 g.Output
的另一种方式呢?
英文:
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"
?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论