Go(Golang) - 从主线程和打印线程中定义goto

时间:2017-07-06 15:55:20

标签: multithreading go label goto recover

对不起我的英语。 我有两个关于go语言代码的问题。这是我的计划。 该程序控制“数据库”中昵称的存在。

package main

import "fmt"

func rcv(){
  if r := recover() ; r != nil {
    fmt.Println("retry.")
    main()  
  }
}
func main(){
defer rcv()
INSERT:
  fmt.Println("Insert a nickname: ")
  var s string
  fmt.Scanln(&s)
  switch { 
  case len(s) <= 0 : 
    fmt.Println(fmt.Errorf("error empty"))
    goto INSERT
  case s=="mark"||s=="andrea": 
    fmt.Println("Accept, the nickname is",s)
  default :
    fmt.Println("ATTENTION, nickname not found")
    panic("Error.")
  }
}

我的问题是:

  1. 使用recover函数(rcv()),在它结束时,调用main()会像另一个线程一样运行吗?主要的main()函数在执行第二个函数时结束,或者每当引发恐慌时,恢复函数会创建另一个进程吗? (例如:如果输入昵称错误5次,则启动5个主要功能,所以6个主要运行函数?)如果创建main()的多个执行,是否有办法打印线程/进程ID或类似的东西

  2. 我使用了INSERT标签和goto构造。我可以在main函数之外使用goto(例如:在rcv()函数的末尾返回到main函数的顶部)? 我可以使用goto而不是在rcv()的末尾调用main()函数

1 个答案:

答案 0 :(得分:0)

1。关于推迟

在退出范围之前延迟语句执行功能。因此在执行defer-func时会保留一堆caller-func。

jest-css-modules

它会因stackoverflow

而崩溃

2。关于goto

请参阅documentation

  

“goto”语句将控制转移到具有相同函数的相应标签的语句。

所以你不能在外面写func。

3。关于问题

  

如何返回main()函数的开头?

func foo() (err error) {
    defer func() {
        err = io.EOF
    }()
}