最近翻开源代码的时候看到了一种很有意思的switch用法,分享一下。
注意这里讨论的不是typed switch,也就是case语句后面是类型的那种。
直接看代码:
func (s *systemd) Status() (Status, error) {
exitCode, out, err := s.runWithOutput(\"systemctl\", \"is-active\", s.unitName())
if exitCode == 0 && err != nil {
return StatusUnknown, err
}
switch {
case strings.HasPrefix(out, \"active\"):
return StatusRunning, nil
case strings.HasPrefix(out, \"inactive\"):
// inactive can also mean its not installed, check unit files
exitCode, out, err := s.runWithOutput(\"systemctl\", \"list-unit-files\", \"-t\", \"service\", s.unitName())
if exitCode == 0 && err != nil {
return StatusUnknown, err
}
if strings.Contains(out, s.Name) {
// unit file exists, installed but not running
return StatusStopped, nil
}
// no unit file
return StatusUnknown, ErrNotInstalled
case strings.HasPrefix(out, \"activating\"):
return StatusRunning, nil
case strings.HasPrefix(out, \"failed\"):
return StatusUnknown, errors.New(\"service in failed state\")
default:
return StatusUnknown, ErrNotInstalled
}
}
你也可以在这找到它:代码链接
简单解释下这段代码在做什么:调用systemctl命令检查指定的服务的运行状态,具体做法是过滤systemctl的输出然后根据得到的字符串的前缀判断当前的运行状态。
有意思的在于这个switch,首先它后面没有任何表达式;其次在每个case后面都是个函数调用表达式,返回值都是bool类型的。
虽然看起来很怪异,但这段代码肯定没有语法问题,可以编译通过;也没有语义或者逻辑问题,因为人家用的好好的,这个项目接近4000个星星不是大家乱点的。
这里就不卖关子了,直接公布答案:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
扫码联系技术微信【备注:站媒体网】
客服QQ:137483024







