wtysos11 / blogWiki

Use to store public paper and organize them.
17 stars 4 forks source link

短路与的实际应用 #170

Closed wtysos11 closed 3 years ago

wtysos11 commented 3 years ago

短路与(或者短路或)是对逻辑运算代码优化的利用。比如对于逻辑与A&&B来说,因为只要出现一个False,其结果必定为False,所以A为False的时候计算会被直接短路,B中不会被计算。

类似的,逻辑或A||B时,如果A为真也会出现短路现象。只要做这个编译器没有什么特殊的目的,一般都会这样实现。

该操作在实际中是有意义的,可以省去对空指针或非法条件的判断。比如

func (p *Publisher) sendTopic(
    sub subscriber, topic topicFunc, v interface{}, wg *sync.WaitGroup){
    defer wg.Done()
    if topic!= nil && !topic(v){
        return
    }
    select{
        case sub <- v:
        case <- time.After(p.timeout):
    }
}

该函数是发布者-接受者模型中发布函数的实现,发布者将v interface{}信息发送给指定的接受者。这个指定是通过判断函数topic来实现的(具体实现是一个map),topic == nil表示对全体接受者发送,不然topic(v) == True的时候表示对该接受者发送。

整体的实现是通过将信息遍历给所有接受者来实现的。其逻辑就是:

  1. 对于所有的接受者和指定的信息v,调用sendTopic函数
  2. 对于每一个接收者,自行判断。如果不是指定的发送对象,就关闭
  3. 如果是,则在超时前接收信息。否则传递超时请求。

短路出现在对topic的判断部分。实际上该部分的逻辑按照正常人的思路应该写为!(topic == nil || topic(v)),但这样就需要对topic是否为空进行先置判断,反而会更加累赘。当然,注释要写清楚。