gpt4 book ai didi

Golang switch 语句只调用函数一次

转载 作者:IT王子 更新时间:2023-10-29 01:58:35 24 4
gpt4 key购买 nike

我在用 Go 编写程序时遇到了一个相当奇怪的错误。

本质上,我有一个 switch 语句,其中每个 case 都应该调用一个函数 setill 两次。但是当相关案例运行时,它只调用一次函数。

这是代码片段:

    check := true
n, e, s, w := b.North, b.East, b.South, b.West
switch {
// NE (>)
case n.Closed && e.Closed:
check = check && p.setIll(s)
check = check && p.setIll(w)
// NS (\\)
case n.Closed && s.Closed:
check = check && p.setIll(e)
check = check && p.setIll(w)
// NW (^)
case n.Closed && w.Closed:
check = check && p.setIll(e)
check = check && p.setIll(s)
// ES (v)
case e.Closed && s.Closed:
check = check && p.setIll(n)
check = check && p.setIll(w)
// EW (//)
case e.Closed && w.Closed:
fmt.Println("Running setIll the first time")
check = check && p.setIll(n)
fmt.Println("Running it again")
check = check && p.setIll(s)
fmt.Println("And now we're done running")
// SW (<)
case s.Closed && w.Closed:
check = check && p.setIll(n)
check = check && p.setIll(e)
}

这里是setIll:

func (p Player) setIll(n *Node) bool {
fmt.Println("I'm running!")
p.Illegal.Nodes[n.Loc.X][n.Loc.Y].Closed = true
return !p.Forced.Nodes[n.Loc.X][n.Loc.Y].Closed
}

这会产生以下输出:

Running setIll the first time
I'm running!
Running it again
And now we're done running

注意“我正在运行!”只在输出中出现一次。知道为什么会这样吗?

最佳答案

不是 switch 把你绊倒了,而是 && 的工作方式。

&&||short-circuiting运算符:如果左侧的结果足以确定答案,则它们根本不会执行右侧的内容。如果您的表达式是 a && f() 并且 afalse 则没有必要运行 f() 来看到最终结果也将是 false。 Go 规范给出的方式是 "The right operand is evaluated conditionally."

这在很多语言中都很常见。当您的第一次检查必须通过才能运行其他检查时,这很有帮助。例如,假设您想检查 Web 应用程序中的用户权限,但前提是用户完全登录 (user != nil):user != nil && user.HasPermission (requiredPerm) 做你需要的。

如果你想像现在一样设置 check var,但是 setIll 总是调用两次,你可以分配 setIll 结果到任何 && 表达式之外的变量:

ck1, ck2 := p.setIll(n), p.setIll(s)
check = check && ck1 && ck2

关于Golang switch 语句只调用函数一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39262903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com