2017-07-06 21 views
0

我很抱歉我的英语。 我有两个关于go语言代码的问题。这是我的程序。 该程序控制“数据库”中昵称的存在。Go(Golang) - 转到主要和打印主题goto的定义

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. 使用恢复功能(RCV()),在它的结束,召回的main()函数运行像另一个线程发送?主体main()函数在执行第二个函数或每当引发恐慌时结束,recover函数创建另一个进程? (例如:如果输入的昵称错误5次,则会启动5个主要函数,所以6个主要运行函数?)如果创建多次执行main(),是否有方法来打印线程/进程ID或类似的东西?

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

+0

您是否尝试过?从规范“标签的范围是它声明的函数的主体,并排除任何嵌套函数的主体”。 – JimB

+0

我已经尝试在rcv()函数中插入goto INSERT,但是说我没有声明标签。 – mx88

+0

是的,所以没有回答这个问题?我不明白问题1,你没有创建任何新的进程或线程,甚至没有goroutines。虽然我会推荐构造这个表单的另一个函数,就像调用main()一样,这个函数很少引起混淆,因为你为什么要这么做。 – JimB

回答

0

1.关于推迟

defer语句执行函数退出作用范围之前。所以执行defer-func时,堆栈的调用者函数是剩余的。

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

它将与stackoverflow

2.关于转到崩溃

documentation

A “转到” 语句将控制权交给声明具有相同功能的内对应的标签。

所以你不能在外面的func标签。

3.关于问题

我怎么回main()函数的开始?

package main 

func Main() { 
    // do your main 
} 

func main() { 
    for { 
     Main() 
    } 
} 
+0

正如我所想的那样,延迟函数是main()函数的一部分,所以main()函数的额外调用不会结束前一个函数。 这个程序做我期望的,但我有这些怀疑。我如何回到main()函数的开头?我是否应该强迫它停止或创建其他功能并对其进行更好的管理? – mx88

+0

只要让主要做你的主要部分像上面一样。并使其循环。 – mattn