如何将函数调用附加到 Golang 结构体中?

huangapple go评论88阅读模式
英文:

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

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

答案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" ?

huangapple
  • 本文由 发表于 2017年4月25日 03:57:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/43596681.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定