为了账号安全,请及时绑定邮箱和手机立即绑定

Switch case 语句落入默认值

Switch case 语句落入默认值

Go
ibeautiful 2021-11-22 15:44:14
我是新手,无法弄清楚为什么最后一个 case 子句(连接和测试)会变成默认值。但是带有换行符的那些(退出\r\n 和连接\r\n)不会没有 fallthrough 语句。我试过标记开关并调用 break [lbl] 但默认块仍然被执行package mainimport ("fmt""strings""bufio""os")func main() {var cmd stringbio := bufio.NewReader(os.Stdin)fmt.Println("Hello")proceed := truefor proceed {    fmt.Print(">> ")    cmd, _ = bio.ReadString('\n')    cmds := strings.Split(cmd, " ")    for i := range cmds{        switch cmds[i]{            case "exit\r\n" :                proceed = false            case "connect\r\n":                fmt.Println("The connect command requires more input")            case "connect":                if i + 2 >= len(cmds) {                    fmt.Println("Connect command usage: connect host port")                } else {                    i++                    constring := cmds[i]                    i++                    port := cmds[i]                    con(constring, port)                    }                fmt.Println("dont print anything else, dont fall through to default. There should be no reason why the default caluse is executed???")            case "test":                fmt.Println("dont print anything else, dont fall through to default. There should be no reason why the default caluse is executed???")            default:                fmt.Println("Unrecognised command: " + cmds[i])        }     }}}func con (conStr, port string){panic (conStr)}
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

Go 编程语言规范

开关语句

“Switch”语句提供多路执行。表达式或类型说明符与内部的“case”进行比较

表情开关

在表达式 switch 中,对 switch 表达式求值,而不必为常量的 case 表达式从左到右和从上到下求值;第一个等于 switch 表达式的语句触发相关 case 语句的执行;其他情况被跳过。如果没有 case 匹配并且存在“默认” case,则执行其语句。最多可以有一个默认情况,它可能出现在“switch”语句中的任何地方。缺少 switch 表达式等效于布尔值 true。

ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .

ExprCaseClause = ExprSwitchCase ":" StatementList .

ExprSwitchCase = "case" ExpressionList | "default" .

最后一个switch case子句 ( "connect"and "test") 不属于default case子句。一break在一份声明中switch声明case条款打破了出来switch发言; 它不会脱离周围的 for子句。


您尚未向我们提供可重现的示例:如何创建最小、完整和可验证的示例。. 例如,您没有向我们展示您的输入和输出。


这是一个示例,它按预期工作。default执行该条款是有原因的。


>> test 127.0.0.1 8080

dont print anything else, dont fall through to default. There should be no reason why the default caluse is executed???

Unrecognised command: 127.0.0.1

Unrecognised command: 8080


>> 

的价值cmds,fmt.Printf("%q\n", cmds)是["test" "127.0.0.1" "8080\r\n"]。


您的程序逻辑存在严重缺陷。


查看完整回答
反对 回复 2021-11-22
?
UYOU

TA贡献1878条经验 获得超4个赞

尝试strings.Trim()像这样包装 switch 语句的主题:


switch strings.TrimSpace(cmds[i]) {

   // your cases

}

但总的来说,在这种情况下,内部 for 循环看起来是错误的构造。基于这段代码,您可能想要删除它,并且只将cmds数组的第一个元素作为switch 语句的主题


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信