如何获得 "sum" 个真布尔值

How to get "sum" of true bools

在这种情况下,我有 3 个布尔变量(已设置为 truefalse

此处的目标是确定是否有多个布尔变量设置为 true

现在我写了以下内容,它确实有效:

    boolval := 0
    if *firstbool {
        boolval++
    }
    if *secondbool {
        boolval++
    }
    if *thirdbool {
        boolval++
    }
    if boolval > 1 {
        // More than 1 of the bool vars are true
    }

如果我正在写连续的 if{} 语句,我总是会标记我的逻辑,所以我想我会问问你们这些天才如何完成这个。

identify if more than one of the set of bool vars are set to true


比如写一个set函数:

package main

import "fmt"

func nTrue(b ...bool) int {
    n := 0
    for _, v := range b {
        if v {
            n++
        }
    }
    return n
}

func main() {
    v1, v2, v3 := true, false, true

    fmt.Println(nTrue(v1, v2, v3))

    if nTrue(v1, v2, v3) > 1 {
        // . .   .
    }
    // Or
    if n := nTrue(v1, v2, v3); n > 1 {
        // . .   .
    }
    // Or
    n := nTrue(v1, v2, v3)
    if n > 1 {
        // . .   .
    }
}

游乐场:https://play.golang.org/p/g3WCN6BgGly

输出:

2

例如范围超过集合,

package main

import "fmt"

func main() {
    v1, v2, v3 := true, false, true

    boolval := 0
    for _, v := range []bool{v1, v2, v3} {
        if v {
            boolval++
        }
    }
    if boolval > 1 {
        // . .   .
    }

    fmt.Println(boolval > 1, boolval)
}

游乐场:https://play.golang.org/p/R6UGb8YYEFw

输出:

true 2

取决于您如何获取 firstbool 等的值。 al,您应该在这里采用更惯用的方法。考虑通道和 goroutines 可以在后台处理会计工作。如果你的布尔值是一些更重的操作的结果,那么做这样的事情可能是有意义的:

package main

import "fmt"

func firstFunc(ch chan bool) {
    // assume this works, true!
    ch <- true
}

func secondFunc(ch chan bool) {
    // assume this fails, false!
    ch <- false
}

func thirdFunc(ch chan bool) {
    // assume this works, true!
    ch <- true
}

func listener(ch chan bool, numCallers int) <-chan bool {
    outch := make(chan bool)
    THRESHOLD := 2
    go func(outch chan<- bool) {
        count := 0
        trues := 0

        for count < numCallers && trues < THRESHOLD {
            val := <-ch
            if val {
                trues++
            }
            count++
        }
        outch <- trues >= THRESHOLD
    }(outch)
    return outch
}

func main() {
    ch := make(chan bool)
    resultch := listener(ch, 3)

    go firstFunc(ch)
    go secondFunc(ch)
    go thirdFunc(ch)

    if <-resultch {
        fmt.Println("Two or more processes succeeded")
    }
}

然而,这是方式过度设计的简单需求,因此仅当此模式适合您的应用程序的较大设计时才考虑此模式。

也许我误会了什么,但这个问题看起来像是布尔代数的练习。

首先:让我们弄清楚"sum"是什么意思

The goal here is to identify if more than one of the set of bool vars are set to true

所以"sum"实际上意味着:"more than once or "两倍或更多

其二:我们直接写"More than Once"

func MoreThanOnce(a, b, c bool) bool {
    return ( 
        a&&(b||c)) || 
        (a||b)&&c ||        
        (a||c)&&b
}

第三:简化

func MoreThanOnce(a, b, c bool) bool { return a&&b || a&&c  || b&&c}

结果

一行,没有ifs,没有频道,没有指针。

这是想要的吗?

更新

来自@peterSO 评论:

In the example, there are three successive if statements. Perhaps there are four, or seven, or forty-two successive if statements. How would you sum those examples?

概括

func MoreThanOnce(vs...bool) (result bool){
    for i:=0; i<len(vs); i++{
      for j:=i+1; j<len(vs); j++{ 
        if i!=j{  // this `if` could be omitted
        result = result || vs[i] && vs[j]
        }
      }
    }
    return
}

这是问的吗?