猿问

Switch case 语句落入默认值

我是新手,无法弄清楚为什么最后一个 case 子句(连接和测试)会变成默认值。但是带有换行符的那些(退出\r\n 和连接\r\n)不会


没有 fallthrough 语句。


我试过标记开关并调用 break [lbl] 但默认块仍然被执行


package main


import (

"fmt"

"strings"

"bufio"

"os"

)


func main() {


var cmd string

bio := bufio.NewReader(os.Stdin)

fmt.Println("Hello")


proceed := true


for 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)

}


ibeautiful
浏览 258回答 2
2回答

紫衣仙女

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 8080dont print anything else, dont fall through to default. There should be no reason why the default caluse is executed???Unrecognised command: 127.0.0.1Unrecognised command: 8080>> 的价值cmds,fmt.Printf("%q\n", cmds)是["test" "127.0.0.1" "8080\r\n"]。您的程序逻辑存在严重缺陷。

UYOU

尝试strings.Trim()像这样包装 switch 语句的主题:switch strings.TrimSpace(cmds[i]) {   // your cases}但总的来说,在这种情况下,内部 for 循环看起来是错误的构造。基于这段代码,您可能想要删除它,并且只将cmds数组的第一个元素作为switch 语句的主题
随时随地看视频慕课网APP

相关分类

Go
我要回答