Go语言switch语句报语法错误,如何从通道获取字符串变量?
解决Go中switch语句内通道接收的语法错误
你遇到的syntax error: unexpected :=, expecting :错误,是因为Go的语法规则不允许在switch的case条件表达式中直接使用短变量声明:=。case条件只能是可直接求值的表达式,不能包含变量声明操作。
修正方案一:将变量声明移到switch外部
先在switch块外声明变量,在case中使用赋值操作=接收通道值:
package main import ( "fmt" ) func main() { writeMsgs := make(chan string) go sendMsgs(writeMsgs) for { var msg string switch { case msg = <-writeMsgs: fmt.Println(msg) } } } func sendMsgs(writeMsgs chan string) { for i := 0; i < 5; i++ { writeMsgs <- "Test" } close(writeMsgs) }
修正方案二:使用带初始化语句的switch
在switch开头添加初始化语句,声明并接收通道值,然后基于固定条件进入case:
package main import ( "fmt" ) func main() { writeMsgs := make(chan string) go sendMsgs(writeMsgs) for { switch msg := <-writeMsgs; true { case true: fmt.Println(msg) } } } func sendMsgs(writeMsgs chan string) { for i := 0; i < 5; i++ { writeMsgs <- "Test" } close(writeMsgs) }
额外优化:处理通道关闭的情况
上述代码在通道关闭后会持续接收零值并打印,建议添加ok判断退出循环:
package main import ( "fmt" ) func main() { writeMsgs := make(chan string) go sendMsgs(writeMsgs) for { var msg string var ok bool switch { case msg, ok = <-writeMsgs: if !ok { fmt.Println("通道已关闭,退出循环") return } fmt.Println(msg) } } } func sendMsgs(writeMsgs chan string) { for i := 0; i < 5; i++ { writeMsgs <- "Test" } close(writeMsgs) }
内容的提问来源于stack exchange,提问作者Josh Jameson
相关产品推荐
相关产品推荐

